WCF и Silverlight >> pollingDuplexHttpBinding >> Вызов веб-служб из silverlight при закрытии браузера

У меня есть WCF-сервер и клиент Silverlight, использующий связывание pollingDuplexHttpBinding.

Я хочу закрыть соединение и вызвать метод операции EndSession, который очищает пользователя от

список активных пользователей и закрыть сеанс (IsTerminating = true)

    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = true)]
    void EndSession();

в соответствии с этим вы не можете вызвать операцию wcf для события Application_Exit, это также дает

решение, которое мне кажется "2 очень шумным",

Какие у меня варианты здесь? Это единственный способ?

1) Используя решение для связи?

2) Сервер работает метод каждые X секунд, чтобы проверить состояние дуплексного объекта жив?

(((ICommunicationObject)clientContract.Value).State != CommunicationState.Opened 

3) Другое?! Простое встроенное решение? Почему Silverlight это АД?!

1 ответ

Это решение, которое я только что опробовал и которое работает. Его ядро ​​было размещено в комментариях по ссылке с вашего вопроса!:)

Silverlight App.Exit событие:

    private void Application_Exit(object sender, EventArgs e)
    {
        if (String.IsNullOrEmpty(App.SessionId))
            return;

        var page = HtmlPage.Document.DocumentUri;
        UriBuilder builder = new UriBuilder();
        builder.Scheme = page.Scheme;
        builder.Host = page.Host;
        builder.Port = page.Port;
        builder.Path = page.LocalPath;

        string request = builder.Uri.ToString();

        request += "?closing=" + App.SessionId;
        System.Windows.Browser.ScriptObject obj = System.Windows.Browser.HtmlPage.Window.CreateInstance("XMLHttpRequest"); 
        obj.Invoke("open", "POST", request, false);

        obj.Invoke("setRequestHeader", "Content-Type", "application/x-www-form-urlencoded");

        obj.Invoke("send", "");
    }

Приведенный выше код отправляет запрос на страницу, на которой размещен объект Silverlight, который является страницей ASPX и имеет следующий код позади:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!String.IsNullOrEmpty(this.Request.QueryString["closing"]))
            chatSvc.Quit(this.Request.QueryString["closing"]);
    }

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

Это не красиво, я признаю, но это работает.

РЕДАКТИРОВАТЬ: причина, я не использую DocumentUri напрямую, потому что я использую инфраструктуру навигации для своего приложения Silverlight.

Другие вопросы по тегам