1

皆さん、こんにちは。これが私の状況です。ローカル ハンドラー ファイルに対して HttpWebRequest を作成しようとしていますが、次の例外が引き続き発生します。

トランスポート接続からデータを読み取れません: 既存の接続がリモート ホストによって強制的に閉じられました。

現在、サイトが使用するサードパーティ向けの統合コードを作成しているため、ローカル ハンドラー ファイルを使用しています。リクエストを送信できるテスト環境ができるまでは、基本的にローカル ハンドラ ファイルを使用してプロセスをモックしています。関連するコードは次のとおりです。ありがとう。

WebRequest コード (subRequest 変数は、このコードを実行するメソッドに渡されるオブジェクトです):

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

例外がスローされたときです。何か案は?前もって感謝します。

ジェームズ

4

1 に答える 1

0

まず、接続を再利用するつもりがない場合、または同じスキーマ/サーバー/ポートへの別の要求がない場合は、KeepAlive を false に設定します。

問題は、サーバーが接続を閉じる前にXmlDocument.Load()がストリーム全体を読み取らないか、最後まで読み取り続け、サーバーのキープアライブ タイムアウトが終了すると、接続がサーバーによって閉じられることです。また、応答ストリームを閉じることはありません。この理論が正しいことを確認するには、次のようにします。

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

問題が解決するかどうかを確認してください。

于 2009-12-15T05:16:24.517 に答える