首页 > 解决方案 > 在本地发布时“没有这样的主机是已知的”,但在 Visual Studio 中调试时不知道

问题描述

相关:没有这样的主机是已知的-> System.Net.Http.HttpRequestException:

所以,我有一个奇怪的问题:每当我使用 对 RESTful API 执行任何调用时HttpClient,都会收到以下错误:System.Net.Http.HttpRequestException: No such host is known

我看过其他几个讨论这个问题的问答,但其中许多(例如我链接到的那个)专门在 Azure VM 的上下文中讨论它。他们中的许多人认为这是由 DNS 问题引起的。

不过,我的情况与我读过的其他问答略有不同:当我通过在 Visual Studio 2019 中调试来运行我的网站时,它运行得很好。但是,当我在本地发布到 IIS 时,每当我尝试调用HttpClient.

此外,与我读过的其他一些文章不同,这对我来说并不是间歇性发生的——每次我尝试进行 API 调用时都会发生这种情况。

如果这是由其他一些问答所建议的 DNS 问题引起的,则表明我在本地发布和在 Visual Studio 中进行调试之间肯定存在一些差异。

这是我配置我的发布的方式(下面的图片摘要,适合喜欢文字的人): 在此处输入图像描述

图片摘要:

其他详细信息: - 目标 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 应用程序中执行此操作的推荐方法),但我在使用该方法时遇到了同样的问题。

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 配置或我的发布设置 - 还是我完全走错了路?

编辑:根据要求,这是控制器代码:

    [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;
    }

进一步编辑:

这是应用程序池:

在此处输入图像描述

以下是我安装的模块:

在此处输入图像描述

我对这个特定的有点困惑:

在此处输入图像描述

有必要两者都包括吗?当我查看 Ordered 视图时,“旧”视图实际上更高: 在此处输入图像描述

但是,我无法重新排序。

有这些问题吗?

甚至进一步编辑:对于本地发布的版本,我发现当我的App Pool在内置帐户(例如ApplicationPoolIdentity)下运行时会出现此问题。但是,当我使用特定的用户帐户时,它是固定的。但是,这在服务器上不起作用。

标签: c#asp.net-coreasp.net-core-mvcdotnet-httpclientasp.net-core-3.1

解决方案


事实证明,请求被公司防火墙阻止。服务器位于两个防火墙后面,这就是为什么更改服务器的入站或出站规则对我没有帮助(因为另一个防火墙只是阻止了呼叫)。

为了解决这个问题,我需要使用代理服务器。我在相应的文档中查找了服务器的完全限定名称。在我的Startup.cs中,我添加了以下逻辑:

services.AddHttpClient("MyName", c =>
        {
            c.BaseAddress = new Uri("[Vendor API url]");

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

            c.DefaultRequestHeaders.Accept.Clear();

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

            c.DefaultRequestHeaders.Add("ApiToken", RetrieveApiKey());
        })
            .ConfigurePrimaryHttpMessageHandler(() =>
            {
                return new HttpClientHandler()
                {
                    AllowAutoRedirect = true,
                    SslProtocols = SslProtocols.Tls13,
                    UseProxy = true,
                    Proxy = new WebProxy("ProxyServerName", 8080)
                    {
                        // The proxy server allows NTLM and Kerberos authentication
                        UseDefaultCredentials = true
                    }
                };
            });

推荐阅读