Почему я получаю исключение ProtocolViolationException при попытке использовать HttpWebRequest?

StackOverflow https://stackoverflow.com/questions/2480258

  •  21-09-2019
  •  | 
  •  

Вопрос

Я понятия не имею.Я пытаюсь получить XML из службы REST в приложении, которое я создаю для Windows Phone.Я всегда получаю исключение в следующей строке:

HttpWebResponse response = request.EndGetResponse(ar) as HttpWebResponse;

У меня есть следующая настройка (игнорируйте неверный URL, это всего лишь пример..)

HttpWebRequest request = WebRequest.Create("https://domain.chargify.com/customers.xml") as HttpWebRequest;
NetworkCredential credentials = new NetworkCredential("appkeyhere", "password");
request.Credentials = credentials;
request.Method = "GET";
request.ContentType = "text/xml";
request.BeginGetResponse(new AsyncCallback(SomeCallback), request);
...
private void SomeCallback(IAsyncResult ar) {
    HttpWebRequest request = ar.AsyncState as HttpWebRequest;
    HttpWebResponse response = request.EndGetResponse(ar) as HttpWebResponse;
    StreamReader reader = new StreamReader(response.GetResponseStream());
    XElement xmlResult = XElement.Parse(reader.ReadToEnd());
    ...
}

Исключение заключается в следующем:

System.Net.ProtocolViolationException was unhandled
Message=ProtocolViolationException
  StackTrace:
       at System.Net.Browser.ClientHttpWebRequest.PrepareAndSendRequest(String method, Uri requestUri, Stream requestBodyStream, WebHeaderCollection headerCollection, CookieContainer cookieContainer)
       at System.Net.Browser.ClientHttpWebRequest.BeginGetResponseImplementation()
       at System.Net.Browser.ClientHttpWebRequest.InternalBeginGetResponse(AsyncCallback callback, Object state)
       at System.Net.Browser.AsyncHelper.BeginOnUI(BeginMethod beginMethod, AsyncCallback callback, Object state)
       at System.Net.Browser.ClientHttpWebRequest.BeginGetResponse(AsyncCallback callback, Object state)
       at ChargifyWPA.MainPage.button1_Click(Object sender, RoutedEventArgs e)
       at System.Windows.Controls.Primitives.ButtonBase.OnClick()
       at System.Windows.Controls.Button.OnClick()
       at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
       at System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
       at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName)

У кого-нибудь есть какие-нибудь идеи?Это https, а не http ..является ли это причиной проблемы?Спасибо.

Это было полезно?

Решение

Держу пари, эта проблема связана с тем, что вы устанавливаете заголовок 'ContentType', но не предоставляете содержимое в своем запросе.Обратите внимание, что исключение протокола генерируется при попытке создать запрос.

Вероятно, вы имеете в виду установить для заголовка 'Accept' значение "text / xml", а не для заголовка content type.

Другие советы

Это не ваша проблема, но это может помочь кому-то другому.Я столкнулся с этим, потому что вызывал BeginGetRequestStream() по запросу GET.Конечно, в этом нет необходимости, и я должен был просто вызвать BeginGetResponse().Глупая ошибка, но я бы разобрался с этим намного быстрее, если бы сообщение об ошибке было более полезным.

Заголовок "Content-Type" с "GET" вызывает исключение, если оно присутствует в запросе В Azure Table REST API требуется закодировать ContentType в заголовок auth, хотя используйте пустую строку для заголовка GET "ContentType"

По-видимому, наиболее распространенной причиной этой ошибки на рабочем столе в наши дни является веб-сервер, который требует проверки подлинности SSL, а не TLS.Смотрите все комментарии по в этой статье объясняются варианты устранения неполадок для различных ошибок HTTP .NET 2.Похоже, ваш Chargify, лицензированный MIT.СЕТЕВОЙ проект CodePlex уже запущен. используя этот обходной путь ("SecurityProtocolType.Ssl3").

Другие варианты, которые можно попробовать из еще одна статья около 2008 года возвращаются к HTTP / 1.0 или отключают функцию Keep-Alive.

Обязательно попробуйте этот ответ, удаляя инициализацию ContentType.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top