3

길이가 인 WCF 서비스가 있습니다. (이 질문을 위해 서비스 호출을 끊는 데 관심이 없습니다.) 클라이언트가 강제로 연결을 끊으면 클라이언트가 응답을받지 못할지라도 WCF 서비스는 계속 실행됩니다.WCF 서비스를 "공동으로"종단하는 방법 (기본 HTTP, 양방향이 아님)

믿을만한 메시징 (여기서는 적용되지 않는 것 같습니다), 양방향 채널/동작 (구현하거나 필요하지 않음)에 대한 정보를 찾았으며 해당 메시지를 "해체하는"방법을 이해했습니다. 서비스 요청.

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

하지 않으면, 거기에 어떤이다 :

그러나, 나는 배경 작업자의 CancellationPending 속성과 같은 "간단한"방법이되지 않을 수도 있습니다 경우 서비스는 다음과 같이 보일 것입니다 궁금 해서요 그런 것을 추가하는 방법? 또는 가혹한 예외 (예 : TheadInterruptedException)로 WCF 스레드를 걷어차 는가?

서비스 자체는 완료된 작업 및 그러한보고와 관련하여 완전히 람등한 것으로 설계되었습니다.


WCF 서비스는 IIS 7에서 호스팅되며 관련성이있는 것으로 판단됩니다.

답변

0

의 HTTP/HTTPS 끝점으로에서 호스팅되는 WCF 서비스의 경우 여기에서 작동하는 HttpResponse.IsClientConnected을 사용하고 있습니다.

참고 : 이것은 호스트 서버 (예 : IIS)가 연결 해제를 올바르게 감지 할 수 있는지 여부에 따라 다릅니다. 일반적으로 이러한 연결은 정상적으로 연결 해제되어야합니다. YMMV.

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

참고 :

  • "연결"을 (하므로 이론적으로 다른 스택으로 변경 될 수 있음) 및 의존성 주입을 통해 주입 ..된다
  • 코드는 다음과 동등한 기능

  • .. ClientConnectedStatus는 {Connected, Disconnected, Unknown} 중 하나를 반환합니다. aborting은 클라이언트가 "확실히 단절된"경우에만 발생합니다 ..
  • .. IIS/HTTPContext가 없으면 ClientConnectedStatus는 항상 알 수 없음을 반환하고 잠재적 인 잘못된 연결되지 않은 상황 (예 : 그렇지 않은 경우 호스팅 된 경우)을 방지합니다.