我有使用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?
答案 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应用程序使用导航框架。