1

Web ベースのアプリケーションで 2 年以上使用してきた ASP.Net クラスのコードがいくつかあります。コマンドラインツールで同様のビジネス機能を実行しようとしています。両方のアプリケーションで同じコードを使用していますが、コマンド ライン アプリケーションは、コードの下部にある「GetRequestStream」の呼び出しでタイムアウトしています。

req と req2 を使い終わったときに閉じると、GetRequestStream の呼び出しが機能するようになりました。ただし、req3 が認証されるためには、req と req2 を開いたままにしておく必要があります。そのため、req と req2 を開いたままにしておくと、GetRequestStream がタイムアウトします。req と req2 を閉じると、GetRequestStream の呼び出しは機能しますが、req3 は認証に失敗します。

前述したように、まったく同じコードが Web ベースの ASP.Net アプリケーションとして正常に動作します。このクラスを使用してコンソール ベースのアプリケーションとしてビルドする場合にのみ、これらの問題が発生します。

これは接続に関するものに違いないと考えていますが、.Net からコマンド ライン アプリを構築するのはかなり初めてです。

どんな助けでも大歓迎です。

            string uri = baseUri + "auth/authrequired";
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
            req.Timeout = 1000000;
            req.Proxy = null;
            req.CookieContainer = cc;
            var MyWebResponse = (WebResponse)req.GetResponse();

            uri = baseUri + "authenticated/identity";
            HttpWebRequest req2 = (HttpWebRequest)WebRequest.Create(uri);
            req2.Timeout = 1000000;
            req2.Proxy = null;
            req2.CookieContainer = cc;
            MyWebResponse = req2.GetResponse();

            uri = baseUri + "j_security_check";
            string reqParams = "j_username=" + "jmclaughlin" + "&j_password=" + "jmclaughlin";  
            byte[] reqData = Encoding.UTF8.GetBytes(reqParams);

            HttpWebRequest req3 = (HttpWebRequest)WebRequest.Create(uri);
            req3.Timeout = 1000000;
            req3.Proxy = null;
            req3.CookieContainer = cc;
            req3.Method = "POST";
            req3.ContentType = "application/x-www-form-urlencoded";
            req3.AllowAutoRedirect = true;
            req3.ContentLength = reqData.Length;
            using (var s = req3.GetRequestStream())
                s.Write(reqData, 0, reqData.Length);
            MyWebResponse = req3.GetResponse();
4

1 に答える 1

3

を呼び出していますがGetResponse、破棄しないでください。これにより、応答が完了するまで接続が維持されます。using基本的に、応答にはステートメントを使用する必要があります。

using (var response = req.GetResponse())
{
    // Do whatever with the response
}

接続を決して解放しないため、いずれかのホストへの同時接続の制限を使い果たした場合、基本的には古い接続が解放されるのを待っています。応答を適切に破棄すれば、問題にはなりません。

他の作業がガベージ コレクション (したがってファイナライズ) を引き起こしているため、おそらく ASP.NET でのみ機能していますが、タイムリーに応答を破棄することをお勧めします。

于 2012-05-17T17:03:58.047 に答える