2016-09-29 3 views
1

Mein Problem liegt in der PostAsync Aktion der HttpClient. Ein Code-Auszug, der in meiner C# -Konsolen-App verwendet wird, verhält sich völlig anders als der gleiche Code, der in ASP.NET Core verwendet wird.HttpClient verhält sich anders auf ASP.NET Core

using (var httpClient = new HttpClient()) 
{ 
    var parameters = new Dictionary<string, string> { { "various", "params" } }; 
    var encodedContent = new FormUrlEncodedContent(parameters); 

    var response = await httpClient.PostAsync(url, encodedContent).ConfigureAwait(false); 
    if (response.StatusCode == HttpStatusCode.OK) 
    { 
     var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait (false); 
     return responseContent; 
    } 
} 

Aufruf der Methode (GetData enthält den oberen Code):

var unprocessedString = GetData("http://www.whatever.com/info.html").Result; 

Im unprocessedString ich mit einem gültigen HTML-String am Ende

Die exakt gleichen Code angewendet in meinem ASP .NET Core liefert ein völlig anderes Ergebnis.

Die zurückgegebenen Informationen sehen aus wie ein riesiges JS-Skript, ich habe die Kopfzeilen der Fiddler-Anfrage überprüft und der einzige Unterschied ist der Header Accept-Encoding: gzip, deflate, der vom ASP-Aufruf erstellt wurde. Ich habe ihn entfernt und die Ergebnisse bleiben gleich.

<html><head><meta http-equiv="Pragma" content="no-cache"/> 
<script> 
a huge javascript function 
<noscript>Please enable JavaScript to view the page content.</noscript> 
+0

Äh, nein, 'HttpClient' ändert nicht die Art, wie Antworten auf verschiedenen Plattformen verarbeitet werden. Wenn die Serverantwort unterschiedlich ist, gibt es einen Unterschied in der Clientanforderung. –

+0

Die Client-Anfragen waren identisch, deshalb habe ich erwähnt, dass ich den exakt gleichen Code (einschließlich des angerufenen Servers) im Post verwendet habe. Ich denke, ich habe das Problem, es gibt verschiedene Versionen von System.Net.Http zwischen .NET und .NET Core – ExtremeSwat

Antwort

2

Ich habe es geschafft, das Problem zu finden. Mein http-post erreicht zuerst das oben erwähnte JavaScript, dass redirects mein Aufruf zum gesuchten Inhalt (Dies ist, was passiert, wenn der Code von einer .NET-Konsole App ausgeführt wird). Soweit ich sehen kann, unterscheidet sich die ASP.NET Core-Implementierung der HttpClient im Verhalten, weil der exakt gleiche Code (und angefragte Ressource) völlig anders verhielt, weil die redirect nie passiert ist, damit der obere JS-Code endete, als ich Info gelesen habe von diesem Posten.

So habe ich es geschafft, es zu beheben.

Zuerst erklärte ich eine HttpClientHandler mit der AllowAutoRedirect Eigenschaft zu true.

HttpClientHandler httpClientHandler = new HttpClientHandler { AllowAutoRedirect = true }; 

Dann einfach habe ich diese Aufgabe zu HttpClient ‚s Konstruktor

HttpClient = new HttpClient(httpClientHandler); 

Edit 1

ich einen Unterschied in den System.Net.Http Versionen zu sehen, kam an. in der Konsolen App habe ich 4.0.0.0 In .NET Kern habe ich 4.1.1.1

Wahrscheinlich die letztere Version nicht das Standardverhalten 4.0.0.0 hatte hat.

Verwandte Themen