竞争条件在WCF与非单向的方法
-
19-08-2019 - |
题
我设计一个客户机-服务器聊天应用程序(实际上我不是,但是让我们假装我是:)),和我有点疑惑的一些比赛的条件下,我们已经经验丰富。
让我们说,我已经得到了下列代码:
public interface IServer
{
[OperationContract(IsOneWay = false)]
[FaultContract(typeof(ChatException))]
void BroadcastMessage(string msg);
}
public class Server : IServer
{
void BroadcastMessage(string msg) // I'm not mentionning the try/catch/throw FaultException here for readability purposes
{
foreach (IClientCallback c in callbacks){
c.ReceiveMessage(msg);
}
}
}
public interface IClientCallback
{
[OperationContract(IsOneWay = true)]
void ReceiveMessage(string s);
}
这里是一个摘录的结合配置:
<endpoint address=""
binding="netTcpBinding"
bindingConfiguration="DuplexBinding"
contract="IServer" />
<binding name="DuplexBinding" sendTimeout="00:01:00">
<reliableSession ordered="true" inactivityTimeout="00:05:00" enabled="true"/>
<security mode="None">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
这当然是某种伪c#,我去掉了很多非有关代码,用于清晰的缘故。
现在到了一点:这种代码不起作用。当我叫BroadcastMessage的方法,该方法永远不会返回,我最终得到一个超时在客户端。如果我试服务器上的一侧,一切似乎现(I返回自BroadcastMessage的方法正作为一个希望,而且我不会阻止任何ReceiveMessage的一种方法叫)
这里有两种方式来解决这个代号:
- 除FaultContract并宣布BroadcastMessage方法作为"单向"=true
- 广播的消息的每一个人,但最初的发件人
我的第一个猜测是对客户的侧是等待服务器的返回,因而不是可用于处理进入ReceiveMessage呼从服务器,从而阻碍了服务器,但ReceiveMessage声明为"单向",并调试服务器显示,它不会阻止任何呼吁ReceiveMessage
现在,我的问题:
什么事了?
是否还有其他的方式来解决这个问题?(可能通过调谐结合的配置?)
让我们说我选择了修复2(即不广播回发送),会发生什么,如果服务器的电话我ReceiveMessage callback(因为别人给我发了一条消息),而我在等待我自己的BroadcastMessage电话来完成吗?
我读的单向电话不是完全单和服务器仍在等待一个HTTP响应从另一个侧面。任何细节上这个吗?具体而言,客户能够应对suche http响应当被阻止在一个遥远的电话吗?
编辑:控制台。净3.5服务器上的侧面,它.净3.5对客户的侧
解决方案
这听起来像一个僵局,或许是由于同步环境。什么客户?Winform?WPF?WCF方面同步的背景下,这意味着"开关于UI线"它和WPF.如果你是 做 阻挡请求在UI线,然后游戏就结束了。
尝试执行WCF请求的背景线,使得UI线提供服务的进入请求;这可能是简单的使用 ThreadPool
, 或者也许 BackgroundWorker
.
其他提示
尝试加入这个属性,来具体实施的服务:
[System.ServiceModel.ServiceBehavior(UseSynchronizationContext=false)]
public class Server : IServer {}
第二,试图打开WCF跟踪看看如果你有什么发生在你的肠子WCF实现这是给你的悲伤。我有一些很奇怪的错误,只有有意义的,当我走进追踪和发现的实际错误消息发生的.