2009-12-11 2 views
1

Приветствия, все. Вот моя ситуация. Я пытаюсь сделать HttpWebRequest локальным файлом обработчика, и я продолжаю получать следующее исключение:IOException при создании HttpWebRequest для локального файла ASHX

Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом.

Теперь я использую файл локального обработчика, потому что я пишу код интеграции для третьей стороны, которую будет использовать сайт. Пока у меня нет тестовой среды для выполнения запросов, я в основном издеваюсь над процессом с локальным файлом обработчика. Вот соответствующий код. Благодарю.

WebRequest код (подзапрос переменная является объектом передается методу выполнения этого кода):

XmlSerializer serializer; 
XmlDocument xmlDoc = null; 

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(requestUrl); 
webRequest.Method = "POST"; 
webRequest.ContentType = "text/xml"; 
webRequest.KeepAlive = true; 
webRequest.Accept = "*/*"; 

serializer = new XmlSerializer(subRequest.GetType()); 
XmlWriter writer = new XmlTextWriter(webRequest.GetRequestStream(), Encoding.UTF8); 
serializer.Serialize(writer, subRequest); 
writer.Close(); 

xmlDoc = new XmlDocument(); 
xmlDoc.Load(XmlReader.Create(webRequest.GetResponse().GetResponseStream())); 

"requestUrl" определяется как "http://localhost:2718/Handlers/MyHandler.ashx". Я могу просто ударить файл обработчика и пройти через код. Все это делает сборку ответ XML в виде строки и записывает его в объект Response:

context.Response.ContentType = "text/xml"; 
string newSubscriptionId = Utils.GetUniqueKey(); 

StringBuilder sb = new StringBuilder(); 
sb.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); 
// Assemble XML string here 

context.Response.Write(sb.ToString()); 

Насколько я могу сказать, что это все работает просто отлично. Но когда мой код попадает в последнюю строку WebRequest фрагмента:

xmlDoc.Load(XmlReader.Create(webRequest.GetResponse().GetResponseStream())); 

ли когда исключение. Есть идеи? Заранее спасибо.

Джеймс

+0

LOL! И точно так же, как только я отправил этот вопрос, я получил детали подключения для тестовой среды, которую я ждал. Забавно. По-прежнему будет признателен за ответ или предложение по этому вопросу, однако, если это снова появится. :) –

ответ

0

Во-первых, если вы не собираетесь повторно использовать соединение или там не будет еще один запрос к той же схеме/сервер/порт, я бы установить KeepAlive ложь.

Проблема заключается в том, что XmlDocument.Load() не читает весь поток до того, как сервер закрывает соединение, или что она продолжает чтение после конца, и когда сервер поддержания активности тайм-аут закончен, соединение закрывается сервером. Кроме того, вы никогда не закрываете поток ответов. Чтобы убедиться в правильности этой теории, сделайте следующее:

// Optional -> webRequest.KeepAlive = false; 
string xml = null; 
using (StreamReader reader = new StreamReader (webRequest.GetResponse().GetResponseStream())) { 
    xml = reader.ReadToEnd(); 
} 
xmlDoc.LoadXml (xml); 

и проверьте, не устраняет ли эта проблема.