所以我创建了Client / Server 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>
答案 0 :(得分:2)
这里的一个合理方法是使用异步请求 - 响应。这意味着客户端不会等待服务器完成它的工作,只是激发请求并忘记。服务器完成后,他会调用客户端返回操作结果。特别是WCF有双重合同来实现:http://www.codeproject.com/Articles/491844/A-Beginners-Guide-to-Duplex-WCF。
当服务器响应准备就绪时,它会尝试将其传递给客户端。如果失败,服务器可以稍后再次重试,直到达到成功或超时。
如果你遵循这种模式,客户端应该有一些唯一的标识符,这样即使连接恢复 - 服务器知道它是同一个客户端,它知道这个客户端正在等待哪些响应。
另一种方法是在一些(有限的)时间内将结果缓存在服务器上。您可以为每个请求提供唯一ID,然后在服务器上检查具有此类ID的请求是否已经完成,如果是,则立即提供结果。否则,处理响应并在有限时间内缓存它,以防客户端稍后重试。在客户端 - 只需重试失败。