Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
dima19972525
2 / 2 / 1
Регистрация: 26.04.2016
Сообщений: 68
1

HttpClient не видит Web api приложение

28.01.2018, 02:01. Просмотров 1054. Ответов 7
Метки нет (Все метки)

Здравствуйте, я только начал учить mvc\web api. Есть mvc\web api приложение, в web api имеется действие:
C#
1
2
3
4
5
6
7
8
9
10
11
12
// GET api/values
        public IEnumerable<string[]> Get()
        {
            List<string[]> list = new List<string[]>();
            list.Add(new string[] { "1", "Bellarus", "Minsk" });
            list.Add(new string[] { "2", "Russia", "Moscow" });
            list.Add(new string[] { "3", "France", "Pariz" });
            list.Add(new string[] { "4", "England", "London" });
            list.Add(new string[] { "5", "Afghanistan", "Kabul" });
 
            return list;
        }
Мне нужно получить json файл, этого действия, делаю так (Это отдельное приложение):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using (HttpClient client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
 
                HttpResponseMessage response = await client.GetAsync("http://localhost:52796/api/values");
                if (response.IsSuccessStatusCode)
                {
                    string s = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(s);
                }
                else
                {
                    Console.WriteLine("Internal server Error");
                }
            }
Но это не работает, response.IsSuccessStatusCode возвращает false, хотя если поменять запрос на http://google.com все работает.

P.S. Само это приложение я собираю отдельно в debug версии и потом как только запускаю моё MVC приложение я запускаю exe-шник (Я рассказал это, т.к. это, возможно на что-то влияет).

Добавлено через 7 минут
Возможно, полный код моего приложения поможет:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Program
    {
        static void Main(string[] args)
        {
            GetRequest();
        }
 
        async static void GetRequest()
        {
            using (HttpClient client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
 
                HttpResponseMessage response = await client.GetAsync("http://localhost:52796/api/values");
                if (response.IsSuccessStatusCode)
                {
                    string s = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(s);
                }
                else
                {
                    Console.WriteLine("Internal server Error");
                }
            }
        }
    }
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2018, 02:01
Ответы с готовыми решениями:

Instagram API: постинг в инстаграм через Web-приложение
Как сделать постинг в инстаграм через ВЕБ приложение. (по стандарту АПИ инстаграма не дает такой...

2 сервиса (WCF Web API и ASP.NET Web API) на одном хосте
Есть БД с юзерами Есть консольное приложение (OWIN selfhost) с контроллером ImportController :...

Как создать новый web-сайт или web-приложение (нет шаблона)
Здравствуйте! Установил Visual C# 2010 Express. При нажатии на кнопку меню &quot;Файл&quot; не вижу...

Выбор решения для проекта! Приложение для Windows + приложение для Android или Web приложение?
Здравствуйте! Один мой знакомый, владелец мебельной фирмы, обратился ко мне с серьезным...

Web приложение, web-service
Люди умные, добрые. Срочно нужна помощь. В общем, представьте , что вам надо по курсовой...

7
sau
2133 / 1707 / 292
Регистрация: 22.07.2011
Сообщений: 6,482
Завершенные тесты: 1
28.01.2018, 12:06 2
http://localhost:52796/api/values
- неверный маршрут ? , контроллер как называется и маршрутизация как настроена ?.
а вообще , вот https://msdn.microsoft.com/ru-ru/library/y740d9d3.aspx

П.С В представленных фрагментах кода нет ничего , что указывало бы на возможную причину ошибки.
0
dima19972525
2 / 2 / 1
Регистрация: 26.04.2016
Сообщений: 68
28.01.2018, 12:12  [ТС] 3
Маршрут верный. Проверял также через Postman - все работает (возвращает json).
Маршрутизация:
C#
1
2
3
4
5
6
7
config.MapHttpAttributeRoutes();
 
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
Контроллер:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string[]> Get()
        {
            List<string[]> list = new List<string[]>();
            list.Add(new string[] { "1", "Bellarus", "Minsk" });
            list.Add(new string[] { "2", "Russia", "Moscow" });
            list.Add(new string[] { "3", "France", "Pariz" });
            list.Add(new string[] { "4", "England", "London" });
            list.Add(new string[] { "5", "Afghanistan", "Kabul" });
 
            return list;
        }
 
 
    }
Также, я пробовал задавать другие маршруты к моему приложению, но все не работает.
0
sau
2133 / 1707 / 292
Регистрация: 22.07.2011
Сообщений: 6,482
Завершенные тесты: 1
28.01.2018, 12:18 4
Из ваших слов получается , что на сервере ошибок нет.
Однако , клиент при обращении к серверу получает все же серверную ошибку , как то не сходится.
0
28.01.2018, 12:18
dima19972525
2 / 2 / 1
Регистрация: 26.04.2016
Сообщений: 68
28.01.2018, 12:22  [ТС] 5
Изменил немного код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
async static void GetRequest()
        {
            using (HttpClient client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
 
                HttpResponseMessage response = await client.GetAsync("http://localhost:52796/api/values");
 
                string s = await response.Content.ReadAsStringAsync();
                Console.WriteLine(s);
 
 
            }
        }
Возращает html текст, где можно заметить:
HTML5
1
2
<h3>HTTP Error 401.2 - Unauthorized</h3>
  <h4>Вы не имеете права просматривать эту страницу из-за недопустимости заголовков проверки подлинности.</h4>
