哪一个选择HttpRequestMessage(HttpClient)或HttpWebRequest?

时间:2017-10-11 04:33:27

标签: c# asp.net .net asp.net-web-api asp.net-core

我进入了一个使用HttpWebRequest / HttpWebResponse(System.Net)编写代码的场景。这是在.Net4.5.2。 但出于平台独立性的原因,我正在将我的代码迁移到NetStandard。出于某种原因,我使用的是NetStandard 1.6(尚未尝试过2.0)。

问题:响应状态代码403(禁止)。

原始代码:

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

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

}

此代码用于捕获403(Forbidden)状态的响应作为Web异常。但是有了这个新代码。

我可以使用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响应抛出了一个Aggregate异常。很少有额外的工作来改造。

所以现在我无法断定要使用哪一个。 有人请帮助选择HttpRquestMessage(HttpClient)或HttpWebRequest,并告诉原因。

提前致谢

1 个答案:

答案 0 :(得分: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错误。