WCF& Silverlight>> pollingDuplexHttpBinding>>在浏览器关闭时从silverlight调用Web服务

时间:2012-11-11 15:13:40

标签: wcf silverlight pollingduplexhttpbinding

我有使用pollingDuplexHttpBinding绑定的WCF服务器和Silverlight客户端。

我想关闭连接并调用EndSession操作方法,该方法从

清除用户

活跃用户列表,并关闭会话(IsTerminating = true

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

根据 this ,你不能在Application_Exit事件上调用wcf操作,它也给出了一个

对我来说似乎“吵闹”的解决方案,

我的选择是什么?这是唯一的方法吗?

1)使用链接解决方案?

2)服务器每隔X秒运行一次方法来检查双工对象状态是否存活?

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

3)其他?!易于内置的解决方案?为什么Silverlight是HELL?

1 个答案:

答案 0 :(得分:0)

这是我刚尝试过的解决方案。其核心发布在您问题链接的评论中! :)

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应用程序使用导航框架。