2012-05-17 58 views
1

我在我的基於Web的應用程序中使用了兩年多的ASP.Net類中有一些代碼。我正在尋求在命令行工具中執行一些類似的業務功能。我在兩個應用程序中都使用相同的代碼,但命令行應用程序在代碼底部附近對「GetRequestStream」的調用超時。調用GetRequestStream在ASP.Net中工作,但不能用於控制檯應用程序

如果我關閉了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(); 

回答

2

你打電話給GetResponse,但從不處置它。這樣可以保持連接直到響應完成。基本上,你應該使用using聲明的響應:

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

因爲你永遠不會釋放連接,當您用完的併發連接限制的任何一臺主機,你基本上是在等待舊的連接被釋放。如果你正確地處理你的迴應,這不會是一個問題。

它可能只在ASP.NET中工作,因爲其他工作正在導致垃圾收集(因此最終確定) - 但它仍然會更好地及時處置響應。

+0

謝謝Jon。我認爲這是垃圾收集爲我處理的事情。這工作得很好! –

相關問題