Похожие: Такой хост не известен -> Система. 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 (сводка изображения ниже для тех, кто предпочитает текст):
Сводка изображения:
- Веб-развертывание с 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;
}
Дальнейшее редактирование:
Вот пул приложений:
Вот модули, которые я установил:
Я немного запутался об этом конкретном:
Нужно ли включать оба? Когда я смотрю на упорядоченный вид, «старый» на самом деле выше:
Однако я не могу изменить его порядок.
Являются ли эти проблемы