2013-03-07 38 views
9

Chúng tôi đang nhận được một số hành vi lạ trên trang web của chúng tôi sau khi nâng cấp sản phẩm lên .NET 4.5. Tôi sẽ cố gắng càng cụ thể càng tốt nhưng vấn đề là mơ hồ, vì vậy hãy chịu với tôi. Ngoài ra, đối với kịch bản này, làm việc theo giả định rằng không có thực hành tốt nhất đã được theo sau.Yêu cầu ASP.NET và .NET 4.5 - Hành vi lạ

Người dùng đang truy cập trang thực hiện một số cuộc gọi jquery ajax, không đồng bộ, với dịch vụ web. Do thiết kế/mã hóa kém trên trang này, nó có thể mất nhiều thời gian để tải, nhưng nó cung cấp một menu phụ mà người dùng cần truy cập. Khi trang bắt đầu tải, họ nhấp vào một trong các tùy chọn trình đơn để truy cập trang khác. Không có gì quá đặc biệt cho đến nay.

Khi chúng tôi sử dụng perfmon trên một hộp với .NET 4.0 được cài đặt, chúng ta có thể thấy yêu cầu ASP.NET đi lên và xuống, như bạn mong chờ:

Perfmon on 4.0 box

Khi chúng ta cài đặt nó trên một hộp với .NET 4.5 cài đặt chúng tôi nhận được điều này: enter image description here

Sau khi thực hiện quy trình làm việc tôi đã mô tả ở trên, yêu cầu bị treo lên. Không xếp hàng đợi; họ chỉ ngồi đó.

Sau khi nghiên cứu sâu hơn, chúng tôi nhận thấy rằng việc nhấp vào giữa hai trang khác nhau không chỉ đơn giản là href, mà thực sự đang sử dụng Response.Redirect (url);

Ngoài ra, điều này chỉ xảy ra khi sử dụng IE. Đây không phải là vấn đề khi sử dụng Firefox và Chrome.

Đây là những gì chúng tôi đã cố gắng cho đến nay:

  1. Chúng tôi đã liên lạc với M $ và gửi chúng ra DebugDiag bãi. Vẫn đang đợi.
  2. Tôi đã đi đến IIS, đặt trang web để theo dõi các yêu cầu không thành công và đã thiết lập bộ lọc yêu cầu không thành công để cung cấp cho tôi mọi thứ. Khi trang web khóa, tôi xóa nhật ký và sau đó kiểm tra những gì xuất hiện sau khi trang web khóa. Mỗi khi nó bị treo giữa các sự kiện AspNetSessionDataBegin và AspNetSessionDataEnd.
  3. Chúng tôi có một HttpHandler mà đọc/ghi vào phiên, và vô hiệu hóa nó dường như để sửa chữa vấn đề cho hầu hết các phần, nhưng không có lời giải thích là tại sao.
  4. xử lý onunload của jquery, cần dọn dẹp và hủy bỏ tất cả các yêu cầu xmlhttp còn lại, dường như không thực thi liên tục.
  5. Cài đặt số này patch, vẫn không trợ giúp.
  6. Chúng tôi hiện đang thay đổi phương thức Response.Redirect (url) trong logic điều hướng này thành Response.Redirect (url, false); (Xem ở trên).

Cũng theo yêu cầu, đây là mã 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\"}"); 
     } 
    } 
} 

Bất kỳ đề xuất về nơi chúng ta nên xem xét tiếp theo?

+0

Gì HttpHandler trông như thế nào? – Nate

+1

Bạn đã cố gắng đóng phản hồi của mình chưa? hãy thử { Context.Response.End(); } catch (ThreadAbortException err) { } catch (Exception err) { } – Sameh

+0

@Sameh Tôi sẽ thử, nhưng từ những gì tôi có thể nói chúng tôi sử dụng để thêm dữ liệu này vào cuộc gọi jquery ajax. Kết thúc phản hồi sẽ kết thúc nó tôi giả định. – Schandlich

Trả lời

4

Bản vá sau đây hiện đã được Microsoft phát hành có vẻ như khắc phục sự cố mà không yêu cầu thay đổi cấu hình web.config hoặc IIS. http://support.microsoft.com/kb/2828841/en-us http://support.microsoft.com/kb/2828842/en-us

Cựu trả lời

Sau khi điều tra thêm và cái nhìn sâu sắc/giải pháp được cung cấp bởi các đội tương thích .NET, tôi đang chỉnh sửa câu trả lời này.

Giải pháp tìm thấy tại ManagedPipelineHandler for an AJAX POST crashes if an IE9 user navigates away from a page while that call was in progress dường như được làm việc đáng tin cậy hơn cho chúng ta. Đây là hành vi chúng tôi đã trải qua trong IE8-10 và không chỉ là 9 tuy nhiên.

Tôi sẽ giữ cho câu trả lời cũ ở đây, vì nó hy vọng có thể chỉ người theo hướng khác nếu câu trả lời đầu tiên là không có liên quan.

Cựu câu trả lời cũ

Nguồn kết thúc là khóa phiên. Các AspNetSessionDataBegin và AspNetSessionDataEnd sự kiện nên có được một giveaway chết. Đối với bất cứ ai mà tình cờ gặp vấn đề này, hãy xem để xem khi nào và cách bạn đang viết cho phiên. Các liên kết này cũng đã giúp.

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