2014-03-26 62 views
5

我正在寫一個組件的bdd測試,該組件會啓動phantomjs並在我的網站上點擊特定路線並對其進行處理。由於該組件基本上是關於自動執行幻像實例的,因此無法輕鬆地清除http請求。當自我託管究竟是什麼原因AddressAccessDeniedException:HTTP無法註冊URL

所以我想剔除一個自我託管的終結點,它會剔除我之後的數據。因爲這是一個單元測試,我認爲它孤立地運行其非常重要的,所以我做這樣的事情:

async Task can_render_html_for_slide_async() { 
     var config = new HttpSelfHostConfiguration("http://localhost:54331"); 
     config.Routes.MapHttpRoute("Controller", "{controller}", new {}); 
     using (var server = new HttpSelfHostServer(config)) { 
      server.OpenAsync().Wait(); 
      var client = new HttpClient(); 
      var resp = await client.GetStringAsync(config.BaseAddress+"/Stub"); 
      Console.WriteLine(resp); 
     } 
    } 

public class StubController : ApiController 
{ 
    public string Get() { 
     return "Booyah"; 
    } 
} 

這讓我

AddressAccessDeniedException : HTTP could not register URL http://+:54331/ 

I understand that netsh or Admin mode is required for this,但我不明白爲什麼。例如Nodejs在Windows上運行得非常好,但沒有這樣的要求。

using OWIN directly不需要netsh-ing。發生什麼了?

回答

1

任何需要通過netsh提供權限的方法都使用Windows內核驅動程序來提供http訪問。

如果庫本身打開套接字並以這種方式處理http通信,則不需要使用netsh。

所以要回答你的問題,一些方法正在使用內核驅動程序,一些方法正在處理協議本身。

+0

我明白了,是不是windows.api使用所有相同的owin的東西,但? –

4

我寫了一篇關於it on codeproject的文章,這是爲了讓多個應用程序共享相同的端口。 您可以同時擁有IIS和Apache(或您的案例中的OWIN)偵聽端口80.由於URL的路徑,可以完成到正確應用程序的路由。 IIS和Apache都會使用這個驅動程序(http.sys)。但是你需要獲得許可來「保留」一條路徑。 管理員總是被授權。對於其他用戶,請使用netsh或我的GUI工具HttpSysManager來設置ACL。

+0

所以我不確定你在這種情況下說什麼。是'HttpSelfHostServer'使用http.sys? –

+0

是的。實際上,我不認爲.NET中有任何類使用普通套接字而不是http sys來託管http服務器。 –

+0

正如我在這個問題中指出的那樣,通過'Microsoft.Owin.Hosting.WebApp'直接使用OWIN可以很好地工作 –