2016-09-26 3 views
0

Я вызываю URL-адрес в C#, используя класс WebClient. Ниже приведен код: -WebException (Статус: ошибка протокола)

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

Этот код выдает следующие сведения об исключении: -

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 ударил сервер правильно. Ожидаемые действия (обновление базы данных) на сервере происходят должным образом. Сервер отправляет ответ правильно. WebClient не обрабатывает ответ.

Я также пробовал использовать класс HttpWebRequest без успеха.

Первоначально аналогичная проблема была там во время запроса. Она была решена, когда я изменил мою app.config со следующим: -

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

Я не могу отправить URL на этом форуме и в любом случае он не доступен за пределами сети.

Если я копирую один и тот же URL-адрес в адресной строке браузера, он просто отлично работает и возвращает ожидаемый ответ.

В чем может быть проблема с приложением Windows?

Edit 1

Я реализовал предложения от ответа. Я также внедрил предложение в принятом ответе на вопрос this. Теперь моя функция выглядит следующим образом: -

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; 
     } 
    } 

Он по-прежнему не решает проблему. Ответ теперь пустой ("") вместо "Успех". Это не ошибка сервера, который подтвержден.

Если я удаляю конфигурацию в app.config, это вызывает другое исключение.

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

Вам нужно отправить заголовки запроса, соответствующий ему ('Accept' например), и любой другой заголовок, который может понадобиться серверу (например, «Пользователь-агент»), –

+0

проблема не на сервере.проблема возникает на стороне клиента, когда он получает ответ, он не может разобрать его IMO. –

+0

Возможная дубликация [Ошибка запроса 400 - ошибка протокола на действительном URL-адресе Webclient] (http://stackoverflow.com/questions/22623664/bad-request-400-protocol-error-on-a-valid-url-webclient) – TheDude

ответ

2

Ваш сервер возвращает HTTP 1201, который не является standard status code.

WebClient завершится с ошибкой при обращении к неуспешному коду состояния (или непризнанному в вашем случае).

Я encorauge использовать новый HttpClient класс, если вы можете:

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

Если вы должны делать это синхронно:

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

Я делаю это синхронно. Я получаю следующее исключение: - 'Необработанное исключение типа 'System.ArgumentOutOfRangeException' произошло в mscorlib.dll' в строке' HttpResponseMessage response = client.GetAsync (requestUrl) .GetAwaiter(). GetResult() ' –

+0

@A_J Похож на проблема на сервере, а не на клиенте. Клиентский код в порядке. –

2

Попытайтесь изменить заголовки своего веб-клиента. Кажется, что ваш ответ несовместим с типами заголовков. Я бы предположил, что вы добавляете заголовок Accept к своему клиенту client.Headers.Add("Accept", "application/json");, предполагая, что вы ждете Json.

+0

нет, это не работает. теперь он возвращает пустой ответ. –

+0

сервер возвращает текст в ответ. Я использовал 'client.Headers.Add (« Принять »,« Приложение/текст »);' также проверять без успеха. –

+0

@A_J '" application/text' "не является допустимым заголовком' Accept', вы должны использовать 'text/plain' –

Смежные вопросы