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本地主机
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
}
};
});