簡體   English   中英

IIS 停止響應請求,直到運行此方法后重新啟動

[英]IIS stops responding to requests until restart after running this method

我試圖從 Handler 調用 Handler 保留我的 Session 使用此代碼,但在我通過 ajax 調用它之后,IIS 在重新啟動之前不會響應任何其他請求,我無法弄清楚原因。

我僅限於 .net 2.0

我試圖找到谷歌類似的問題,但我沒有找到任何有用的東西,只有一些東西需要尋找,比如使用后關閉響應和閱讀器..我是否忽略了其他東西?

public void Method() {
    string url = string.Format("OtherHandler.ashx");

    ASCIIEncoding encoder = new ASCIIEncoding();
    string poststring = String.Format("field1={0}&field2={1}", "a", "b");
    byte[] data = encoder.GetBytes(poststring); // a json object, or xml, whatever...

    CookieContainer cookieContainer = new CookieContainer();
    HttpCookieCollection httpCookies = HttpContext.Current.Request.Cookies;
    for (int j = 0; j < httpCookies.Count; j++)
    {
        HttpCookie httpCookie = httpCookies.Get(j);
        Cookie myCookie = new Cookie();

        // Convert between the System.Net.Cookie to a System.Web.HttpCookie...
        myCookie.Domain = context.Request.Url.Host;
        myCookie.Expires = httpCookie.Expires;
        myCookie.Name = httpCookie.Name;
        myCookie.Path = httpCookie.Path;
        myCookie.Secure = httpCookie.Secure;
        myCookie.Value = httpCookie.Value;

        cookieContainer.Add(myCookie);
    }

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(context.Request.Url.GetLeftPart(UriPartial.Path).ToString().Replace("ThisHandler.ashx", url));
    req.Proxy = null;
    req.Method = "POST";
    req.ContentType = "text/plain";
    req.ContentLength = data.Length;
    req.CookieContainer = cookieContainer;

    string responseFromServer = "";


    WebResponse response = req.GetResponse();
    Stream dataStream = response.GetResponseStream();
    HttpStatusCode statusCode = ((HttpWebResponse)response).StatusCode;

    StreamReader reader = new StreamReader(dataStream);
    responseFromServer = reader.ReadToEnd();

    response.Close();
    reader.Close();
}

我希望能夠使用 POST 方法從另一個處理程序調用一個處理程序中的函數,發送幾個變量參數(名稱=值,如表單或 ajax 或 GET url 所做的那樣)並在使用相同的會話時從中獲得一些響應我可以訪問在 .net 2 C# 代碼中的第一個處理程序 context.Session 中以同步方式而不用擔心它會掛起除原始請求之外的所有其他內容(直到它被解決)。

默認情況下, Asp.Net每個Session只允許一個並發請求。 因此,如果您正在運行一個請求,並且在該請求期間您嘗試在同一會話中運行另一個請求,那么您實際上是在使自己陷入僵局。

您可以通過將兩個處理程序聲明為只需要對會話進行讀取訪問來解決它。 這可以通過讓處理程序實現IReadOnlySessionState而不是IRequiresSessionStateIRequiresSessionState 當然,可能的缺點是處理程序無權存儲/更新會話,但優點是可以並行運行多個請求。

您也可以通過不使用 Web 請求從第一個處理程序調用第二個處理程序來解決此問題。 而是確保可以直接從第一個處理程序調用另一個處理程序用來完成其工作的代碼。 這將是一個更好的選擇,因為您消除了打開連接、發送請求和接收響應的開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM