WCF 서버는 WCF 클라이언트에 변경 사항을 어떻게 알립니까?(간단한 폴링보다 더 나은 솔루션입니다.혜성 또는 롱 폴링)

StackOverflow https://stackoverflow.com/questions/1700917

문제

또한보십시오 "WCF 방화벽을 통해 클라이언트에게 푸시합니다"

WCF 서버에 연결하는 WCF 클라이언트가 필요합니다. 그런 다음 일부 데이터가 변화 서버에서 클라이언트가 필요로 하는 것 업데이트 그 디스플레이.

클라이언트와 서버 사이에 방화벽이 있을 가능성이 높기 때문입니다.

  • 모든 통신은 HTTP를 통해 이루어져야 합니다.
  • 서버는 클라이언트에게 (물리적) 호출을 할 수 없습니다.

클라이언트와 서버를 모두 작성하고 있으므로 솔루션을 비누 등만 사용하도록 제한할 필요는 없습니다.


"에 대한 내장 지원을 찾고 있습니다.긴 폴링" / "혜성" 등


WCF에서 긴 폴링을 구현하는 방법에 대한 Drew Marsh의 가장 유익한 답변에 감사드립니다.그러나 저는 WCF의 주요 "판매 포인트"는 구성 파일에서 사용할 채널을 구성하기만 하면 이런 종류의 작업을 수행할 수 있다는 것이라고 생각했습니다. 예를 들어 논리적으로는 양방향이지만 물리적으로만 들어오는 채널을 원합니다.

도움이 되었습니까?

해결책

제 생각에는 당신이 이미 답을 알고 있는 것 같습니다.긴 폴링을 사용하십시오.:) 그래서 설명해야 할 유일한 것은 WCF를 사용하여 가능한 가장 효율적인 방법으로 이 작업을 수행할 수 있는 방법입니다.