К классу контроллера Web Api, был установлен атрибут [Authorize], закоментил его, но это также не помогло.
В фильтрах также ничего не указано:
C#
1
2
3
4
 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
0
sau
2133 / 1707 / 292
Регистрация: 22.07.2011
Сообщений: 6,482
Завершенные тесты: 1
28.01.2018, 12:24 6
Ну вот видите , сколько неожиданных фактов всплывает , будем дальше гадать , что еще у Вас там прописано/настроено ?
0
dima19972525
2 / 2 / 1
Регистрация: 26.04.2016
Сообщений: 68
28.01.2018, 12:59  [ТС] 7
Ну давайте тогда по порядку, мой контроллер выглядит так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//[Authorize]
    public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string[]> Get()
        {
            List<string[]> list = new List<string[]>();
            list.Add(new string[] { "1", "Bellarus", "Minsk" });
            list.Add(new string[] { "2", "Russia", "Moscow" });
            list.Add(new string[] { "3", "France", "Pariz" });
            list.Add(new string[] { "4", "England", "London" });
            list.Add(new string[] { "5", "Afghanistan", "Kabul" });
 
            return list;
        }
    }
Код других контроллер думаю нет смысла показывать, т.к. они обычные дефолтные (как homecontroller).
И еще раз настройки маршрутизации (они также дефолтные по умолчанию, но на всякий случай я их прикреплю):
Для Web Api:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Конфигурация и службы веб-API
 
            // Маршруты веб-API
            config.MapHttpAttributeRoutes();
 
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
И для обычный(я не знаю, как он называется, тот который в файле RouteConfig):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
Фильтры я прикреплял предыдущим сообщением.
Ну и Global.asax:
C#
1
2
3
4
5
6
7
8
9
10
11
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
И ещё раз как я делаю: я создал отдельное консольное приложение:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Program
    {
        static void Main(string[] args)
        {
            GetRequest();
            Console.ReadKey();
        }
 
        async static void GetRequest()
        {
            using (HttpClient client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
 
                HttpResponseMessage response = await client.GetAsync("http://localhost:52796/api/values");
                string s = await response.Content.ReadAsStringAsync();
                Console.WriteLine(s);
 
            }
        }
    }
Оно также находится в одном решении с моим mvc приложением. Далее я собрал его в debug, и после того, как я запускаю мое mvc приложение, я в папке bin->debug запускаю exe файл.

Добавлено через 10 минут
Создал отдельное консольное приложение, туда впихнул мой код. И все-равно таже ошибка 401.2 - Unauthorized.
Попробовал также обратится к другому mvc приложению - все работает.
Вот ещё мой web.config:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?xml version="1.0" encoding="utf-8"?>
<!--
  Дополнительные сведения о настройке приложения ASP.NET см. на странице
  https://go.microsoft.com/fwlink/?LinkId=301879.
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="CountryContext" connectionString="Server=127.0.0.1;User Id=postgres;Password=postgres;Port=5432;Database=geo;"
      providerName="Npgsql" />
    <add name="FinalContext" connectionString="Data Source=(localdb)\MSSQLLocalDB; Initial Catalog=FinalContext-20180126231737; Integrated Security=True; MultipleActiveResultSets=True; AttachDbFilename=|DataDirectory|FinalContext-20180126231737.mdf"
      providerName="System.Data.SqlClient" />
  </connectionStrings>
  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1" />
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
    </httpModules>
  </system.web>
  <system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <validation validateIntegratedModeConfiguration="false" />
    <modules>
      <remove name="ApplicationInsightsWebTracking" />
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
    </modules>
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
  <entityFramework>
    <!--
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>-->
    <defaultConnectionFactory type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <add name="Npgsql Data Provider" invariant="Npgsql"
        support="FF" description=".Net Framework Data Provider for Postgresql"
        type="Npgsql.NpgsqlFactory, Npgsql" />
    </DbProviderFactories>
  </system.data>
</configuration>
Добавлено через 5 минут
Наверное дошло - при создании проекта я выбрал windows авторизация. Сейчас погуглю насчет этого.

Добавлено через 10 минут
Да, нужно было использовать WebClient. Изменил код на этот, и получил свой json:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Program
    {
        static void Main(string[] args)
        {
            using (var client = new WebClient { UseDefaultCredentials = true })
            {
                client.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");
                string s = client.DownloadString("http://localhost:52796/api/values");
                Console.WriteLine(s);
            }
            Console.ReadKey();
        }
 
    }
Всем спасибо.
0
sau
2133 / 1707 / 292
Регистрация: 22.07.2011
Сообщений: 6,482
Завершенные тесты: 1
28.01.2018, 13:04 8
Лучший ответ Сообщение было отмечено dima19972525 как решение

Решение

C#
1
2
3
4
using (HttpClient client = new HttpClient(new HttpClientHandler { Credentials = System.Net.CredentialCache.DefaultCredentials}))
{
...
}
1
28.01.2018, 13:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2018, 13:04

Web api, out of memory
Добрый день. Имеется вот такой код public class FileHelper { public static string...

Web API Errors
Каким образом можно сделать &quot;собствение&quot; ошибки ( например вместо 404 написать Предмет не найден)...

Controller vs web api
Грамотность программирования.если идет много обращений через ajax к контроллеру(во многих местах...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru