我有一个正在尝试运行的自托管OWIN项目。配置为监听:
http://localhost:8080
每当我尝试访问该URL时,都会显示 HTTP错误503。服务不可用错误。
我已经运行netstat -a -b
,并确保8080端口上没有其他应用程序在运行。
当我将配置更改为http://+:8080
时,项目运行正常。因此,唯一的变化是将localhost
更改为+
。
现在这是奇怪的事情:
我确保HTTP名称空间中的所有条目(localhost:8080
或+:8080
)都相同(请参见this和this,其中“ iedereen”是荷兰语代表“所有人”(是的,这仅在我的测试台上)。 netsh http show urlacl
的相关输出:
URL Reservations:
Reserved URL : http://+:8080/
User: \Everyone
Listen: Yes
Delegate: Yes
SDDL: D:(A;;GAGXGWGR;;;WD)
Reserved URL : http://localhost:8080/
User: \Everyone
Listen: Yes
Delegate: Yes
SDDL: D:(A;;GAGXGWGR;;;WD)
我在端口8081或其他端口上有相同的问题; “ +
”有效,“ localhost
”无效。因此,为确保与8080没有冲突,我尝试了8081(以及其他端口,当然还有正确的urlacl)
+:8080
时,应用程序可以正常运行;我得到了想要的回应。因此,这不是防火墙问题。我尝试过的端口8081或其他端口也不是。另外,503
来自应用程序(毕竟这是一个应用程序错误,但是,当我停止该应用程序时,我只是没有得到响应,而不是503),因此,也没有防火墙问题。localhost:8080
可在同事的计算机上工作(这首先就是这种方式)localhost
可以很好地解析为127.0.0.1
和::1
。没有更改的主机文件。我似乎无法调试此问题,我可以在控制器方法中设置一个断点,但从未实现。该应用程序启动正常。
好吧,复制测试代码:
using Microsoft.Owin.Hosting;
using Owin;
using System;
namespace TestApp
{
internal class Program
{
private static void Main(string[] args)
{
using (WebApp.Start<WebAppStartup>("http://localhost:8080"))
{
Console.WriteLine("Press [enter] to quit...");
Console.ReadLine();
}
}
}
internal class WebAppStartup
{
public void Configuration(IAppBuilder app)
{
app.Run(context =>
{
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("Hello, world.");
});
}
}
}
同样,以上操作不起作用除非,我将localhost
更改为+
。
我的主要问题是:我可以调试吗?我在启动应用程序时没有异常,但从未达到控制器方法(或:在以上代码中,从未返回“ Hello,world”)。我已经检查了Windows事件日志,但那里什么也没有。
注意:我的问题实际上不是问题(因为我有一个“解决方法”);当我仅更改配置以使用http://+:8080
但时,这是一个原则问题,我想知道为什么 +
有效而localhost
没有。
我最感兴趣的是如何调试它以及localhost
和+
之间的区别是什么;如何配置OWIN或在何处设置断点以查看请求进入或发送503响应,或者如何获取此日志或...
编辑:我将代码更改为:
using Microsoft.Owin;
using Microsoft.Owin.Hosting;
using Owin;
using System;
using System.Threading.Tasks;
namespace TestApp
{
internal class Program
{
private static void Main(string[] args)
{
using (WebApp.Start<WebAppStartup>("http://localhost:8080/")) // or: http://+:8080/
{
Console.WriteLine("Press [enter] to quit...");
Console.ReadLine();
}
}
}
internal class WebAppStartup
{
public void Configuration(IAppBuilder app)
{
app.Use<TestMiddleware>();
app.Run(context =>
{
context.Response.ContentType = "text/plain";
Console.WriteLine("Sending response");
return context.Response.WriteAsync("Hello, world.");
});
}
}
public class TestMiddleware : OwinMiddleware
{
public TestMiddleware(OwinMiddleware next) : base(next) { }
public override async Task Invoke(IOwinContext context)
{
Console.WriteLine("Begin Request");
await Next.Invoke(context);
Console.WriteLine("End Request");
}
}
}
当我使用http://+:8080
运行应用程序时,我的控制台中显示以下内容:
Begin Request
Sending response
End Request
“ Hello,world”也出现在我的浏览器中。我可以在“ begin request”行上设置一个断点,它会被命中。然后,我再次更改为http://localhost:8080
和... HTTP Error 503. The service is unavailable.
。再次。控制台什么也没有显示(除了明显的“按[enter]退出...”),没有找到断点。