기본사항:

  1. 먼저, 각 "장기 설문조사"의 길이를 결정하세요.논쟁의 여지가 있어서 타임아웃을 5분으로 선택하겠습니다.
  2. 클라이언트 측 바인딩에서 sendTimeout="00:05:00".
  3. 긴 폴링에 XmlHttpRequest(XHR)를 사용하는 것과 마찬가지로 실제로 시간 초과가 발생하면 이를 감지하고 다음 폴링 요청을 다시 발행해야 합니다.특정 예외가 있기 때문에 WCF에서는 매우 쉽습니다. TimeoutException, 쉽게 감지할 수 있는 것이 문제였습니다.다른 예외.
  4. WCF 서비스를 호스팅하는 방법에 따라 최대 5분 동안 처리를 허용하도록 구성해야 합니다.순수한 WCF 관점에서 볼 때 receiveTimeout="00:05:00".그러나 ASP.NET 내부에서 호스팅하는 경우 ASP.NET 런타임이 더 높은 시간 제한을 갖도록 구성해야 하며 이는 다음을 사용하여 수행됩니다. <httpRuntime executionTimeout="300" /> (메모: 이 속성의 측정값은 초 단위입니다.

클라이언트에서 효율적이기

클라이언트가 서비스를 동기적으로 호출하도록 설정하고 클라이언트가 응답을 기다리는 동안 5분 동안 차단한다면 이는 시스템 리소스를 매우 효율적으로 사용하는 것이 아닙니다.이러한 호출을 백그라운드 스레드에 넣을 수 있지만 호출이 처리되지 않는 동안 여전히 스레드 리소스를 소모하게 됩니다.이를 처리하는 가장 효율적인 방법은 비동기 작업을 사용하는 것입니다.

서비스 계약을 직접 작성하는 경우 확인해 보시기 바랍니다. MSDN의 이 섹션 OperationContractAttribute.AsyncPattern 추가하는 방법에 대한 자세한 내용은 BeginXXX/EndXXX 각 호출에 대한 비동기 메서드 쌍.그러나 사용 중인 경우 svcutil 작업 계약을 생성하려면 비동기 메서드를 생성하기 위해 해야 할 일은 /async 명령줄의 옵션입니다.이 주제에 대한 자세한 내용은 MSDN에서 동기 및 비동기 주제를 확인하세요..

이제 비동기 작업을 정의했으므로 패턴은 XHR 작업과 매우 유사합니다.당신은 전화 BeginXXX 전달하는 방법 AsyncCallback 대리자.그만큼 BeginXXX 메소드는 당신에게 IAsyncResult, 작업을 기다리거나(고급 시나리오에서) 무시할 수 있는 경우 WCF 인프라가 비동기적으로 서버에 요청을 보내고 백그라운드에서 응답을 기다립니다.응답을 받았을 때 또는 예외가 발생하면 전달한 콜백이 BeginXXX 메소드가 호출됩니다.이 콜백 메서드 내에서 해당 메서드를 호출해야 합니다. EndXXX 메서드를 전달하는 방법 IAsyncResult 그것은 당신에게 건네진 것입니다.통화 중에 EndXXX 메서드를 호출하는 동안 발생할 수 있는 모든 종류의 논리적 오류를 처리하려면 예외 처리를 사용해야 하지만 이제 여기서도 오류를 포착할 수 있습니다. TimeoutException 우리는 이전에 이야기했습니다.좋은 응답을 받았다고 가정하면 데이터는 EndXXX 전화를 걸면 어떤 방식으로든 해당 데이터에 반응할 수 있습니다.

메모: 이 패턴에 대해 염두에 두어야 할 한 가지는 스레딩의 특성입니다.WCF의 비동기 콜백은 다음 스레드에서 수신됩니다. 관리되는 스레드 풀.WPF 또는 WinForms와 같은 기술에서 UI를 업데이트할 계획이라면 다음을 사용하여 호출을 UI 스레드로 다시 마샬링해야 합니다. Invoke 또는 BeginInvoke 행동 양식.

서버에서 효율적이기

클라이언트의 효율성에 대해 걱정하려면 서버에 관해서는 두 배로 걱정해야 합니다.분명히 이러한 유형의 접근 방식은 클라이언트에 알림을 다시 보낼 이유가 있을 때까지 연결이 열려 있고 보류 상태를 유지해야 하기 때문에 서버 측에 더 많은 요구를 가합니다.여기서 문제는 WCF 런타임을 실제로 이벤트를 보내는 클라이언트의 처리에만 연결하려는 것입니다.그 밖의 모든 것은 이벤트가 발생하기를 기다리면서 잠자기 상태여야 합니다.운 좋게도 방금 클라이언트 측에서 사용한 것과 동일한 비동기 패턴이 서버 측에서도 작동합니다.그러나 이제 중요한 차이점이 있습니다.지금 반환해야합니다 IAsyncResult (그리고 따라서 WaitHandle) 로부터 BeginXXX 호출하기 전에 WCF 런타임이 신호를 받기를 기다리는 메서드입니다. EndXXX 방법.

당신은 것입니다 ~ 아니다 이전에 이미 제공한 링크 외에 MSDN 내부의 문서화 방식에서 많은 것을 찾을 수 있으며 불행히도 비동기 서비스 작성에 대한 샘플은 유용하지 않습니다.즉, Wenlong Dong은 비동기 모델을 사용하여 WCF 서비스를 확장하는 방법에 대한 글을 썼습니다. 얼마 전에 확인해 보시기를 적극 권장합니다.

이 외에도 서버 측에서 비동기 모델을 구현하는 가장 좋은 방법에 대해 솔직히 많은 조언을 드릴 수는 없습니다. 이벤트가 처음에 어떤 종류의 데이터 소스에서 나올지에 전적으로 달려 있기 때문입니다.파일 I/O?메시지 대기열?데이터베이스?외관을 제공하려는 자체 메시징 서비스가 있는 다른 독점 소프트웨어가 있습니까?잘 모르겠지만, 그들은 모두 자신의 서비스를 최대한 효율적으로 만들기 위해 자신의 서비스를 피기백할 수 있는 자체 비동기 모델을 제공해야 합니다.

업데이트된 처방전

이것이 인기 있는 답변인 것 같아서 여기로 돌아와서 최근 풍경 변화에 따른 업데이트를 제공해야 한다고 생각했습니다.이 시점에는 이제 다음과 같은 .NET 라이브러리가 있습니다. 시그널R 이는 정확한 기능을 제공하며 서버와의 통신 구현을 권장하는 방법입니다.

다른 팁

서버가 서비스 버스에 나가는 연결을 만들 수 있다면 호출 유형을 제거 할 수 있습니다. 이렇게하면 클라이언트/서버가 서로에 대해 전혀 알 필요가 없습니다. 보다 .NET 서비스 버스

당신은 조사하고 싶을 것입니다 wsdualhttpbinding

WSDUALHTTPBINDING은 WSHTTPBinding과 웹 서비스 프로토콜과 동일한 지원을 제공하지만 이중 계약과 함께 사용합니다. wsdualhttpbinding은 비누 보안 만 지원하며 안정적인 메시지가 필요합니다. 이 바인딩은 클라이언트가 서비스에 콜백 엔드 포인트를 제공하는 공개 URI를 가지고 있어야합니다. ClientBaseAddress가 제공합니다. 이중 바인딩은 클라이언트의 IP 주소를 서비스에 노출시킵니다. 클라이언트는 보안을 사용하여 신뢰하는 서비스에만 연결되도록해야합니다.

WCF는 아니지만 XMPP를 사용하여 해당 기능을 수행 할 수 있습니다. 에 관한 기사가 있습니다 정보 Q 그것과 다른 시스템에 대해. 이 기사는 XMPP를 HTTP에서 사용할 수 없다고 말하지만 보쉬.

사용 가능한 .NET 라이브러리가 있습니다 AGSXMPP 하나의 이름을 지정합니다.

내가 일하는 회사는 업데이트 알림을 사용자 인터페이스의 일부를 새로 고치기 위해 업데이트 알림을 응용 프로그램으로 푸시하기 위해 사용하기 시작했습니다.

구글 "WCF 이중". 나는 이것을 NetTCPBinding (대륙 전체)로 사용하여 성공적으로 사용했지만 Basichttpbinding에 대해서는 확실하지 않습니다.

그러나 서버가 클라이언트로 다시 호출해야합니다. 서버 가이 작업을 수행 할 수 없으면 폴링이 유일한 옵션 일 수 있습니다 ...

서버가 클라이언트를 호출 할 수없는 경우 (일반적으로 그렇지 않아야하는 경우) 지정된대로 클라이언트가 서버를 폴링해야합니다. WCF 재단이 이미 설치되어 있으므로이를 위해 작업을 추가하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top