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

如何从Silverlight 4检测浏览器刷新?,silverlight,Silverlight,我的Silverlight 4应用程序通过wcf服务与服务器端保持联系。每当用户刷新、导航或终止浏览器时,我都应该对服务器端进行一些清理 我无法使用应用程序退出事件;我的wcf客户端在最终被调用之前就死了。无法使用(SL4中新增)FrameworkElement卸载事件;Silverlight应用程序关闭时不会调用它 那么,如何及时检测浏览器刷新、新建页面或关闭以进行清理?我认为在用户决定离开或浏览器终止后,您无法在服务器端执行任何操作。但是,您可以编写一些JavaScript来防止卸载当前页面

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

我无法使用应用程序退出事件;我的wcf客户端在最终被调用之前就死了。无法使用(SL4中新增)FrameworkElement卸载事件;Silverlight应用程序关闭时不会调用它


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

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

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

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

BaBu

当用户离开我的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.)实现应用程序_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);
    }
}
<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%">
4.)允许页面上的PageMethods(Indx.aspx),如下所示

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

我对MVC应用程序也有类似的要求。我所做的是使用jQuery订阅卸载事件,并对终止会话的控制器操作进行ajax调用:

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

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

非常感谢吉姆!我承认我希望有一个更干净的解决方案,即没有aspx/javascript的东西。我发现最好远离类似的东西。但我不情愿地开始意识到可能没有其他办法。顺便说一句你的解决方案在Firefox和Chrome以及IE中都有效吗?我刚刚意识到你可以调用你的WCF服务,而不是使用PageMethod方法;那也行。您唯一不能做的事情就是从异步调用中获取一个已完成的事件,因为一旦您离开应用程序\u BeforeExit()方法,Silverlight应用程序就会消失。而且它可以在任何浏览器中工作;这就是为什么我列出了两个不同的AttachEvent()调用。再次感谢Jim。很抱歉报告,应用程序_beforexit()对wcf服务的调用也从未到达服务器。我做了一些研究,看来你最初的解决方案,或类似的方法,是处理这个问题的唯一方法。见例。我的猜测是,未来的Silverlight版本将提供一个解决方案。毕竟,“退出时保存”是一个非常需要的功能。嗨!PageMethodEventHandler的程序集是什么?阿卡什,谢谢你的回复。我确实有一个像你描述的会话计时器,但是用户可能是邪恶的,在它启动之前刷新浏览器并重新登录。无论如何,当这些事情发生时,最好是以有序的方式进行清理,而不是依靠会话计时器(keepalive)进行清理。