调用GetRequestStream在ASP.Net中工作,但不适用于控制台应用程序

时间:2012-05-17 17:02:09

标签: asp.net .net api console webrequest

我在ASP.Net类中有一些代码,我已经在我的基于Web的应用程序上使用了两年多了。我希望在命令行工具中执行一些类似的业务功能。我在两个应用程序中使用相同的代码,但命令行应用程序在代码底部附近调用“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();

1 个答案:

答案 0 :(得分:3)

你正在呼叫GetResponse,但从不处理它。这将保持连接活着,直到响应完成。基本上,您应该使用using语句作为响应:

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

因为你永远不会释放连接,当你用完了任何一台主机的并发连接限制时,你基本上都在等待释放旧的连接。如果你妥善处理了你的回答,那就不会有问题了。

它可能只在ASP.NET中工作,因为其他工作导致垃圾收集(因此最终确定) - 但是及时处理响应仍然会更好。