2015-08-06 9 views
0

Я пытаюсь сделать HttpWebRequest удаленным датчиком с HTML-сервером на нем, чтобы отбросить данные.Как получить ответ, когда я получаю исключение ServerProtocolViolation?

Я думаю, проблема в том, что у веб-сервера есть некоторые проблемы с этим. Я могу получить веб-страницу для рендеринга в веб-браузере, и данные будут видны. Это данные, которые я хочу анализировать и хранить в реляционной базе данных.

Когда я смотрю заголовки ответов в Fiddler, я вижу, что он возвращает 500 Bad Response. Итак, я думаю, что это происходит, заголовки говорят, что Bad Response, но в том числе и действительная веб-страница.

Я не думаю, что смогу исправить веб-сервер. Я хотел бы просто захватить данные и проанализировать их. К сожалению объект Response имеет значение NULL.

Ошибка, вызванная выпуском WebExceptionStatus.ServerProtocolViolation, а в ветви catch ответ - null.

Что я могу сделать в этом сценарии?

UPDATE:

Другая проблема заключается в том, что нет HTML тегов. Ниже представлена ​​сырой ответ от Fiddler:

HTTP/1.1 500 Fiddler - Bad Response 
Date: Thu, 06 Aug 2015 18:13:27 GMT 
Content-Type: text/html; charset=UTF-8 
Connection: close 
Cache-Control: no-cache, must-revalidate 
Timestamp: 14:13:27.775 

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
<meta http-equiv="refresh" content="5"/> 
<meta http-equiv="cache-control" content="no-cache"> 
<title>IQS WebServer</title> 
<style type="text/css"> 
    body {font-family: Tahoma, Verdana, Arial, sans-serif; font-size: 0.8em;} 
    table {/*font-size: 0.8em;*/ /*font-family: monospace;*/} 
    .CaptionRow {font-weight:bold; background: #EFF3EB;} 
    .OddRow {background: #EFF3EB;} 
</style> 
</head> 

И есть тело оттуда.

Я не знаю, почему его выбрасывает 500 и почему нет тега HTML, но мне все равно, насколько плохо сформирован ответ - я просто хочу получить ответ и обработать данные содержащихся внутри него, но библиотека не позволяет этого. Ответ является нулевым, и я, таким образом, застрял.

+0

О, и я попытался установить KeepAlive = false. Я также попытался переключить ProtocolVersion на версии 10 и Версии11, и ничего не работает. Кажется, это обычные трюки, которые работают на других. – tnktnk

+0

В WebException есть свойство Response. Я точно не помню, но может быть, что в условиях ошибок это будет где ответ. –

+0

Правильно, поэтому, когда вы находитесь в ветке catch, вам нужно отбросить e.Response следующим образом: (HttpWebResponse) e.Response. Моя проблема в том, что ответ равен нулю. Этого просто нет. Кроме того, что это действительно так, но библиотека предпочла оставить его нулевым. – tnktnk

ответ

0

https://msdn.microsoft.com/en-us/library/65ha8tzh(v=vs.110).aspx «По умолчанию .NET Framework строго соблюдает RFC 2616 URI разбора. Некоторые ответы сервера могут включать в себя управляющие символы в запрещенных областях, которые будут вызывать метод HttpWebRequest.GetResponse(), чтобы бросить WebException. If useUnsafeHeaderParsing установлено значение true, HttpWebRequest.GetResponse() не будет выбрасывать в этом случае, однако ваше приложение будет уязвимо к нескольким формам разбора партией URI. Лучшим решением является изменение сервера, чтобы ответ не включал контрольные символы. "

Другая распространенная проблема связана с серверами, которые отправляют только концы строк LF, где HTTP требует CRLF. Вы должны посмотреть на гексагон, чтобы сказать разницу, иначе это не видно. useUnsafeHeaderParsing также должен помочь здесь.

+0

Я установил useUnsafeHeaderParsing = Да в моем файле app.config, и это не делает ничего другого. Я не могу получить доступ к объекту Response, потому что он равен нулю. – tnktnk

+0

Я также установил максимумErrorResponseLength = -1 и maximumResponseHeadersLength = -1, и это также не повлияло. Объект ответа имеет значение NULL. – tnktnk

+0

Я предполагаю, что вы имели в виду «истину» вместо «Да» ... – Tratcher