C# &引用;没有已知的此类主机”;在本地发布时,而不是在Visual Studio中调试时

C# &引用;没有已知的此类主机”;在本地发布时,而不是在Visual Studio中调试时,c#,asp.net-core,asp.net-core-mvc,dotnet-httpclient,asp.net-core-3.1,C#,Asp.net Core,Asp.net Core Mvc,Dotnet Httpclient,Asp.net Core 3.1,相关的: 因此,我有一个奇怪的问题:每当我使用HttpClient执行任何对RESTful API的调用时,我都会收到以下错误:System.Net.Http.HttpRequestException:没有已知的主机 我见过其他几个Q&A讨论这一点,但其中许多(比如我链接到的那个)都是在Azure VM的上下文中专门讨论这一点的。许多人认为这是由DNS问题引起的 不过,我的情况与我读到的其他问题略有不同:当我在VisualStudio2019中通过调试运行我的网站时,它运行得很好。但是,当我在本

相关的:

因此,我有一个奇怪的问题:每当我使用
HttpClient
执行任何对RESTful API的调用时,我都会收到以下错误:
System.Net.Http.HttpRequestException:没有已知的主机

我见过其他几个Q&A讨论这一点,但其中许多(比如我链接到的那个)都是在Azure VM的上下文中专门讨论这一点的。许多人认为这是由DNS问题引起的

不过,我的情况与我读到的其他问题略有不同:当我在VisualStudio2019中通过调试运行我的网站时,它运行得很好。但是,当我在本地发布到IIS时,每当我尝试调用
HttpClient
时,就会出现此异常

另外,与我读过的其他一些文章不同,这并不是间歇性地发生在我身上——每次我尝试进行API调用时都会发生

如果这是由DNS问题引起的,就像其他一些Q&a建议的那样,这表明我在本地发布和在VisualStudio中调试之间肯定存在一些差异

以下是我如何配置我的发布(下面的图片摘要供那些喜欢文本的人使用):

图像摘要:

  • 使用WebPublishMethod MSDeploy进行Web部署
  • TargetFramework netcoreapp3.1
  • LastUsedBuildConfiguration发行版
  • LastUsedPlatform x86
  • 自足假
  • MSDeployPublishMethod InProc
  • MSDeployServiceURL本地主机
其他详情: -目标URL -IIS应用程序池设置为“无托管代码”,这通常是建议的

此外,无论我如何创建
HttpClient
实例,这种情况都会发生,并且调试时代码工作正常,因此我认为这更可能是一个配置问题,而不是代码问题,但值得一提的是,我在
Startup
类中使用以下代码来创建它。(另见参考资料)

有人对我如何解决这个问题有什么建议吗?我想这可能是我的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();
        }
    }
[HttpGet]
[授权(Roles=“CreateUser,PatchUser”)]
公共异步任务GetUsersAPICall([Bind(“query”)][RegularExpression(@“^\w+(\.\w+)*@\w+(\.\w+)+\124;(\ w+(\s\w+)*)$”,ErrorMessage=“这看起来不是有效的查询”)]字符串查询)
{
if(查询==null)
{
返回请求();
}
如果(!ModelState.IsValid),则为else
{
//TODO:该怎么办?我们实际上如何显示验证错误?
return BadRequest(“看起来不是有效的查询”);
}
List users=wait SRUser.Search(query,clientFactory.CreateClient(Startup.srNamedClient));
users=users.OrderBy(ur=>ur.firstName.ToList();
if(users.Any())
{
返回PartialView(“\u UserList”,users);
}
其他的
{
返回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;
    }
公共静态异步任务搜索(字符串emailAddress,HttpClient)
{
字符串json;
使用(HttpResponseMessage msg=await client.GetAsync(“用户api/v201804/users?limit=100&q=“+emailAddress))
{
json=await msg.Content.ReadAsStringAsync();
}
返回JsonSerializer.Deserialize(json).content;
}
进一步编辑:

以下是应用程序池:

以下是我安装的模块:

我对这一点有点困惑:

是否有必要将两者都包括在内?当我看有序视图时,“旧”视图实际上更高:

但是,我不能重新排序

这些都是问题吗


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

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

为了解决这个问题,我需要使用代理服务器。我在适当的文档中查找了服务器的完全限定名。在我的
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
                    }
                };
            });

发布完整代码,你在哪里打电话?请求如何?什么标题?您的控制器如何?您的网站在发布后是否工作?您的意思是,当您从另一个客户端(例如Postman)调用服务时,您得到了有效的响应,并且您是否已将iis网站url添加到windows主机文件中?@Aspram我可以从多个客户端调用API-我有一个WPF应用程序和一个控制台应用程序(都是标准的.NET,但两种情况下的代码非常相似)我用来定期调用终结点的。我还可以在Visual Studio中调试来运行网站时调用它。不幸的是,当我发布到IIS并以这种方式运行它时,我会遇到问题中提到的错误。另外,请确保也启用了IIS日志,以便您可以看到来自IIS的每个请求的实际情况日志文件-
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;
    }
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
                    }
                };
            });