2009-06-05 3 views
2

WCF에서 제공하는 콜백 인프라를 기반으로 클라이언트 서버를 프로그래밍하려고하지만 비동기 적으로 작동하지 않습니다.WCF : 콜백이 비동기 적이 아닙니다.

제 의뢰인은 내가 서버가 일부 처리를 수행하고 클라이언트와 통신 할 수있는 콜백 객체를 사용하면

MyCallback callback = 
     OperationContext.Current.GetCallbackChannel<MyNamespace.MyCallback>() 

를 수행하여 클라이언트 콜백 채널을 저장 로그인 메소드를 호출하는 서버에 연결합니다.

이 모든 문제는 클라이언트의 호출을 수행 할 때 OperationContract의 메서드를 IsOneWay=true으로 설정했지만 서버가 여전히 중단된다는 사실에 있습니다.

Visual Studio에서 디버깅을 위해 서버를 시작하고, 디버깅하고, 클라이언트를 시작하고, 위에서 언급 한 로그인 메서드를 호출하고, 클라이언트의 구현 된 콜백 메서드에 중단 점을 넣고 서버가 클라이언트에 응답을 보냅니다. 서버는 클라이언트의 응답을 기다리면서 수행 할 작업을 중단합니다.

도움을 주시면 감사하겠습니다.

답변

0

당신의 문제에 대한 해결책은 서비스에 대한 'ConcurecyMode'및 'Instance ContextMode'속성을 올바르게 설정하는 것이라고 생각합니다. 아래 exemple에서와 같이 이러한 속성을 가진 서비스 선언을 장식해야 할 : 모든 클라이언트에 대해 실행중인 서비스의 인스턴스가 하나 때문에

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)] 
    public class SubscriberService: ISubscriberServiceContract 
{...} 

는 InstanceContextMode.Single는 Singleton 객체로 서비스를 구축;

ConcurencyMode.Reentrant 또는 ConcurencyMode.Multiple은 서비스 인스턴스에 대해 다중 스레드 작업을 사용 가능하게합니다. '다중'의 경우 서비스에서 스레드 동기화를 처리해야합니다.

+0

이미 여러 개로 표시되어 있고 재진입을 시도했으며 동일합니다. 서비스가 특정 조건에서 여전히 차단 될 수 있다고 표시된 경우에도 문제는 예외적 인 경우가 아니라 일반적인 경우입니다. 바인딩을 구성하는 방법과 관련이 있다고 추측하고 있지만 변경할 수있는 내용은 표시되지 않습니다. 도움 주셔서 감사합니다. –

+0

여러 개의 스레드가 동시에 허용되지만 하나만 허용되도록 구성 되었기 때문에 다중 및 재진입 기능이 작동하지 않았습니다. 그러나 전화를 걸면 안되기 때문에이 문제가 해결되지 않습니다. 메시지 전송을 처리하는 스레드를 구현할 것입니다. 모든 것에 대해 감사드립니다. –

0

당신은 콜백 인터페이스를 구현하는 클라이언트 측 개체에 대한

[CallbackBehavior(UseSynchronizationContext = false)] 

을 설정하려고 했습니까?

1

트릭은 콜백을 서버에서 비동기 적으로 호출하는 것입니다. 다음을 확인하십시오 :

[OperationContract(IsOneWay = true, AsyncPattern = true)] 
    IAsyncResult BeginOnMessageReceived(LiveDataMessage message, AsyncCallback acb, object state); 
    void EndOnMessageReceived(IAsyncResult iar); 
+0

어떻게 end 메소드가 정의 되었습니까? EndOn이 end 연산을 정의하는 'EndOnMessageReceived' 규칙에 의해서만 가정 할 수 있습니다. 이 링크가 구현되어있는 예제에 대한 링크가 Google/So 검색 할 수있는 모든 조회를 제기하지 마십시오. – g18c

관련 문제