2016-09-26 1 views
0

Ich rufe eine URL in C# mit WebClient Klasse. Es folgt der Code: -WebException (Status: Protokollfehler)

public string SendWebRequest(string requestUrl) 
    { 
     using (var client = new WebClient()) 
     { 
      string responseText = client.DownloadString(requestUrl); 
      return responseText; 
     } 
    } 

Dieser Code schlägt mit folgenden Ausnahmedetails: -

System.Net.WebException: The remote server returned an error: (1201). 
    at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request) 
    at System.Net.WebClient.DownloadString(Uri address) 
    at System.Net.WebClient.DownloadString(String address) 

Exception Status: ProtocolError 

URL traf den Server ordnungsgemäß. Die erwarteten Aktionen (Datenbank aktualisieren) auf dem Server werden ordnungsgemäß ausgeführt. Der Server sendet die Antwort ordnungsgemäß. WebClient verarbeitet die Antwort nicht.

Ich habe auch versucht, HttpWebRequest Klasse ohne Erfolg.

Anfangs war ein ähnliches Problem während der Anfrage. Es wurde gelöst, als ich meine app.config modifizierte mit folgenden Optionen: -

<settings> 
     <httpWebRequest useUnsafeHeaderParsing = "true"/> 
    </settings> 

Ich kann nicht URL in diesem Forum posten und trotzdem ist es nicht zugänglich außerhalb Netzwerk.

Wenn ich dieselbe URL in die Adressleiste des Browsers kopiere, funktioniert es einfach und gibt die erwartete Antwort zurück.

Was könnte das Problem mit Windows-Anwendung dann sein?

bearbeiten 1

ich Vorschläge Antwort umgesetzt. Ich habe auch Vorschlag in der angenommenen Antwort für this Frage implementiert. Nun sieht meine Funktion wie folgt aus: -

public string SendWebRequest(string requestUrl) 
    { 
     using (var client = new WebClient()) 
     { 
      client.Headers.Add("Accept", "text/plain"); 
      client.Headers.Add("Accept-Language", "en-US"); 
      client.Headers.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"); 
      client.Headers["Content-Type"] = "text/plain;charset=UTF-8"; 
      string responseText = client.DownloadString(requestUrl); 
      return responseText; 
     } 
    } 

Es löst immer noch nicht das Problem. Antwort ist jetzt leere Zeichenfolge ("") anstelle von "Erfolg". Dies ist kein Fehler vom Server, der bestätigt wird.

Wenn ich Konfiguration in app.config entferne, löst es andere Ausnahme aus.

System.Net.WebException: The server committed a protocol violation. Section=ResponseStatusLine 
    at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request) 
    at System.Net.WebClient.DownloadString(Uri address) 
    at System.Net.WebClient.DownloadString(String address) 
+0

Sie müssen die sachgemäßer Request-Header senden ('Accept' zum Beispiel) und jeder andere Header, den der Server möglicherweise benötigt (wie zum Beispiel "User-Agent") –

+0

Problem ist nicht auf dem Server.Problem ist auf der Client-Seite, wenn es Antwort erhält, es ist nicht in der Lage, es IMO zu analysieren. –

+0

Mögliches Duplikat von [Bad Request 400 - Protokollfehler auf einer gültigen URL - Webclient] (http://stackoverflow.com/questions/22623664/bad-request-400-protocol-error-on-a-valid-url-webclient) – TheDude

Antwort

2

Ihr Server gibt HTTP 1201 zurück, der kein standard status code ist.

WebClient wird mit einer Ausnahme fehlschlagen, wenn ein nicht erfolgreicher Statuscode angezeigt wird (oder in Ihrem Fall ein nicht erkannter Statuscode).

I encorauge Sie die neue HttpClient Klasse verwenden, wenn Sie können:

public async Task<string> SendWebRequest(string requestUrl) 
{ 
    using (HttpClient client = new HttpClient()) 
    using (HttpResponseMessage response = await client.GetAsync(requestUrl)) 
     return await response.Content.ReadAsStringAsync(); 
} 

Wenn Sie es synchron zu tun haben:

public string SendWebRequest(string requestUrl) 
{ 
    using (HttpClient client = new HttpClient()) 
    using (HttpResponseMessage response = client.GetAsync(requestUrl).GetAwaiter().GetResult()) 
     return response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); 
} 
+0

Ich mache das synchron. Ich bekomme folgende Ausnahme: - 'Eine nicht behandelte Ausnahme vom Typ 'System.ArgumentOutOfRangeException' in mscorlib.dll' in der Zeile 'HttpResponseMessage response = client.GetAsync (requestUrl) .GetAwaiter(). GetResult()' –

+0

@A_J Sieht aus wie ein Problem auf dem Server, nicht der Client. Client-Code ist in Ordnung. –

2

Versuchen Sie, die Header Ihres Webclients zu ändern. Es scheint, dass Ihre Antwort nicht mit den Header-Typen kompatibel ist. Ich würde vorschlagen, dass Sie einen Accept-Header zu Ihrem Client hinzufügen client.Headers.Add("Accept", "application/json"); unter der Annahme, dass Sie auf Json warten.

+0

Nein, das funktioniert nicht. Jetzt gibt es eine leere Antwort zurück. –

+0

Server gibt als Antwort reinen Text zurück. Ich habe 'client.Headers.Add (" Accept "," application/text ");' auch ohne Erfolg verwendet. –

+0

@A_J '" application/text' "ist kein gültiger' Accept' Header, Sie sollten 'text/plain' verwenden –

Verwandte Themen