2016-10-17 163 views
0

Im在我的本地機器上部署Docker容器。他們檢查他們是否成功部署的方式是通過瀏覽器並輸入http://192.168.99.105:7474/browser。我想以編程方式做到這一點,所以我跟着Check if a url is reachable - Help in optimizing a Class這個問題的代碼。但是,當我嘗試它時,我得到System.Net.WebException {"The remote server returned an error: (504) Gateway Timeout."}如何檢查本地URL是否可達

它工作正常,但我也得到一個HttpStatusCode.OK如果URL是https://en.wikipedia.org/wiki/YouTube

這是我的代碼:

private bool UrlIsReachable(string url) 
    { 
     //https://en.wikipedia.org/wiki/YouTube 
     HttpWebRequest request = WebRequest.Create("http://192.168.99.105:7474/browser") as HttpWebRequest; 
     request.Timeout = 600000;//set to 10 minutes, includes time for downloading the image 
     request.Method = "HEAD"; 

     try 
     { 
      using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
      { 
       return response.StatusCode == HttpStatusCode.OK; 
      } 
     } 
     catch (WebException) 
     { 
      return false; 
     } 
    } 

編輯:我的碼頭工人,compose.yml文件

version: '2' 
 
services: 
 
    company1: 
 
    image: neo4j 
 
    ports: 
 
     - "7474:7474" 
 
     - "7687:7687" 
 
    volumes: 
 
     - $HOME/company1/data:/data 
 
     - $HOME/company1/plugins:/plugins 
 

 
    company2: 
 
    image: neo4j 
 
    ports: 
 
     - "7475:7474" 
 
     - "7688:7687" 
 
    volumes: 
 
     - $HOME/company2/data:/data 
 
     - $HOME/company2/plugins:/plugins

+0

你有某種代理設置嗎? – lordkain

+0

你如何開始你的Docker容器?請給出命令或docker-compose文件。 192地址是主機的本地網絡地址,還是運行Docker的虛擬機的地址? –

+0

@lordkain不,我沒有,但我認爲這是'TCP'而不是'HTTP'。我在網站'web-sniffer.net'上試了一下,它給了我'只允許端口80,443,8080.'我的端口是7474. – jmc

回答

1

你的代碼是好的,但最好使用新的Microsoft.Net.Http NuGet包,它是所有異步並支持.NET Core。

你的代碼和瀏覽器做什麼之間唯一的區別就是請求中的HTTP方法。瀏覽器發送GET,但您明確使用HEAD。如果您只想測試連接性,那麼這是最有效的方法 - 但服務器可能不支持HEAD請求(我不知道neo4j已足夠確定)。

嘗試在你的代碼中使用GET請求,而不是 - 這個示例使用新的異步方法:

[TestMethod] 
    public async Task TestUrls() 
    { 
     Assert.IsTrue(await UrlIsReachable("http://stackoverflow.com")); 
     Assert.IsFalse(await UrlIsReachable("http://111.222.333.444")); 
    } 

    private async Task<bool> UrlIsReachable(string url) 
    { 
     try 
     { 
      using (var client = new HttpClient()) 
      { 
       var response = await client.GetAsync(url); 
       return response.StatusCode == HttpStatusCode.OK; 
      } 
     }    
     catch 
     { 
      return false; 
     } 
    } 

自動化測試的最簡單方法是使用PowerShell雖然,而不是寫一個自定義的應用程序:

Invoke-WebRequest -Uri http://stackoverflow.com -UseBasicParsing 

或者,如果你確定HEAD支持:

Invoke-WebRequest -Uri http://stackoverflow.com -Method Head -UseBasicParsing 
+0

連接到URL,如果我包含端口,這可以正常工作嗎?例如'Assert.IsFalse(等待UrlIsReachable(「http://111.222.333.444:7474」));'因爲我有1個主機中的2個端口 – jmc

+0

是的,你可以在URL字符串中包含端口。 –