C# 选择HttpRequestMessage(HttpClient)还是HttpWebRequest?

C# 选择HttpRequestMessage(HttpClient)还是HttpWebRequest?,c#,asp.net,.net,asp.net-web-api,asp.net-core,C#,Asp.net,.net,Asp.net Web Api,Asp.net Core,我的代码是用HttpWebRequest/HttpWebResponse(System.Net)编写的。这是在.Net4.5.2上。 但出于平台独立性的原因,我正在将代码迁移到NetStandard。出于某种原因,我使用的是Netstandard1.6(还没有试用过2.0) 问题:状态代码为403(禁止)的响应 原始代码: var request = WebRequest.Create("url") as HttpWebRequest; /* . adding headers/ filling

我的代码是用HttpWebRequest/HttpWebResponse(System.Net)编写的。这是在.Net4.5.2上。 但出于平台独立性的原因,我正在将代码迁移到NetStandard。出于某种原因,我使用的是Netstandard1.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(禁止)状态为web异常的响应。但是有了这个新代码

我可以使用两种方法将代码迁移到NetStandard1.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().Result进行管理,它会为403响应引发聚合异常。需要改装的额外工作很少

所以现在我无法决定使用哪一种。 请有人帮助选择HttpQuestMessage(HttpClient)或HttpWebRequest,并说明原因


提前感谢

使用第一种方法,您可以通过处理响应使其行为类似。你可以这样做:

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错误