2013-03-07 73 views
9

將產品升級到.NET 4.5後,我們在網站上發現了一些奇怪的行爲。我會盡量做到儘可能具體,但問題是模糊的,請耐心等待。此外,對於這種情況,假設沒有遵循最佳做法進行工作。ASP.NET請求和.NET 4.5 - 奇怪行爲

用戶正在進入一個頁面,這個頁面會異步地向web服務發出一些jQuery Ajax調用。由於此頁面設計/編碼較差,因此可能需要永久加載,但它確實提供了用戶需要訪問的子菜單。一旦頁面開始加載,他們點擊一個菜單選項轉到另一頁面。迄今爲止沒有太特別的。

當我們使用性能監視器與.NET 4.0只裝一箱,我們可以看到ASP.NET請求去向上和向下,你所期望的:

Perfmon on 4.0 box

當我們上安裝它一個安裝了.NET 4.5的盒子,我們得到: enter image description here

在執行上面描述的工作流之後,請求就會掛起。不排隊;他們只是坐在那裏。經過進一步研究,我們注意到兩個不同頁面之間的點擊不僅僅是一個簡單的href,而是實際使用Response.Redirect(url)。

另外,這隻在使用IE時纔會發生。使用Firefox和Chrome時,這不是問題。

這裏是我們到目前爲止已經試過:

  1. 我們接觸過M $並送他們出去DebugDiag資料轉儲。還在等待。
  2. 我已經去了IIS,設置網站跟蹤失敗的請求,並設置了一個失敗的請求過濾器給我一切。一旦網站鎖定,我清除日誌,然後檢查網站鎖定後發生的情況。每次它在AspNetSessionDataBegin和AspNetSessionDataEnd事件之間掛起。
  3. 我們確實有一個讀/寫會話的HttpHandler,禁用它似乎可以解決大部分問題,但沒有解釋爲什麼。
  4. jquery的onunload處理程序,它應該清理並中止所有剩餘的xmlhttp請求,似乎不會不斷執行。
  5. 安裝了這個patch,仍然沒有幫助。
  6. 我們目前正在將此導航邏輯中的Response.Redirect(url)方法更改爲Response.Redirect(url,false); (往上看)。

同樣的要求,這裏是HttpHandler的代碼:

public class KeepSessionAliveHttpHandler : IHttpHandler, IRequiresSessionState 
{ 
    public bool IsReusable 
    { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 

     if (context.Session.IsNewSession) 
     { 
      string redirectUrl = context.Request.Url.AbsoluteUri.Replace(context.Request.Url.AbsolutePath, VirtualPathUtility.ToAbsolute(Constant.Page_Logout)); 
      context.Response.Clear(); 
      context.Response.ContentType = "application/json; charset=utf-8"; 
      context.Response.Flush(); 
      context.Response.Write("{\"IsSessionAlive\": \"false\", \"RedirectUrl\": \"" + redirectUrl + "\"}"); 
     } 
     else 
     { 
      context.Session["KeepSessionAlive"] = TimeZoneHelper.GetCurrentUtcDateTime(); 

      context.Response.Clear(); 
      context.Response.ContentType = "application/json; charset=utf-8"; 
      context.Response.Flush(); 
      context.Response.Write("{\"IsSessionAlive\": \"true\"}"); 
     } 
    } 
} 

上,我們應該看看接下來有什麼建議?

+0

是什麼的樣子HttpHandler的? – Nate 2013-03-07 18:30:42

+1

您是否試圖關閉您的回覆?嘗試{Context.Response.End(); }趕上(ThreadAbortException ERR){ } 趕上(例外錯誤){} – Sameh 2013-03-07 19:28:24

+0

@Sameh我會試試看,但是從我們使用這個我可以告訴這個數據預先考慮到我們的jQuery AJAX調用。結束迴應將結束它,我假設。 – Schandlich 2013-03-07 19:45:18

回答

4

Microsoft現在已經發布了以下修補程序,該修補程序似乎可以在不需要web.config或IIS配置更改的情況下修復此問題。 http://support.microsoft.com/kb/2828841/en-us http://support.microsoft.com/kb/2828842/en-us

前回答

經過進一步調查和洞察力/由.NET兼容性團隊提供的解決方案,我在編輯這個答案。

ManagedPipelineHandler for an AJAX POST crashes if an IE9 user navigates away from a page while that call was in progress找到的解決方案似乎對我們工作更可靠。這是我們在IE8-10中遇到的情況,而不僅僅是9。

我會在這裏保留舊的答案,因爲如果第一個答案不相關,希望可以指向另一個方向的人。

前原答覆

源代碼最終被鎖定爲會話。 AspNetSessionDataBegin和AspNetSessionDataEnd事件應該是一個死衚衕。對於任何人都會遇到同樣的問題,請查看您何時以及如何寫入會話。這些鏈接也有幫助。

Replacing ASP.Net's session entirely

I just discovered why all ASP.Net websites are slow, and I am trying to work out what to do about it