Ошибка Bizzare HttpWebResponse: ServerProtocolViolation - PullRequest
5 голосов
/ 30 января 2011

Я перепробовал все и не могу понять, почему происходит эта ошибка.

Фон : У меня есть приложение IPad, написанное на MonoTouch, и у меня есть поток, который работает в фоновом режиме, и каждые 15 секунд я синхронизирую данные с сервером. Это работает первые несколько итераций потока, но в итоге я получаю следующую трассировку стека.

An exception occured: System.Net.WebException: Error getting response stream (ReadDone4): ServerProtocolViolation ---> System.FormatException: Input string was not in the correct format
  at System.UInt32.Parse (System.String s) [0x00010] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System/UInt32.cs:405 
  at System.Net.WebConnection.GetResponse (System.Byte[] buffer, Int32 max) [0x000ba] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/WebConnection.cs:565 
  at System.Net.WebConnection.ReadDone (IAsyncResult result) [0x00095] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/WebConnection.cs:446 
  --- End of inner exception stack trace ---
  at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) [0x0005e] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:819 
  at System.Net.HttpWebRequest.GetResponse () [0x0000e] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:827 
  at SyncService.REST.RestClient.Execute[IEnumerable`1] (SyncService.REST.RestRequest request) [0x00079] in /Users/Chris/Compass/SyncService/REST/RestClient.cs:42 

Я говорю с веб-сервером IIS с конфигурацией по умолчанию. Вот метод, который я вызываю:

public RestResponse<T> Execute<T>(RestRequest request){
    var restResponse = new RestResponse<T>();
    var serializer = new JavaScriptSerializer();
    var urlPath = _baseUrl + "/" + request.Resource;
    var httpRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri(urlPath));

    httpRequest.Headers = request.Headers;
    Authenticator.Authenticate(httpRequest);

    httpRequest.Method = request.Method.ToString();
    if (request.Method == Method.POST)
        SetPostData(httpRequest, request);

    HttpWebResponse httpResponse = null;
    try{
        httpResponse = (HttpWebResponse) httpRequest.GetResponse();
        var reader = new StreamReader(httpResponse.GetResponseStream());
        var responseString = reader.ReadToEnd();
        reader.Close();
        restResponse.StatusCode = httpResponse.StatusCode;
        restResponse.Headers = httpResponse.Headers;
        restResponse.Data = serializer.Deserialize<T>(responseString);
        restResponse.ResponseStatus = ResponseStatus.Completed;
    } 
    catch(WebException e){

        restResponse.ResponseStatus = ResponseStatus.Error;
        restResponse.ErrorMessage = e.Message;
        restResponse.ErrorException = e;
        var webResponse = (HttpWebResponse) e.Response;
        if (webResponse != null){
            restResponse.StatusCode = webResponse.StatusCode;
            restResponse.Headers = webResponse.Headers;
        }
        if (restResponse.StatusCode != HttpStatusCode.NotModified)
            Console.WriteLine("An exception occured: " + e + "\r\n");
    }catch (Exception ex) {
        restResponse.ResponseStatus = ResponseStatus.Error;
        restResponse.ErrorMessage = ex.Message;
        restResponse.ErrorException = ex;
    }

    if (httpResponse != null) 
        httpResponse.Close();

    return restResponse;
}

Пожалуйста, помогите. Я не знаю что делать Google ничего не показывает.

Я могу сделать 22 успешных запроса до появления ошибки.

EDIT Я сузил это, чтобы быть проблемой сервера. Это asp.net MVC, и исключение происходит только тогда, когда я отправляю 304 клиенту. См. Код сервера:

private void ServeHttpStatusCode() {
    Response.StatusCode = 304;
    Response.Status = "304 Not Modified";
    Response.StatusDescription = "The resource you are requesting has not been modified";
    Response.ContentType = "application/json";
    Response.Write("{\"Error\":\"The resource you are requesting has not been modified\"}");
    Response.End();
    Response.Close();
}

Ответы [ 2 ]

2 голосов
/ 30 января 2011
  • Есть ли прокси между клиентом а сервер?
  • Всегда ли происходит сбой после 22 запросов? Исключение указывает, что некоторые UInt32 не могут быть проанализированы.
  • Получаете ли вы исключения на стороне сервера?
1 голос
/ 10 ноября 2011

В случае, если кто-то еще изучает Интернет в поисках ответов на этот вопрос, у меня была очень похожая проблема с некоторыми функциональными тестами, которые я писал.Они загружали контент на веб-сервер, используя http PUT, а затем сразу после этого использовали http GET.

GET надежно завершился ошибкой с той же ошибкой при разборе Uint32.Сборка окон была в порядке.В отчаянии я использовал Thread.Sleep (20) для вставки некоторой задержки между http-запросами, и это устранило ошибку.Не уверен, почему, но теперь это работает, что достаточно для моих тестов, если не для производства.

...