为什么在侦听强通配符(http:// +:port)http.sys / urlacl绑定时HttpListener为什么“与现有注册冲突”?

use*_*740 7 c# windows http httplistener owin

假设提升的用户(例如,安装程序)配置了URL保留:

 netsh http add urlacl url="https://+:8105/" user="SVCACCOUNT" listen=yes
Run Code Online (Sandbox Code Playgroud)

现在,当Owin启动时(在SVCACCOUNT下运行),将导致以下错误:

System.Net.HttpListenerException: Failed to listen on prefix 'http://+:8105/' because it conflicts with an existing registration on the machine.
   at System.Net.HttpListener.AddAllPrefixes()
   at System.Net.HttpListener.Start()
   at Microsoft.Owin.Host.HttpListener.OwinHttpListener.Start(..)
   at Microsoft.Owin.Host.HttpListener.OwinServerFactory.Create(..)
...
at Microsoft.Owin.Hosting.Engine.HostingEngine.Start(StartContext context)
Run Code Online (Sandbox Code Playgroud)

Owin的“入口”点是:

WebApp.Start("http://+:8105", ..)
Run Code Online (Sandbox Code Playgroud)

在创建问题的过程中,我发现一个注册http://*:8105 和一个“有效”的Owin / HttpListener URL相同。

  • 是什么阻止HttpListener(以及Owin)使用以前通过Strong Wildcard 进行的注册?

  • 为什么*在注册和绑定中都使用(“弱通配符”)允许侦听器启动?(使用“强通配符”会引发上述错误;由于帐户访问受限,完全删除注册将导致侦听器失败并显示“访问被拒绝”。)

从哪里记录下来,从强通配符转换为弱通配符的解决方案有哪些“后果”?为何此修复程序还能起作用?从许多次询问相关问题(通常没有一个很好的答案)来看,+过去和/或在不同的系统或配置上似乎“可能起作用”:发生了什么变化?

(尽管找不到关于“冲突注册”的明确解释,但我发现有关http.sys配置的文档分散,例如“ 主机说明符类别 ”。)


如果每个System.Net.HttpListenerException删除了注册,则:无法侦听前缀'http:// localhost:8080,则Owin服务将成功启动。但是,我认为这需要更高的高度才能监听港口。

这是不是一个重复“ Owin自主机-无法监听前缀的‘http://本地主机:12345 /’,因为它与机器上的现有注册冲突 ”,因为当有问题出现仅是定义的URL保留:同样,没有其他进程在监听,这是通过netstat确认的。

诸如自托管OWIN和urlacl之类的问题使我相信这是权限问题或琐碎的事。例如,http://+:port与http://*:port有何不同?(不,使用“所有人”不能解决问题。)

“ 在非管理员帐户下运行自托管OWIN Web API ”中的注释可能是相关的-与+vs *.. 有关,并且总体上缺乏说明。

Fra*_*ank 1

- What prevents HttpListener (and thus Owin) from using the registrations previously taken with a Strong Wildcard?

也许问题是您正在注册HTTPS协议:

netsh http add urlacl url="https://+:8105/" user="SVCACCOUNT" listen=yes
Run Code Online (Sandbox Code Playgroud)

然后您HTTP在代码中使用该协议:

WebApp.Start("http://+:8105", ..)
Run Code Online (Sandbox Code Playgroud)
-Why does using * (a "weak wildcard") in both registration and binding allow a listener to start?
Run Code Online (Sandbox Code Playgroud)

*和通配符之间的区别+是*包括 void 元素和+强制存在至少 1 个字符。我不知道执行差异,但可能很小,几乎难以察觉。