Вызов метода страницы при закрытии браузера

Asked
Viewd5437

0

Привет, я пытаюсь вызвать [веб-метод] для метода bodyunload.

Но он запускается только при загрузке самой страницы. Как это предотвратить?

Вот код, который я использую:

 [WebMethod]
public static void AbandonSession()
{
    HttpContext.Current.Session.Abandon();
}


<script language="javascript" type="text/javascript">
//<![CDATA[

function HandleClose() {
    PageMethods.AbandonSession();
}

//]]>
</script>

<body onunload="HandleClose()">
....
....
....
</body>
 

Спасибо, Нагу

  • Отлично. Что заставляет вас думать, что вызывается веб-метод и вызывается ли HandleClose?

    John Saunders07 июля 2009, 11:03
  • Можете ли вы опубликовать код, чтобы проиллюстрировать, что происходит?

    Rhys Jones07 июля 2009, 10:47

4 ответов

3

Я протестировал приведенный ниже код, и он работает нормально.

На странице Aspx

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

    <script type="text/javascript">
        //<![CDATA[

        function HandleClose()
        {


            PageMethods.AbandonSession();
        }

        //]]>    
    </script>

</head>
<body onunload="HandleClose()">
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
    </asp:ScriptManager>
    </form>
</body>
</html>
 

В скрытом коде

 using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;

public partial class ClearSessionOnPageUnload : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    [WebMethod]
    public static void AbandonSession()
    {
        HttpContext.Current.Session.Abandon();
    }

}
 

Вы можете установить точку останова в методе AbandonSession, чтобы убедиться, что он попадает при выгрузке.

0

Прошло несколько лет, но я не знал, что WebMethod может быть статичным.

  • @ Leppie - вы можете прочитать о них здесь - http://msdn.microsoft.com/en-us/magazine/cc163480.aspx#S5. Надеюсь, это будет полезно.

    RichardOD07 июля 2009, 13:34
  • @ Leppie- статика в порядке. На самом деле это метод страницы, а не веб-сервис. Это всего лишь способ предоставить функциональность MS AJAX.

    RichardOD07 июля 2009, 13:29
0

Невозможно согласованно обрабатывать события этого типа. Слишком много причин для «завершения» сеанса. Самым простым из них является потеря или закрытие соединения. В этом случае любой запущенный JavaScript никогда не достигнет сервера.

Даже если вы сможете заставить это работать так, как вы хотите, это будет работать только часть времени. Если вы не можете полагаться на это, ваше время может быть потрачено на другое решение.

1

То, что вы пытаетесь сделать, - плохая идея. Попробуйте разместить меньше данных в сеансе или уменьшить время ожидания.

Возможно, вы не понимаете, что onunload срабатывает, когда пользователь обновляет страницу или уходит со страницы. Итак, если ваш код действительно работает, если вы обновите свою страницу, их сеанс будет прерван. Если они посетят любую другую страницу сайта, их сеанс также будет прерван!

Вероятно, не та функциональность, на которую вы рассчитывали!