我添加了行.UseUrls("http://*:5000")
以启用访问网络API的其他主机的客户端。
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseUrls("http://*:5000") // Added
.Build();
host.Run();
}
但是,使用浏览器访问localhost:5000/api/Test
会出现HTTP/1.1 400 Bad Request
的错误? .UseUrls()
是否应仅为生产编译?
HTTP/1.1 400 Bad Request Date: Mon, 08 Aug 2016 21:42:30 GMT Content-Length: 0 Server: Kestrel
测试时,从Visual Studio输出窗口复制以下消息。
Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求启动HTTP / 1.1 GET http://localhost:5000/api/Test
Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware:错误:'MS-ASPNETCORE-TOKEN'与预期的配对令牌'9bca37f2-7eda-4517-9f8f-60b6cc05cf01'不匹配,请求被拒绝。
Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求在8.5976ms完成400
答案 0 :(得分:9)
您应首先拨打.UseUrls()
和/或.UseConfig()
,然后再拨打.UseIISIntegration()
。
在IIS / IISExpress下运行正常时,最终会有2个进程。 IIS在另一个端口上侦听所需的端口和Kestrel。您的请求应该转到IIS,然后转发给Kestrel(使用MS-ASPNETCORE-TOKEN
)。
对.UseIISIntegration()
的调用隐藏了此映射。它实际上会更改您应用中的端口,并在所需端口上设置IIS
。但如果你以不正确的顺序调用这两种方法,它就会中断。
您收到此错误消息是因为Kestrel预计会在IIS
后面运行,并收到直接请求。它注意到因为IIS
不能注入MS-ASPNETCORE-TOKEN
标题。
此issue会记录此问题,并可能在将来的版本中解决此问题。
答案 1 :(得分:0)
另一种解决方法。
由于错误是由于UseKestrel()
和UseIISIntegration()
引起的,因此您可以尝试不使用IIS / IIS Express运行调试,而是选择Kestrel服务器,这样可以避免发生错误。
您可以检查Properties\launchSettings.json
来找到另一个调试选项。