2009-12-11 4 views
1

Salutations, toutes. Voici ma situation. Je tente de faire un HttpWebRequest à un fichier de gestionnaire local et je reçois toujours l'exception suivante:IOException lors de la création de HttpWebRequest dans le fichier ASHX local

Impossible de lire les données à partir de la connexion de transport: une connexion existante a été forcée par l'hôte distant. Maintenant, j'utilise un fichier de gestionnaire local car j'écris un code d'intégration pour un tiers que le site utilisera. Jusqu'à ce que je dispose d'un environnement de test pour effectuer des requêtes, je me moque du processus avec un fichier de gestionnaire local. Voici le code pertinent. Merci.

Code WebRequest (Variable SubRequest est un objet passé à la méthode d'exécution de ce code):

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())); 

Le "requestUrl" est défini comme "http://localhost:2718/Handlers/MyHandler.ashx". Je peux très bien saisir le fichier du gestionnaire et passer le code. Tout ce qu'il fait est assembler une réponse XML comme une chaîne et l'écrit vers l'objet 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()); 

Pour autant que je peux dire, tout cela est fonctionne très bien. Mais quand frappe mon code de la dernière ligne du morceau WebRequest:

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

est quand l'exception est levée. Des idées? Merci d'avance.

James

+0

LOL! Et juste comme ça, dès que j'ai posté cette question, j'ai reçu les détails de connexion pour l'environnement de test que j'attendais. Ca c'est drôle. J'apprécierais quand même une réponse ou une suggestion à cette question, au cas où cela reviendrait. :) –

Répondre

0

Tout d'abord, si vous ne souhaitez pas réutiliser la connexion ou il ne va pas être une autre demande au même schéma/serveur/port, je mettrais KeepAlive false.

Le problème est que XmlDocument.Load() ne lit pas la totalité du flux avant que le serveur ferme la connexion ou qu'il continue à lire au-delà de la fin et lorsque le serveur délai d'attente keep-alive est terminée, la connexion est fermée par le serveur. En outre, vous ne fermez jamais le flux de réponse. Pour vérifier que cette théorie est correcte, faites quelque chose comme:

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

et de voir si cela résout votre problème.

Questions connexes