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