IIS 停止响应请求,直到 运行 此方法后重新启动

IIS stops responding to requests until restart after running this method

我试图使用此代码从保留我的会话的处理程序中调用处理程序,但在我通过 ajax 调用它之后,IIS 将不会响应任何其他请求,直到重新启动,我无法弄清楚为什么。

我仅限于 .net 2.0

我试图找到 google 类似的问题,但我没有找到任何有用的东西,只有一些东西需要寻找,比如关闭响应和 reader 使用后..我是否忽略了其他东西?

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 方法从另一个 Handler 调用一个 Handler 中的函数,发送几个变量参数(名称=值,如什么形式或 ajax 或 GET url 确实)并在使用相同会话时从它那里得到一些响应我可以以同步方式访问 .net 2 C# 代码中的第一个处理程序 context.Session 而不必担心它会挂起除原始请求之外的所有其他内容(直到它被解决).

默认情况下,Asp.Net 每个 Session 只允许一个并发请求。因此,如果您有一个请求 运行ning,并且在该请求期间您试图 运行 同一会话中的另一个请求,那么您实际上是在陷入僵局。

您可以通过将两个处理程序声明为仅需要对会话的读取权限来解决此问题。这可以通过让处理程序实现 IReadOnlySessionState 而不是 IRequiresSessionState 来完成。当然,可能的缺点是处理程序将无法访问 store/update 会话,但优点是多个请求可以 运行 并行。

您也可以通过不使用 Web 请求从第一个处理程序调用第二个处理程序来解决此问题。相反,请确保可以直接从第一个处理程序调用另一个处理程序用来完成其工作的代码。这将是一个更好的选择,因为您消除了打开连接、发送请求和接收响应的开销。