Windows netsh“+”通配符不适用于ServiceHost

时间:2017-02-09 15:10:44

标签: c# wcf http netsh servicehost

免责声明:与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,所以我需要+通配符才能工作。我无法弄清楚它为什么不起作用,我无法找到解决方法。

  • Runnin作为管理员不是解决方案。
  • 找到了来自Microsoft的UrlPrefix通配符的信息,但仍然不清楚

1 个答案:

答案 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/预留,其中可能包括在不同接口上进入的远程请求。