10

ASP.Net アプリケーションでは、ページの応答を保持することなく、ユーザー入力に応答して http POST 経由で外部サーバーにデータ (urlEncodedUserInput) を送信する必要があります。他のサーバーからの応答が何であるかは問題ではなく、要求が時々失敗するかどうかは気にしません。これは正常に動作しているように見えますが (以下を参照)、決して使用されない応答を待っているバックグラウンドでリソースを拘束しているのではないかと懸念しています。

コードは次のとおりです。

httpRequest = WebRequest.Create(externalServerUrl);

httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8";

bytedata = Encoding.UTF8.GetBytes(urlEncodedUserInput);
httpRequest.ContentLength = bytedata.Length;

requestStream = httpRequest.GetRequestStream();
requestStream.Write(bytedata, 0, bytedata.Length);
requestStream.Close();

かなり標準的なものですが、通常、この時点で、応答を非同期で受信したい場合は httpRequest.getResponse() または httpRequest.beginGetResponse() を呼び出しますが、これは私のシナリオでは必要ないようです。

私は正しいことをしていますか?httpRequest.Abort() を呼び出してクリーンアップする必要がありますか、またはこれにより、低速の接続でリクエストが送信されるのを防ぐことができますか?

4

2 に答える 2

7

Threadpool.QueueUserWorkItemがあなたが探しているものだと思います。ラムダと匿名型を追加すると、これは非常に簡単になります。

var request = new { url = externalServerUrl, input = urlEncodedUserInput };
ThreadPool.QueueUserWorkItem(
    (data) =>
    {
         httpRequest = WebRequest.Create(data.url);

         httpRequest.Method = "POST";
         httpRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8";

         bytedata = Encoding.UTF8.GetBytes(data.input);
         httpRequest.ContentLength = bytedata.Length;

         requestStream = httpRequest.GetRequestStream();
         requestStream.Write(bytedata, 0, bytedata.Length);
         requestStream.Close();
         //and so on
     }, request);
于 2009-01-16T04:37:33.223 に答える
0

私が考えることができる唯一の方法は、投稿しているページで ThreadPool.QueueUserWorkItem を使用してスレッドを開いて、時間のかかる作業が完了する前にメインスレッドが応答を終了するようにすることです。完了。メインスレッドが終了すると、キャッシュやサーバー変数などがないことを意味する HttpContext にアクセスできないことを知っておく必要があります...また、新しいスレッドで権限を持つユーザーになりすます場合を除き、共有ドライブは機能しません。スレッドは素晴らしいですが、注意すべき点がたくさんあります。

于 2009-05-09T15:51:05.123 に答える