我有WCF服务器和Silverlight客户端使用pollingDuplexHttpBinding绑定。
我想关闭连接并调用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)其他?!简单的内置解决方案?为什么银光是地狱!
发布于 2013-04-03 09:33:08
这就是我刚刚尝试过的解决方案,而且效果很好。它的核心被张贴在你问题的链接中的评论中!:)
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应用程序使用导航框架。
https://stackoverflow.com/questions/13332427
复制相似问题