如何从Silverlight 4中检测浏览器刷新?

时间:2010-09-07 16:24:56

标签: silverlight

我的Silverlight 4应用程序通过wcf服务与服务器端保持联系。每当用户刷新,导航或终止浏览器时,我都应该向服务器端进行一些清理。

我无法使用Application Exit事件;我的wcf客户端在最终被调用之前已经死了。我无法使用(SL4中的新增功能)FrameworkElement Unloaded事件;当Silverlight应用程序关闭时,它不会被调用。

那么,如何检测浏览器刷新,新页面或关闭及时进行清理?

3 个答案:

答案 0 :(得分:2)

巴布,

当用户离开我的Silverlight应用程序(或进行刷新)时,我会这样做。请按照以下步骤捕捉此事件。

1。)首先听一下HTML页面的“onbeforeunload”事件,就像这样......

public void Application_Startup(object sender, StartupEventArgs e)
{
    bool ok = HtmlPage.Window.AttachEvent("onbeforeunload", Application_BeforeExit);
    ok = HtmlPage.Document.AttachEvent("onbeforeunload", Application_BeforeExit);
    MainPage mainPage = new MainPage();
    base.RootVisual = mainPage;
}

2。)实现Application_BeforeExit()来设置和调用ASP.NET“PageMethod”,就像这样......

private void Application_BeforeExit(object sender, HtmlEventArgs args)
{
    string methodName = "ModelShutdown";
    params object[] args = new Guid().ToString());;

    try
    {
        ScriptObject pageMethods = (ScriptObject)HtmlPage.Window.GetProperty("PageMethods");
        if (pageMethods == null)
            throw new ArgumentException("Web page does not support PageMethods");
        object[] pageMethodArgs = { new PageMethodEventHandler(Success), new PageMethodEventHandler(Failure), null/*userContext*/};
        object[] combinedArgs = new object[args.Length + pageMethodArgs.Length];
        args.CopyTo(combinedArgs, 0);
        pageMethodArgs.CopyTo(combinedArgs, args.Length);
        pageMethods.Invoke(methodName, combinedArgs);
    }
    catch (Exception ex)
    {
        //ex.Alert();
    }
}

3.。)将PageMethod添加到您的页面代码(Index.aspx.cs),就像这样,

public partial class Index : Page
{
    [WebMethod] // a PageMethod called from Silverlight
    public static void ModelShutdown(string identifier)
    {
        System.Diagnostics.Debug.WriteLine("*** Signing Off: " + identifier);
    }
}

4.。)允许页面上的PageMethods(Indx.aspx),像这样,

<asp:ScriptManager runat="server" EnablePageMethods="true" />
<div id="silverlightControlHost">
    <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
祝你好运,
Jim McCurdy,YinYangMoney.com

答案 1 :(得分:0)

在用户决定离开或浏览器终止后,我认为您无法在服务器端执行任何操作。但是,您可以编写一些JavaScript来防止卸载当前页面,您可以警告用户不要关闭它。

其次,使用一个每两分钟左右滴答一次的小会话计时器。您的会话应该超时但是当您的Silverlight应用程序在浏览器中打开并运行时,您应该通过编写一些ping方法来ping您的服务器,该方法将使您的会话每隔一分钟保持活动状态。

因此,如果您的会话即将到期(它在过去60秒内没有收到ping),您的会话将被销毁,您可以在服务器的会话端编写一些清理代码。

答案 2 :(得分:0)

我对MVC应用程序有类似的要求。我所做的是使用jQuery订阅unload事件并对一个杀死会话的控制器动作进行ajax调用:

$(window).unload(function() {
  $.ajax({url: Url.Action("KillSession")});
});

public ActionResult KillSession()
{
    Session.Abandon();
    return new HttpStatusCodeResult(System.Net.HttpStatusCode.NotModified);
}