2017-10-11 117 views
2

我進入一個場景,我的代碼是用HttpWebRequest/HttpWebResponse(System.Net)編寫的。這是在.Net4.5.2上。 但是爲了平臺獨立的原因,我正在將我的代碼遷移到NetStandard。出於某種原因,我在NetStandard 1.6(尚未嘗試2.0)。哪一個選擇HttpRequestMessage(HttpClient)或HttpWebRequest?

問題:狀態碼403(禁止)的響應。

原始代碼:

var request = WebRequest.Create("url") as HttpWebRequest; 
/* 
. adding headers/ filling content 
. 
*/ 

var req = request as WebRequest; 
try{ 
req.GetResponse(); 
}catch(WebException ex){ 

} 

該代碼使用捕捉響應與作爲網絡異常403(禁止)狀態。但是有了這個新的代碼。

我可以使用2遷移代碼來NetStandard 1.6接近

Approach 1: //System.Net.Http 

var request = new HttpRequestMessage(); 
/* 
. adding headers/ filling content/method 
. 
*/ 

var client = new HttpClient(); 
//client.credentials = credentials //credentials if required 
try{ 
client.SendAsync(request).Result; 
}catch(exception ex){ 

} 

這裏響應與403種狀態(禁止)將不會是一個例外了。這只是迴應。所以這是我的代碼的新行爲/將不適合。

方法2:使用System.Net.Requests - NuGet包。 4.3.0

var request = WebRequest.Create("url") as HttpWebRequest; 
    /* 
    . adding headers/ filling content 
    . 
    */ 

    var req = request as WebRequest; 
    try{ 
    req.GetResponseAsync().Result; 
    }catch(AggregateException ex){ 
    var webEx = ex.InnerExceptions[0] as WebException; 
    //To get my previous behavior back/retrofit 
    } 

這是作爲我的原始代碼唯一的事情是同步API不可用。我需要使用WebRequest.GetResponseAsync()進行管理。結果爲403響應拋出聚合異常。一些額外的工作來改造。

所以現在我不能斷定哪一個使用。 有人請幫忙選擇HttpRquestMessage(HttpClient)或HttpWebRequest,並說明原因。

在此先感謝

回答

1

使用第一種方法,你可以把它用行動處理響應類似。你可以這樣做:

var request = new HttpRequestMessage(); 
/* 
. adding headers/ filling content/method 
. 
*/ 

var client = new HttpClient(); 
//client.credentials = credentials //credentials if required 
try 
{ 
    var result = client.SendAsync(request).Result; 
    result.EnsureSuccessStatusCode(); // throws if not success 
} 
catch(Exception ex) 
{ 
    // handle exception here 
} 

這可能是接近你會得到同樣的方式行事代碼,而不必通過內部異常挖掘,以確定它是否是一個HTTP錯誤與否。

相關問題