2016-11-17 78 views
2

關於如何檢查URL是否有效有很多帖子。他們所有的功能基本上都是相同的代碼,這似乎適用於每個人 - 但不適合我,但我不明白爲什麼。檢查URL是否存在 - HTTP請求總是返回一個異常

public static bool ifURLexists(string url) 
    { 

     try 
     { 
       var request = WebRequest.Create(url) as HttpWebRequest; 
       request.Method = "HEAD"; 
       //response ALWAYS throws an exception 
       using (var response = (HttpWebResponse)request.GetResponse()) 
       { 
       return response.StatusCode == HttpStatusCode.OK; 
       } 
     } 
     catch 
     { 
      return false; 
     } 
    } 

我已經測試用的參數,如「http://www.nonexistingwebsiteblabla.com」和「http://www.google.com」的方法。如果我插入現有的或不存在的URL不管了,我在這行得到引發WebException:

using (var response = (HttpWebResponse)request.GetResponse()) 

爲什麼會不會是不工作?

+2

究竟是什麼'WebException'? – Equalsk

+0

什麼是錯誤? –

+1

如果你對異常感興趣,不要使用'try-catch'。在這種情況下,你是,因爲你想知道它是什麼。十比一是它是您公司的代理驗證錯誤。 – CodeCaster

回答

2

檢查狀態WebException.Status 這會讓你知道發生了什麼特定的web異常。

更新:嘗試將request.Method = "HEAD"; 更改爲GET並嘗試。

嘗試使用不可用(404)的網址,比較狀態檢查是否有任何內容阻止了您的請求。

這是我如何管理我的代碼,我只處理使用ftp特定狀態。'CommStatus'是一個錯誤代碼ENUM在整個應用程序中可用。

catch (WebException ex) 
     { 
      FtpWebResponse response = (FtpWebResponse)ex.Response;    
      switch(response.StatusCode) 
      { 
       case FtpStatusCode.ActionNotTakenFileUnavailable: 
        return CommStatus.PathNotFound; 
       case FtpStatusCode.NotLoggedIn: 
        return CommStatus.AuthenticationError; 
       default: return CommStatus.UnhandledException; 

      } 


     } 

以下是WebException的可用狀態。

CacheEntryNotFound
此API支持產品的基礎結構,不適合直接在代碼中使用。未找到指定的緩存條目。

ConnectFailure
此API支持產品的基礎結構,不適合直接在代碼中使用。運輸級別不能聯繫遠程服務點。

ConnectionClosed
此API支持產品的基礎結構,不適合直接在代碼中使用。連接過早關閉。

KeepAliveFailure
此API支持產品的基礎結構,不適合直接在代碼中使用。用於指定Keep-alive標頭的請求的連接意外關閉。

MessageLengthLimitExceeded
此API支持產品的基礎結構,不適合直接在代碼中使用。在發送請求或從服務器接收響應時收到超出指定限制的消息。

NameResolutionFailure
此API支持產品的基礎結構,不適合直接在代碼中使用。名稱解析器服務無法解析主機名。

待定 此API支持產品基礎結構,不適合在代碼中直接使用。內部異步請求正在等待處理。

PipelineFailure 此API支持產品基礎結構,不適合在代碼中直接使用。該請求是一個piplined請求,並且在收到響應之前關閉了連接。

ProtocolError
此API支持產品的基礎結構,不適合直接在代碼中使用。從服務器收到的響應已完成,但顯示協議級錯誤。例如,HTTP協議錯誤(如401拒絕訪問)將使用此狀態。

ProxyNameResolutionFailure
此API支持產品的基礎結構,不適合直接在代碼中使用。名稱解析程序服務無法解析代理主機名。

ReceiveFailure
此API支持產品的基礎結構,不適合直接在代碼中使用。沒有收到遠程服務器的完整響應。

RequestCanceled 此API支持產品基礎結構,不適合在代碼中直接使用。該請求被取消,WebRequest.Abort方法被調用,或發生了無法分類的錯誤。這是狀態的默認值。

RequestProhibitedByCachePolicy
此API支持產品的基礎結構,不適合直接在代碼中使用。緩存策略不允許請求。通常,這發生在請求不可緩存且有效策略禁止將請求發送到服務器時發生。如果請求方法暗示存在請求主體,請求方法需要與服務器直接交互,或請求包含條件標頭,則可能會收到此狀態。

RequestProhibitedByProxy
此API支持產品的基礎結構,不適合直接在代碼中使用。代理不允許此請求。

SecureChannelFailure
此API支持產品的基礎結構,不適合直接在代碼中使用。使用SSL建立連接時發生錯誤。

SendFailure 此API支持產品基礎結構,不適合在代碼中直接使用。完整的請求無法發送到遠程服務器。

ServerProtocolViolation 此API支持產品基礎結構,不適合在代碼中直接使用。服務器響應不是有效的HTTP響應。

成功 該API支持產品基礎架構,不適合在代碼中直接使用。沒有遇到任何錯誤。

超時 此API支持產品基礎結構,不適合在代碼中直接使用。在請求超時期間未收到任何回覆。

TrustFailure
此API支持產品的基礎結構,不適合直接在代碼中使用。服務器證書無法驗證。

不明錯誤
此API支持產品的基礎結構,不適合直接在代碼中使用。發生未知類型的例外。

更多細節在這裏:https://msdn.microsoft.com/en-us/library/system.net.webexceptionstatus(v=vs.110).aspx

+0

謝謝。狀態是「名稱解析失敗」,包含現有和不存在的URL。我覺得很難理解這到底意味着什麼。 – Dovile

+0

請參閱更新。 –

+1

它工作。謝謝! – Dovile

相關問題