1

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

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

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

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

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

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

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

1)使用链接解决方案?

2) 服务器每 X 秒运行一个方法来检查双工对象状态是否处于活动状态?

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

3)其他?!简单的内置解决方案 ? 为什么 Silverlight 是地狱?!

4

1 回答 1

0

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

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

于 2013-04-03T09:33:08.090 回答