Почему я получаю исключение ProtocolViolationException при попытке использовать HttpWebRequest? - PullRequest
5 голосов
/ 19 марта 2010

Понятия не имею. Я пытаюсь получить 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 .. это вызывает проблему? Благодаря.

Ответы [ 4 ]

15 голосов
/ 12 ноября 2010

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

8 голосов
/ 04 мая 2011

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

Вы, вероятно, хотите установить для заголовка «Accept» значение «text / xml», а не для заголовка типа контента.

1 голос
/ 28 октября 2011

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

0 голосов
/ 26 октября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...