1

我已经在基于 Web 的应用程序上使用了两年多的 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 回答