gpt4 book ai didi

c# - Windows netsh "+"通配符不适用于 ServiceHost

转载 作者:可可西里 更新时间:2023-11-01 17:28:15 24 4
gpt4 key购买 nike

免责声明:类似于 this question , 这个是针对来自 answer 的投票最多的评论

我使用 ServiceHost 对象创建 HTTP 服务:http://{IP}:80/myService

我的应用程序是从非管理员帐户运行的(必须保持这样)。从多个来源,我发现解决方案是从管理员 cmd 提示符调用以下内容:

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()

但是,如果我调用这一行,它会起作用:

netsh http add urlacl url=http://127.0.0.1:80/myService/user=Everyone

请注意,我明确指定了 IP。我不知道用户将使用的 IP,所以我需要 + 通配符才能工作。我无法弄清楚为什么它不起作用,也找不到解决方法。

  • 以管理员身份运行不是解决方案。
  • 找到关于 UrlPrefix 的信息来自 Microsoft 的通配符,但仍不清楚

最佳答案

我也遇到过这种情况。到目前为止,我怀疑行为实际上因 Windows 版本而异。 Windows 10 似乎对环回 IP (127.0.0.1) 上的 URL 保留的处理方式略有不同——尽管其他一切似乎都按预期工作。

在我的 Windows 10 机器上,我看到了和你一样的东西——如果我有一个带有强通配符的预订(即 http://+:80/),注册绑定(bind)到本地环回的 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)。我怀疑 Microsoft 在某个时候引入了在本地环回上进行“特殊”URL 注册的功能,而无需通过 netsh 事先保留。

这纯粹是我的猜测,但我怀疑这些特殊保留还附带一个警告,即 http.sys 中的底层套接字出于安全目的仅绑定(bind)到本地环回。这显然会与任何其他想要处理该端口上适合 http://+:80/ 保留的请求的进程发生冲突,这可能包括来自不同接口(interface)的远程请求.

关于c# - Windows netsh "+"通配符不适用于 ServiceHost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42140242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com