2009-06-30 24 views
8

Tôi đang viết một chương trình có cả hệ thống cấu hình ASP.NET và ứng dụng Silverlight. Hầu hết người dùng sẽ vẫn ở trên trang Silverlight và không truy cập trang ASP.NET ngoại trừ việc đăng nhập, v.v.Ngăn chặn ASP.NET Session Timeout khi sử dụng Silverlight

Vấn đề là tôi cần phiên hoạt động cho mục đích xác thực, nhưng phiên sẽ hết giờ ngay cả khi người dùng đang sử dụng các tính năng của ứng dụng Silverlight.

Bất kỳ ý tưởng nào?

+0

Bạn có thể sử dụng Bộ hẹn giờ không? – WowtaH

Trả lời

12

Trên trang lưu trữ kiểm soát Silverlight, bạn có thể thiết lập bộ hẹn giờ javascript và thực hiện cuộc gọi ajax đến Trình xử lý Http (.ashx) cứ 5 phút một lần để giữ cho phiên hoạt động. Đảm bảo yêu cầu lớp Handler của bạn triển khai IRequiresSessionState.

Tôi khuyên bạn nên xử lý bởi vì nó dễ dàng hơn để kiểm soát văn bản phản hồi được trả về, và nó là nhẹ hơn sau đó một trang aspx.

Bạn cũng sẽ cần đặt bộ nhớ cache phản hồi đúng cách để đảm bảo trình duyệt thực hiện cuộc gọi ajax mỗi lần.

CẬP NHẬT

Đây là đoạn mã mẫu cho một HttpHandler

public class Ping : IHttpHandler, IRequiresSessionState 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     context.Response.ContentType = "text/plain"; 
     context.Response.Write("OK"); 
    } 

    public bool IsReusable 
    { 
     get { return true; } 
    } 
} 

Sau đó, nếu bạn sử dụng jQuery, bạn có thể đặt này trên aspx trang chủ của bạn

setInterval(ping, 5000); 

function ping() { 
    $.get('/Ping.ashx'); 
} 

Khoảng tính bằng mili giây, vì vậy mẫu của tôi sẽ ping sau mỗi 5 giây, có thể bạn muốn số đó lớn hơn. Fiddler là một công cụ tuyệt vời để gỡ lỗi các cuộc gọi ajax, nếu bạn không sử dụng nó, hãy bắt đầu.

+0

Nó nhẹ hơn một trang aspx gần như trống? Tôi là một người mới tham gia ASP.NET /AJAX và điều này có vẻ phức tạp hơn. Bạn có thể cung cấp một mẫu của tập tin ashx tôi sẽ cần phải sử dụng? –

+0

Tôi đã thử điều này và javascript dường như không hoạt động trong IE8. Tôi vừa tải xuống phiên bản mới nhất của jQuery cho mục đích này. Có điều gì khác mà trình xử lý/trang cần không? –

+0

Không có gì khác bạn cần. Có một công cụ tuyệt vời được gọi là Fiddler2 bạn có thể sử dụng để xem lưu lượng mạng và đảm bảo rằng cuộc gọi đang được thực hiện. Nó có thể là một vấn đề đường dẫn, trong trường hợp này người dùng sẽ báo cáo 404. Tôi khuyên bạn nên sử dụng công cụ đó để xem điều gì đang xảy ra. Nếu không, IE8 có các công cụ gỡ lỗi javascript tốt có thể giúp bạn gần hơn. – NerdFury

0

Tôi thực sự đã tìm thấy một bản hack khá thú vị về cơ bản sẽ nhúng một khung nội tuyến trên cùng một trang với ứng dụng Silverlight. Khung nội tuyến chứa một trang web aspx tự làm mới mỗi (Session.Timeout - 1) phút. Điều này giúp cho phiên hoạt động lâu hơn, tuy nhiên ứng dụng Silverlight vẫn mở.

Để thực hiện việc này:

Tạo trang asp.net có tên "KeepAlive.aspx". Trong phần đầu của trang đó, thêm này:

<meta id="MetaRefresh" http-equiv="refresh" content="18000;url=KeepAlive.aspx" runat="server" /> 

    <script language="javascript" type="text/javascript"> 
     window.status = "<%= WindowStatusText%>"; 
    </script> 

trong mã đằng sau tập tin, thêm này:

protected string WindowStatusText = ""; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      // Refresh this page 60 seconds before session timeout, effectively resetting the session timeout counter. 
      MetaRefresh.Attributes["content"] = Convert.ToString((Session.Timeout * 60) - 60) + ";url=KeepAlive.aspx?q=" + DateTime.Now.Ticks; 

      WindowStatusText = "Last refresh " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString(); 
     } 
    } 

Bây giờ, trên các trang tương tự như các ứng dụng Silverlight, thêm này:

<iframe id="KeepAliveFrame" src="KeepAlive.aspx" frameborder="0" width="0" height="0" runat="server" /> 

Bây giờ, phiên asp.net sẽ vẫn hoạt động trong khi ứng dụng Silverlight đang được sử dụng!

+0

Thật không may, có vẻ như điều này không hoạt động trong IE8 (ít nhất). –

0

Phương pháp ping ajax/HttpHandler là tốt, nhưng hàm JQuery $ .get đang chờ kết quả json và ném lỗi phân tích cú pháp javascript.

Tôi đã sửa đổi Ping HttpHandler để trả về "{}" thay vì "OK" và điều này hoạt động tốt hơn.

+0

bạn có thể chỉ định loại phản hồi bạn muốn nhận khi sử dụng $ .get – Omu

Các vấn đề liên quan