Как обнаружить обновление браузера от Silverlight 4? - PullRequest
2 голосов
/ 07 сентября 2010

Мое приложение Silverlight 4 поддерживает связь со стороной сервера через службу wcf. Всякий раз, когда пользователь обновляет, отключает или закрывает браузер, я должен выполнить некоторую очистку на стороне сервера.

Я не могу использовать событие выхода из приложения; мой клиент wcf умер до того, как его в конце концов вызвали. Я не могу использовать событие (новое в SL4) FrameworkElement Unloaded; он не вызывается, когда приложение Silverlight закрывается.

Итак, как мне обнаружить обновление браузера, новую страницу или завершение работы вовремя , чтобы выполнить мою очистку?

Ответы [ 3 ]

2 голосов
/ 08 сентября 2010

BaBu,

Я делаю это точно, когда пользователь выходит из приложения Silverlight (или обновляет).Чтобы поймать это событие, выполните следующие шаги.

1.) Начните с прослушивания события «onbeforeunload» на HTML-странице, например ...

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%">

Удачи,Джим МакКарди, YinYangMoney.com

0 голосов
/ 22 ноября 2012

У меня было аналогичное требование для приложения MVC. Я использовал jQuery, чтобы подписаться на событие unload и сделать ajax-вызов действия контроллера, которое завершило сеанс:

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

public ActionResult KillSession()
{
    Session.Abandon();
    return new HttpStatusCodeResult(System.Net.HttpStatusCode.NotModified);
}
0 голосов
/ 07 сентября 2010

Я не думаю, что вы можете делать что-либо на стороне сервера после того, как пользователь решил уйти или браузер был закрыт.Однако вы можете написать некоторый JavaScript, чтобы предотвратить выгрузку текущей страницы, где вы можете предупредить пользователя не закрывать ее.

Во-вторых, используйте небольшой таймер сеанса, который тикает каждые две минуты или около того.Время вашего сеанса должно истечь, но когда ваше приложение Silverlight открыто и запущено в браузере, вы должны пропинговать свой сервер, написав какой-нибудь метод ping, который будет поддерживать ваш сеанс каждую минуту.

Так, если ваш сеанс истекает (он не получал ping за последние 60 секунд), ваш сеанс будет уничтожен, и вы можете написать код очистки в конце сеанса сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...