5

所以我创建了客户端/服务器 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>
4

1 回答 1

2

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

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

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

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

于 2016-10-28T09:39:49.783 回答