2012-02-20 2 views
0

메시지 버스를 통해 WCF 전송을 확장 중이므로 요청 - 응답 모드가 제대로 작동합니다. 입출력 모드를 구현할 때 문제가 발생했습니다. 상황은 다음과 같습니다.IsOneWay = true 인 경우 WCF 서비스 코드가 호출되지 않았습니다.

1, InputChannel 및 OutputChannel을 만들고 TransportBindingElement가이를 반환하도록했습니다.

2, 나는 두 가지 방법으로 계약 인터페이스를 만들었습니다. 하나는 IsOneWay = true라고 말하며, Method1이라고 가정 해 봅시다. 다른 하나는 Method2라는 이름이 아닙니다.

3, Method1을 호출하면 InputChannel 및 OutputChannel 대신 RequestChannel 및 ReplyChannel이 표시됨을 알 수 있습니다. 그리고 응답 채널은 WCF 메시지를 수신하고 RequestContext를 되돌릴 수 있습니다. 그러나 서비스 코드가 호출되지 않았습니다.

4, IsOneWay = Method1에 false로 설정하면 제대로 작동합니다.

4 Method2를 호출하면 제대로 작동합니다.

5, IsOneWay = true 인 단 하나의 메서드 만 가진 다른 서비스 계약을 만들었습니다. 이 메서드를 호출하면 WCF가 InputChannel 및 OutputChannel을 제공하고 제대로 작동합니다 (서비스 코드 실행).

내 질문 : 1, IsOneWay = true 메서드 및 IsOWayWay = false 메서드가있는 서비스가있는 경우 WCF는 요청 회신 채널을 올바르게 제공합니까?

2 메서드를 IsOneWay = true 일뿐만 아니라 같은 서비스 계약에서 IsOneWay = false 메서드를 사용하여 서비스 호출을 처리하는 방법은 무엇입니까?

BTW, IsOneWay = true 메서드에 대한 요청 메시지의 경우 MessageID가 NULL 인 것으로 나타났습니다. 요청 메시지에 새 ID를 설정했지만 서비스 코드가 여전히 호출되지 않았습니다.

답변

1

글쎄, 나는 마침내 이유와 해결책을 얻었다.

WCF는 호출 한 서비스 작업 대신 전체 서비스 계약을 기반으로 최상의 채널 모양을 선택합니다. 따라서 IsOneWay = true이고 IsOneWay = false 메서드와 서비스 계약을 맺은 경우 WCF는 가능한 모든 호출을 처리 할 수 ​​있으므로 요청 - 응답 모드를 사용합니다.

다음으로 요청 회신 모드를 사용하여 단방향 메시지를 처리 ​​할 때 응답 메시지는 null이됩니다. RequestContext.Reply 메서드에서 매개 변수의 수신 메시지가 null임을 의미합니다. 따라서 정상적인 요청 - 응답 모드 (응답 메시지가 null이 아니어야 함) 에서처럼이를 처리 할 수 ​​없습니다. 이제 서버 측 프로세스를 계속 진행하기 위해 기본 운송에 빈 메시지를 보내야합니다.

클라이언트 측에서는 RequestChannel.Request 메서드에서 우리는이 경우 RequestContext.Reply에서 보낸 빈 메시지도 처리해야합니다. null 만 반환하면됩니다.

0

내 의견으로는, 이미 작동하는 솔루션이 있습니다. 귀하의 요청 - 응답 운영에서 귀하의 편도 운영을 다른 서비스 계약으로 분리합니다.

작업 사이의 통신 패턴의 차이는 기술적으로 가능한지 여부와 상관없이 동일한 작업으로 이러한 작업을 함께 표시해서는 안됩니다.

UPDATE

당신이 SIME 종류의 포워딩 서비스를 구현하기 위해 노력하고있다처럼 당신의 코멘트에서 소리? 그렇다면 this을 읽으셨습니까?

+0

예, 실제로 가장 좋은 방법은 요청 - 응답 용 서비스와 한 가지 방법에 대해서만 서비스를 이용하는 것입니다. 하지만 사용자 정의 된 전송 계층을 구현하고 있음을 알고 있습니다. 즉 모든 종류의 서비스 구현과 호스트를 지원하는 것이 좋습니다. WCF가 사용자에게 요청 - 응답과 단방향 서비스를 제공 할 수있게하는 경우, 최선의 방법은 아니지만이를 지원해야합니다. –

+0

내 대답을 업데이트했습니다 –

+0

휴 (Hugh)에게 감사하지만 라우팅 서비스를 구현하지 않습니다. 사실, WCF를 확장하여 엔터프라이즈 메시지 버스를 전송 계층으로 사용하려고합니다. 따라서 내 확장 프로그램을 사용하면 개발자가 다양한 서비스를 전송할 수 있습니다. 하나의 서비스 계약에서 IsOneWay = true와 false를 모두 정의해도 괜찮다면 지원해야합니다. 그리고 HTTP, NET.TCP 및 MSMQ와 같은 빌트인 전송이 모두 지원되어야한다고 생각합니다. –