5

所以我创建了客户/服务器WCF。我想要的是,当我从这个客户端向服务器发送消息并且连接因任何原因而中断时,客户端关闭,例如,当客户端再次可用时,如何获得响应?如何在连接切断后在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

难道你不能在失败时重试呼叫吗? – Evk

+0

我不想在服务器上再次进行相同的操作。 –

+0

WCF服务在默认情况下无状态的,这是一个服务性质的,但你可以使用的状态。无论如何,在你的情况下,我认为你可以解决缓存下一次调用的结果,避免再次处理。 –

回答

2

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

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

如果按照这种模式,客户端应该有一些独特的标识符,这样即使恢复连接 - 服务器知道它是同一个客户端,它知道哪些响应由该客户期待已久的。

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

相关问题