Как получить ответ от сервера в надежном обмене сообщениями 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>

1 ответ

Одним из разумных подходов здесь является использование асинхронного запроса-ответа. Это означает, что клиент не ждет, пока сервер завершит свою работу, просто запускает запрос и забывает. Когда сервер готов, он перезванивает клиенту с результатами операции. В частности, WCF имеет дуплексные контракты для достижения этой цели: http://www.codeproject.com/Articles/491844/A-Beginners-Guide-to-Duplex-WCF.

Когда ответ сервера готов, он пытается доставить его клиенту. Если это не удается, сервер может повторить попытку позже, пока не будет достигнут успех или некоторое время ожидания.

Если вы следуете этому шаблону, клиент должен иметь некоторый уникальный идентификатор, так что даже если соединение восстановлено - сервер знает, что это тот же клиент, и он знает, какие ответы ожидаются этим клиентом.

Другой подход заключается в кэшировании результатов на сервере в течение некоторого (ограниченного) времени. Вы можете указать уникальный идентификатор для каждого запроса, а затем на сервере проверить, был ли уже выполнен запрос с таким идентификатором, и если да, немедленно доставить результаты. В противном случае обработайте ответ и кешируйте его в течение ограниченного времени, в случае если клиент повторит попытку чуть позже. На клиенте - просто повторите попытку при сбое.

Другие вопросы по тегам