Отмена операции WCF при прерывании работы клиента - PullRequest
3 голосов
/ 17 июня 2011

У меня есть клиент silverlight, который может вызывать метод в моей веб-службе WCF для получения значений из базы данных.В случае длинного запроса я хочу дать пользователю возможность отменить его.

На стороне клиента, когда пользователь нажимает «Отмена», я вызываю «.Abort ()» на моем экземпляре WCF.Однако моя служба WCF все еще продолжит свою работу, так как не знает, что клиент больше не подключен.

Мой вопрос: возможно ли, чтобы служба WCF знала, что клиент разорвал соединение?

Я пытался описать события Channel.Closed / failed в моем методе контракта, но они никогда не запускаются ...

[AspNetCompatibilityRequirements(RequirementsMode =  AspNetCompatibilityRequirementsMode.Allowed)]
internal class MyContract: IMyContract
{
    public object QueryDatabase(...)
    {
        System.ServiceModel.OperationContext.Current.Channel.Faulted += new System.EventHandler(Channel_Faulted);
        System.ServiceModel.OperationContext.Current.Channel.Closed += new System.EventHandler(Channel_Faulted);

        // Perform sql query
    }

    void Channel_Faulted(object sender, System.EventArgs e)
    {
        // Cancel SQL query here
    }
}

Кто-нибудь знает, как это сделать?Спасибо!

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

События Faulted и Closed действительно могут использоваться так, как вы их используете в своем примере кода, но только в том случае, если используемая привязка поддерживает надежные сеансы и у вас включены надежные сеансы.Проверьте, поддерживает ли используемая вами привязка, и, если это так, включите ее.

<bindings>
  <netTcpBinding>
    <binding>
      <reliableSession ordered="true"
            inactivityTimeout="0:10:0"
            enabled="true" />
    </binding>
  </netTcpBinding>
</bindings>

Если ваша привязка не поддерживает эту функцию, вы можете подумать о переходе на такую, которая ее поддерживает. Список поддерживаемых привязок можно найти здесь.

0 голосов
/ 17 июня 2011

Клиенту нужно будет отправить еще один запрос в службу, чтобы сообщить, что он требует отмены - это предполагает

  1. Служба может идентифицировать часть работы, выполняемой для этого клиента отмены
  2. Выполняемая работа фактически отменяется (многие асинхронные операции не имеют API отмены
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...