连接断开后,如何在WCF可靠消息传递中接收服务器的响应

本文关键字:消息传递 服务器 响应 断开 WCF 连接 | 更新日期: 2023-09-27 18:15:26

所以我创建了客户机/服务器WCF。我想要的是,当我从这个客户端向服务器发送消息时,由于任何原因连接断开,例如客户端关闭,当它再次可用时,这个客户端如何获得响应?

是否有可能在客户端和服务器之间设置会话或类似的东西?

我的客户端代码是:
private static void Main(string[] args)
{
    var client = new FlipCaseServiceClient("ReliableMessageService");
    var sd = new StringData { FirstName = "Turgut", LastName = "Kançeltik" };
    var fullName = client.GetFullName(ref sd);
    Console.WriteLine(fullName);
}

我的服务器代码是:

[DeliveryRequirements(RequireOrderedDelivery = true)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)]
public class FlipCaseService : IFlipCaseService
{
    public string GetFullName(ref StringData stringData)
    {
        var fullName = $"{stringData.FirstName} {stringData.LastName}";
        stringData.FullName = fullName;
        return fullName;
    }
}

和服务器配置摘要:

<service behaviorConfiguration="ServiceBehaviorMetaData" name="FlipCaseService.FlipCaseService" >
  <endpoint name="ReliableMessageService" address="flipcase/wsAddress" binding="wsHttpBinding" bindingConfiguration="BindingReliableMessaging" contract="FlipCaseService.IFlipCaseService" >
     <identity>
        <dns value="localhost" />
     </identity>
  </endpoint>
</service>
<bindings>
  <wsHttpBinding>
    <binding name="BindingReliableMessaging">
      <reliableSession enabled="true" inactivityTimeout="00:10:00"/>
    </binding>
  </wsHttpBinding>      
</bindings>
<behavior name="ServiceBehaviorMetaData">
  <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8080/flipcase/metadata" />
  <serviceDebug includeExceptionDetailInFaults="true" />
</behavior>

连接断开后,如何在WCF可靠消息传递中接收服务器的响应

一种合理的方法是使用异步请求-响应。这意味着客户端不等待服务器完成它的工作,只是触发请求并忘记。当服务器完成后,他将操作结果返回给客户端。具体来说,WCF有双工合约来实现这一点:http://www.codeproject.com/Articles/491844/A-Beginners-Guide-to-Duplex-WCF.

当服务器响应准备好时,它尝试将其交付给客户端。如果失败,服务器可以稍后重试,直到成功或达到超时。

如果你遵循这个模式,客户端应该有一些唯一的标识符,这样即使连接被恢复,服务器也知道它是同一个客户端,并且它知道这个客户端正在等待哪些响应。

另一种方法是将结果缓存在服务器上一段(有限的)时间。您可以为每个请求提供唯一的id,然后在服务器上检查具有该id的请求是否已经完成,如果是,则立即交付结果。否则,处理响应并将其缓存一段有限的时间,以防客户机稍后重试。