2012-11-11 24 views
1

我有WCF服务器和Silverlight客户端使用pollingDuplexHttpBinding绑定。WCF和Silverlight >> pollingDuplexHttpBinding >>在浏览器关闭时从silverlight调用Web服务

我想根据this关闭连接并调用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是HELL?!

回答

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

相关问题