Ошибка при закрытии соединения при попытке прочитать ответ от FitNesse REST URI - PullRequest
3 голосов
/ 10 ноября 2009

Вы столкнулись с этой проблемой? Я запускаю код, очень похожий на код из этого предыдущего вопроса , когда в режиме nUnitTest и URI содержит «/? Test & format = xml», тест nUnit завершается неудачно с IOException, «невозможно прочитать данные из транспорта Соединение: Соединение закрыто. "

Однако трассировка Fiddler, которая была запущена в то время, показывает тот самый xml, который я ожидал.

Я воссоздаю заголовки запросов точно (почти) так, как они отправляются при отправке через браузер.

Наконец, если я пропущу "/? Test & format = xml" из URI, я получу HTML, который в противном случае ожидал бы.

ИСТОЧНИК КОД:

    public virtual bool Run()
    {
        var request = CreateRequest();
        var response = GetResponse(request);
        var responseString = ReadResponse(response);
        this.SetResults(responseString);
        return this.IsSuccessful;
    }

    protected internal virtual HttpWebRequest CreateRequest()
    {
        var address = TestConfig.Address;

        var request = (HttpWebRequest)WebRequest.Create(address);

        request.Accept = "*/*";
        request.UseDefaultCredentials = true;
        request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);

        return request;
    }

    protected internal virtual HttpWebResponse GetResponse(HttpWebRequest request)
    {
        var response = (HttpWebResponse) request.GetResponse();

        return response;
    }

    protected internal virtual string ReadResponse(HttpWebResponse response)
    {
        var stream = response.GetResponseStream();
        var responseString = ReadResponse(stream);

        stream.Close();
        response.Close();

        return responseString;
    }

    protected internal virtual string ReadResponse(Stream stream)
    {
        var reader = new StreamReader(stream);
        var responseString = reader.ReadToEnd();
        return responseString;
    }

1 Ответ

0 голосов
/ 23 февраля 2012

Сообщение об ошибке «Невозможно прочитать данные из транспортного соединения: соединение закрыто». на самом деле не связан с тем фактом, что вы видите, как Fiddler возвращает тело ответа html.

Проверьте StatusCode HttpWebResponse (должно быть 200, если все в порядке), также оберните запрос в блок try / catch (пример из http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.statuscode(v=vs.80).aspx)

try 
   {    
        // Creates an HttpWebRequest for the specified URL. 
        HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
        // Sends the HttpWebRequest and waits for a response.
        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); 
        if (myHttpWebResponse.StatusCode == HttpStatusCode.OK)
           Console.WriteLine("\r\nResponse Status Code is OK and StatusDescription is: {0}",
                                myHttpWebResponse.StatusDescription);
        // Releases the resources of the response.
        myHttpWebResponse.Close(); 

    } 
catch(WebException e) 
   {
        Console.WriteLine("\r\nWebException Raised. The following error occured : {0}",e.Status); 
   }
catch(Exception e)
{
    Console.WriteLine("\nThe following Exception was raised : {0}",e.Message);
}

Если вы быстро создаете и удаляете объект HttpWebRequest, возможно, вы переводите сокет в состояние time_wait, когда он выключается, тогда вы не сможете открыть его снова, пока он полностью не закроется. Если это так, изучите возможность использования другого порта или изменения времени жизни соединения.

...