2012-06-22 3 views
3

Я использую метод Джона Скита ReadFully реализован здесь:Запрос был прерван: соединение было закрыто неожиданно

public static byte[] ReadFully(Stream stream) 
{ 
    var buffer = new byte[32768]; 
    using (var ms = new MemoryStream()) 
    { 
     while (true) 
     { 
      int read = stream.Read(buffer, 0, buffer.Length); 
      if (read <= 0) 
       return ms.ToArray(); 
      ms.Write(buffer, 0, read); 
     } 
    } 
} 

Он бросает исключение на линии:

int read = stream.Read(buffer, 0, buffer.Length); 

сообщение об ошибке The request was aborted: The connection was closed unexpectedly ,

Отправляю xml-запрос на веб-сервис. Мой метод отправки выглядит следующим образом:

private static string SendRequest(XElement request, string url) 
{ 
    var req = (HttpWebRequest)WebRequest.Create(url); 
    req.ContentType = "application/soap+xml;"; 
    req.Method = "POST"; 
    req.KeepAlive = false; 
    req.Timeout = System.Threading.Timeout.Infinite; 
    req.ReadWriteTimeout = System.Threading.Timeout.Infinite; 
    req.ProtocolVersion = HttpVersion.Version10; 
    req.AllowWriteStreamBuffering = false; 

    using (var stm = req.GetRequestStream()) 
    { 
     using (var stmw = new StreamWriter(stm)) 
     { 
      stmw.Write(request.ToString()); 
     } 
    } 

    Stream responseStream; 
    using (var webResponse = req.GetResponse()) 
    { 
     responseStream = webResponse.GetResponseStream(); 
    } 

    // Do whatever you need with the response 
    var myData = ReadFully(responseStream); 
    string responseString = Encoding.ASCII.GetString(myData); 

    return responseString; 
} 

Я попытался без и без следующих переменных, заданных, и это дает мне то же сообщение:

req.KeepAlive = false; 
req.Timeout = System.Threading.Timeout.Infinite; 
req.ReadWriteTimeout = System.Threading.Timeout.Infinite; 
req.ProtocolVersion = HttpVersion.Version10; 
req.AllowWriteStreamBuffering = false; 

ответ

8

Проблема заключается в этой части кода:

// wrong way to do it! 
Stream responseStream; 
using (var webResponse = req.GetResponse()) 
{ 
    responseStream = webResponse.GetResponseStream(); 
} 

// Do whatever you need with the response 
var myData = ReadFully(responseStream); 

Вы удаляете свой объект ответа перед чтением из его потока. Попробуйте что-то вроде этого:

byte[] myData; 
using (var webResponse = req.GetResponse()) 
{ 
    var responseStream = webResponse.GetResponseStream(); 
    myData = ReadFully(responseStream); // done with the stream now, dispose of it 
} 

// Do whatever you need with the response 
string responseString = Encoding.ASCII.GetString(myData); 
+1

Вы потрясающий. Это сработало. Наверное, это то, что я получаю от слишком большого доверия к Решарперу. – Xaisoft