我设计一个客户机-服务器聊天应用程序(实际上我不是,但是让我们假装我是:)),和我有点疑惑的一些比赛的条件下,我们已经经验丰富。

让我们说,我已经得到了下列代码:

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的一种方法叫)

这里有两种方式来解决这个代号:

  1. 除FaultContract并宣布BroadcastMessage方法作为"单向"=true
  2. 广播的消息的每一个人,但最初的发件人

我的第一个猜测是对客户的侧是等待服务器的返回,因而不是可用于处理进入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实现这是给你的悲伤。我有一些很奇怪的错误,只有有意义的,当我走进追踪和发现的实际错误消息发生的.

跟踪WCF服务

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top