免责声明:与this question类似,此内容仅适用于answer
中投票最多的评论我使用ServiceHost对象创建HTTP服务:http:// {IP}:80 / myService
我的应用程序从非管理员帐户运行(这必须保持这样)。从几个来源我发现解决方案是从管理员cmd提示符调用以下内容:
this.users = res
this.users.map((user, i) => user.no = i);
这不起作用,我仍然有一个关于访问的例外:
netsh http add urlacl url=http://+:80/myService/ user=Everyone
但是如果我打电话给这一行,它就可以了:
System.ServiceModel.AddressAccessDeniedException: HTTP could not register URL http://127.0.0.1:80/myService/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details). ---> System.Net.HttpListenerException: Access is denied
at System.Net.HttpListener.AddAllPrefixes()
at System.Net.HttpListener.Start()
at System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
--- End of inner exception stack trace ---
at System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
at System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener)
at System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback)
at System.ServiceModel.Channels.TransportChannelListener.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.HttpChannelListener`1.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open()
注意我明确指定了IP。我不知道用户将使用的IP,所以我需要+通配符才能工作。我无法弄清楚它为什么不起作用,我无法找到解决方法。
答案 0 :(得分:1)
我也遇到过这种情况。到目前为止,我怀疑该行为实际上因Windows版本而异。 Windows 10似乎对环回IP(127.0.0.1
)上的URL保留有所不同 - 但其他所有内容似乎都按预期工作。
在我的Windows 10计算机上,我看到了同样的事情 - 如果我使用强通配符(即http://+:80/
)进行预订,则注册绑定到本地环回的URL前缀每次都失败了。但是,Windows Server 2008或2012上的情况不;它在那里工作得很好。
我确定这是相关的,但实际上我已成功在Windows 10上的本地环回上注册URL,而该端口上没有任何之前的预留(并且不是管理员) ),这有点奇怪,因为我无法找到任何指出这种情况的文件。以下是对netsh http show servicestate
的调用的输出,其中一个是这样的预订:
Server session ID: E700000120000035
Version: 2.0
State: Active
Properties:
Max bandwidth: 4294967295
Timeouts:
Entity body timeout (secs): 120
Drain entity body timeout (secs): 120
Request queue timeout (secs): 120
Idle connection timeout (secs): 120
Header wait timeout (secs): 120
Minimum send rate (bytes/sec): 150
URL groups:
URL group ID: DF00000140000004
State: Active
Request queue name: Request queue is unnamed.
Properties:
Max bandwidth: inherited
Max connections: inherited
Timeouts:
Timeout values inherited
Number of registered URLs: 1
Registered URLs:
HTTP://127.0.0.1:8081:127.0.0.1/
请注意奇怪的前缀格式(HTTP://127.0.0.1:8081:127.0.0.1/
) - 这不是我传递给ServiceHost的内容(我刚刚指定http://127.0.0.1:8081
)。我怀疑微软在某种程度上引入了制作“特殊”的能力。本地环回上的URL注册,无需事先通过netsh
进行预订。
这是我的纯粹推测,但我怀疑这些特殊的保留也伴随着警告,http.sys
中的底层套接字仅出于安全目的而绑定到本地环回。这显然会与任何其他希望处理该端口上的请求的进程冲突,该进程适合http://+:80/
预留,其中可能包括在不同接口上进入的远程请求。