我的Silverlight 4应用程序通过wcf服务与服务器端保持联系。每当用户刷新,导航或终止浏览器时,我都应该向服务器端进行一些清理。
我无法使用Application Exit事件;我的wcf客户端在最终被调用之前已经死了。我无法使用(SL4中的新增功能)FrameworkElement Unloaded事件;当Silverlight应用程序关闭时,它不会被调用。
那么,如何检测浏览器刷新,新页面或关闭及时进行清理?
答案 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%">
祝你好运,答案 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);
}