/ / Quale scegliere HttpRequestMessage (HttpClient) o HttpWebRequest? - c #, asp.net, .net, asp.net-web-api, asp.net-core

Quale scegliere HttpRequestMessage (HttpClient) o HttpWebRequest? - c #, asp.net, .net, asp.net-web-api, asp.net-core

Sono in uno scenario in cui è stato scritto il mio codicecon HttpWebRequest / HttpWebResponse (System.Net). Questo era on.Net4.5.2. Ma per motivi di indipendenza della piattaforma sto migrando il mio codice a NetStandard. Per qualche ragione, sono su NetStandard 1.6 (non ancora provato 2.0).

Problema: risposta con codice di stato 403 (Proibito).

Codice originale:

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

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

}

Questo codice usa per catturare la risposta con lo stato 403 (Proibito) come eccezione web. Ma con questo nuovo codice.

Posso migrare il codice a NetStandard 1.6 utilizzando 2 approcci

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){

}

Qui la risposta con stato 403 (proibito) non sarà più un'eccezione. è solo una risposta, quindi questo è un nuovo comportamento per il mio codice / ha vinto "t fit rétro".

Approccio 2: utilizzo di System.Net.Requests - pacchetto 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
}

Funziona come la mia unica cosa di codice originale è la sincronizzazioneLe API non sono disponibili. Ho bisogno di gestire con WebRequest.GetResponseAsync (). Risultato Che genera un'eccezione Aggregazione per 403 risposte. piccolo lavoro extra per il retrofit.

Quindi ora non sono in grado di stabilire quale utilizzare. Qualcuno può aiutare a scegliere tra HttpRquestMessage (HttpClient) o HttpWebRequest e indicare perché.

Grazie in anticipo

risposte:

1 per risposta № 1

Usando il primo approccio, puoi farlo agire in modo simile gestendo la risposta. Potresti fare qualcosa come:

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
}

Questo è probabilmente il più vicino possibile al codice che agisce nello stesso modo senza dover scavare attraverso le eccezioni interne per determinare se si trattava di un errore HTTP o meno.