2017-02-09 72 views
0

免責聲明:到this question類似,這個人是具體到最投票評論從answer的Windows的netsh「+」通配符不工作的ServiceHost

我使用的ServiceHost對象來創建一個HTTP服務:http: // {IP}:80/myService

我的應用程序從非管理員帳戶運行(並且必須保持這樣)。從幾個來源,我發現該解決方案在呼喚從管理員以下命令提示符:

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

注意我明確地指定的T他IP。我不知道用戶將使用的IP,所以我需要+通配符才能工作。我不明白爲什麼它不工作,我找不到解決方法。

  • 作爲管理員的Runnin不是解決方案。
  • 從微軟UrlPrefix通配符找到信息,但目前尚不清楚
+0

在命令末尾添加「listen = yes」是否會改變任何內容? –

+0

listen = yes是默認值,我也嘗試了delegate = yes但它沒有任何作用 –

回答

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/預留,其中可能包括在不同接口上進入的遠程請求。