«Такой хост не известен» при локальной публикации, но не при отладке в Visual Studio - PullRequest
0 голосов
/ 21 апреля 2020

Похожие: Такой хост не известен -> Система. Net .Http.HttpRequestException:

Итак, у меня возникает странная проблема: всякий раз, когда я выполняю любой вызов RESTful Используя API HttpClient, я получаю следующую ошибку: System.Net.Http.HttpRequestException: No such host is known

Я видел несколько других вопросов и ответов, которые обсуждают это, но многие из них (например, тот, на который я ссылаюсь) обсуждают это конкретно в контекст Azure VM. Многие из них предполагают, что это вызвано проблемой DNS.

Моя ситуация немного отличается от других вопросов и ответов, которые я прочитал, хотя: когда я запускаю свой веб-сайт путем отладки в Visual Studio 2019, он запускается просто хорошо. Однако, когда я публикую sh в IIS локально, я получаю это исключение всякий раз, когда пытаюсь сделать вызов HttpClient.

Кроме того, в отличие от некоторых других статей, которые я читал об этом, эта для меня это не происходит периодически - это происходит каждый раз, когда я пытаюсь выполнить вызов API.

Если это вызвано проблемой DNS, как некоторые другие вопросы и ответы, это предполагает, что должна быть некоторая разница между тем, когда я публикую sh локально и когда я отлаживаю в Visual Studio.

Вот как я настраиваю свой Publi sh (сводка изображения ниже для тех, кто предпочитает текст): enter image description here

Сводка изображения:

  • Веб-развертывание с WebPublishMethod MSDeploy
  • TargetFramework netcoreapp3.1
  • Выпуск LastUsedBuildConfiguration
  • LastUsedPlatform x86
  • SelfContained false
  • MSDeployPublishMethod InPro c
  • MSDeployServiceURL localhost

Дополнительные сведения: - URL назначения http://localhost: 80 - Пул приложений IIS установлен на «Нет управляемого кода», как обычно предлагается

Кроме того, это происходит независимо от того, как я создаю экземпляр HttpClient, и код работает нормально, когда отладка, так что я думаю, что это скорее проблема конфигурации, чем проблема кода, но для этого я использую следующий код в своем классе Startup для его создания. (См. Также здесь для справки.)

       services.AddHttpClient("MyNamedClient", (sp, c) =>
        {
            c.BaseAddress = new Uri("https://api.smartrecruiters.com/");

            c.Timeout = new TimeSpan(4, 0, 0);

            c.DefaultRequestHeaders.Accept.Clear();

            c.DefaultRequestHeaders.Add("Accept", "application/json");

            var ctx = sp.GetService<DatabaseContext>();

            Security security = ctx.Security.First();

            c.DefaultRequestHeaders.Add("APIToken", security.Apikey);
        });

Затем я использую ASP. NET Внедрение зависимостей Core для получения экземпляра HttpClient всякий раз, когда он мне нужен.

Я также пытался создать HttpClient как синглтон (я знаю, что не рекомендуемый способ сделать это в ASP. NET Core приложении), но у меня было то же самое проблема с этим подходом.

Вот полная информация об ошибке из Event Viewer, когда я пытаюсь сделать GetAsync вызов с использованием HttpClient:

Category: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware
EventId: 1
RequestId: 8000000c-0006-ff00-b63f-84710c7967bb
RequestPath: /UsersObject/GetUsersAPICall
SpanId: |f32bc4b9-41d453941179fa9f.
TraceId: f32bc4b9-41d453941179fa9f
ParentId: 

An unhandled exception has occurred while executing the request.

Exception: 
System.Net.Http.HttpRequestException: No such host is known.
 ---> System.Net.Sockets.SocketException (11001): No such host is known.
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   at [Namespace].MyHttpClient.GetAsyncWithRetries(HttpClient client, String url) in C:\Users\[Removed]\source\repos\[Removed]\MyhHttpClient.cs:line 54
   at SR_Interaction.Models.SRUser.Search(String emailAddress, HttpClient client) in C:\Users\[Removed]\Models\SRUser.cs:line 100
   at Bosch_Live_Docs.Controllers.UsersObjectController.GetUsersAPICall(String query) in C:\Users\[Removed]\Controllers\UsersObjectController.cs:line 58
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)

У любого есть какие-либо предложения о том, как Я мог бы это исправить? Я думаю, что это, вероятно, либо моя конфигурация IIS, либо мои публичные sh настройки - или я здесь совершенно не на том пути?

Редактировать: По запросу, вот код контроллера:

    [HttpGet]
    [Authorize(Roles = "CreateUser,PatchUser")]
    public async Task<IActionResult> GetUsersAPICall([Bind("query")] [RegularExpression(@"^\w+(\.\w+)*@\w+(\.\w+)+|(\w+(\s\w+)*)$", ErrorMessage = "This does not look like a valid query")] string query)
    {
        if (query == null)
        {
            return BadRequest();
        }
        else if (!ModelState.IsValid)
        {
            // TODO: What to do with this? How do we actually show the validation error?
            return BadRequest("Does not look like a valid query");
        }

        List<SRUser> users = await SRUser.Search(query, clientFactory.CreateClient(Startup.srNamedClient));

        users = users.OrderBy(ur => ur.firstName).ToList();

        if (users.Any())
        {
            return PartialView("_UserList", users);
        }
        else
        {
            return NotFound();
        }
    }

И вот где я делаю фактический вызов:

public static async Task<List<SRUser>> Search(string emailAddress, HttpClient client)
    {
        string json;

        using (HttpResponseMessage msg = await client.GetAsync("user-api/v201804/users?limit=100&q=" + emailAddress))
        {
            json = await msg.Content.ReadAsStringAsync();
        }

        return JsonSerializer.Deserialize<NextPageContainer<SRUser>>(json).content;
    }

Дальнейшее редактирование:

Вот пул приложений:

enter image description here

Вот модули, которые я установил:

enter image description here

Я немного запутался об этом конкретном:

enter image description here

Нужно ли включать оба? Когда я смотрю на упорядоченный вид, «старый» на самом деле выше: enter image description here

Однако я не могу изменить его порядок.

Являются ли эти проблемы

...