为什么HttpListener"与现有注册冲突?#34;在收听强通配符(http:// +:port)http.sys / urlacl绑定时?

时间:2017-10-21 00:43:09

标签: c# windows http owin httplistener

想象一下,提升用户(例如安装程序)配置URL保留:

 netsh http add urlacl url="https://+:8105/" user="SVCACCOUNT" listen=yes

现在当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)

而Owin'条目'点:

WebApp.Start("http://+:8105", ..)

在创建问题期间,我发现注册了http://*:8105和同一个"的Owin / HttpListener URL工作了#34;。

  • 什么阻止HttpListener(以及Owin)从使用以前使用强通配符进行的注册?

  • 为什么在注册和绑定中使用*("弱通配符")可以让听众启动?(使用&#34 ;强大的通配符"正在抛出上述错误;完全删除注册将导致侦听器失败,并且#34;由于访问权限有限,访问被拒绝"

这在哪里记录,以及'后果'从强到弱的通配符切换到了吗?为什么这个修复甚至工作?从很多次提出相关问题(通常没有一个好的答案),似乎+"可能工作"在过去和/或在不同的系统或配置上:改变了什么?

(我已经在http.sys配置上找到了分散的文档,例如Host-Specifier Categories,但仍然没有明确解释冲突注册的问题。)

如果按System.Net.HttpListenerException: Failed to listen on prefix 'http://localhost:8080删除注册,则Owin服务将成功启动。但是我认为这需要更高的高度来收听端口。

是" Owin self-host - Failed to listen on prefix 'http://localhost:12345/' because it conflicts with an existing registration on the machine"的副本。因为只有当 定义了URL保留时才会出现这个问题:同样,没有其他进程可以监听,如通过netstat确认的那样。

Self hosted OWIN and urlacl这样的问题让我相信这是一个许可问题或一些微不足道的事情......例如,http://+:porthttp://*:port的区别如何? (不,使用' EVERYONE'为urlacl无法解决问题。)

评论" Running self-hosted OWIN Web API under non-admin account"可能是相关的 - 与+ vs *相关,而且一般都缺乏澄清。

1 个答案:

答案 0 :(得分:0)

- 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

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

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

*+ 通配符之间的区别在于 * 包含无效元素,而 + 强制存在至少 1 个字符。我不知道执行上的差异,但可能是几乎察觉不到的微小差异。