3

У меня есть служба WCF, которая длится . (Ради этого вопроса я не заинтересован в разрыве вызова службы.)Метод «совместного» завершения службы WCF (базовый HTTP, недвойный)

Однако, когда клиент отключается принудительно, служба WCF будет продолжать работать до завершения - даже если клиент никогда не получит ответ.

Я нашел информацию о надежном обмене сообщениями (который, кажется, не применим здесь), дуплексные каналы/поведение (которые я не хочу реализовать или требую), и понимаю, как можно «разбить» запросы на обслуживание.

Однако, мне было интересно, если там не может быть «простой» способ, как CancellationPending свойство фона рабочего, служба будет выглядеть примерно так:

while (!WCFRequest.CancellationPending && !FinishedWithLongOperation) { 
    DoOnePartOfTheLongOperation(); 
} 

Если нет, то есть ли способ добавить такой? Или даже пинать поток WCF с суровым исключением (т. Е. TheadInterruptedException)?

Служба сама предназначена для полного ипосташения по завершенной работе и отчетности о таких.


Служба WCF размещена в IIS 7, которая, как я подозреваю, может иметь значение.

ответ

0

Для службы WCF, которая является , размещенной в IIS в качестве конечной точки HTTP/HTTPS. Я использую HttpResponse.IsClientConnected, который работает здесь (TM).

Примечание: Это зависит от возможности сервера хостинга (например, IIS) правильно определить разъединение. В общем, они должны быть упорядоченными разъединениями. YMMV.

Код затем функционально эквивалентен:

while (!FinishedWithLongOperation) { 
    if (Connection.ClientConnectedStatus == ClientStatus.Disconnected) { 
     throw new Exception("Client definitely disconnected!"); 
    } 
    DoOnePartOfTheLongOperation(); 
} 

Примечания:

  • "Соединение" вводится через Dependency Injection (так что теоретически может быть изменен с другими стеками) и ..
  • .. ClientConnectedStatus возвращает один из {Connected, Disconnected, Unknown}; прерывание происходит только тогда, когда клиент «определенно отключен», так что ..
  • .. Если IIS/HTTPContext отсутствует, то ClientConnectedStatus всегда будет возвращать Неизвестные и предотвращать потенциальные ложные не связанные ситуации (например, если они размещены в противном случае).