2017-04-12 8 views
0

WCF 서비스에 작업 (메서드)이 있습니다. 조작에는 Json 컨텐츠의 매개 변수가 있습니다. 메시지 콘텐츠를 기반으로 다른 작업으로 WCF 서비스 호출을 리디렉션하는 방법

[OperationContract] 
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
string NotifyAuditLineUpdated(AuditLineUpdatedModel notification); 

이 매개 변수 AuditLineUpdatedModel, 나는 역 직렬화하는 동안 개체에 JSON 메시지를 매핑 DataContractAttributes 및 DataMemberAttributes를 사용하여 미리 definied 클래스를 만들었습니다.

는 그러나, 나는 문제가 클라이언트가 나는 하나의 클래스에 모든 경우를 결합 할 수 없습니다 같은 필드 이름에서 다른 JSON 메시지 구조을 가지고 있다는 것입니다 있습니다. 즉, Json 메시지는 다른 구조 (값이 아님) 일 수있는 필드가 있습니다; 따라서, 나는 다른 작업을 호출하려고 시도하고있다은 다양한 Json 메시지를 만족시킬 수있다.

지금까지 WCF가 서비스 수준에서 라우팅을 제공한다는 것을 알았습니다. 가능한 경우 운영 수준에서 전화를 라우팅하는 것이 궁금합니다. 다른 말로하면, 나는 다른 매개 변수 유형의 두 가지 연산을 가진 단일 서비스를 가지고있다. 전화를 받고 메시지 내용을 확인한 다음 메시지를 기반으로 적절한 작업으로 통화를 유도 할 수 있습니까?

귀하의 정보를 원하시면 WCF의 IDispatchMessageInspector (메시지 검사기 기능)을 사용해 보았습니다. 메시지 내용을 확인할 수 있었지만 도착 URL (To uri) 주소를 리디렉션하거나 변경할 수 없습니다. 참고 : 또한 클라이언트 서비스는 서로 다른 두 가지 경우에 대해 서로 다른 URI 요청을 보낼 수 없습니다.

+0

- "대상을 리디렉션하거나 변경할 수 없습니다."- 이유를 알려주십시오. 새 메시지 유형을 처리 할 다른 서비스가있는 경우 해당 서비스에 대한 새 서비스 클라이언트를 만들고 새 서비스를 사용하여 메시지를 처리 ​​한 다음 결과를 원래 서비스로 다시 반환 할 수 있어야합니다. –

+0

안녕하세요 @KosalaW, 다음 줄을 실행하려고하면 오류가 발생합니다. 헤더 (MessageHeader.CreateHeader ("To", "To", ))를 추가하십시오. 오류 메시지 : 봉투 버전 'EnvelopeNone (schemas.microsoft.com/ws/2005/05/envelope/none)'; 메시지 헤더 추가를 지원하지 않습니다. –

+0

내 대답보기. 추가 질문이 있으면 알려주십시오. 새 서비스에 대한 헤더를 추가하지 않아도됩니다. 시체가 필요합니다. –

답변

0

이것은 단지 예입니다. 코드는 개념적이므로 원하는 방식으로 구현해야합니다.

[OperationContract] 
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
string NotifyAuditLineUpdated(AuditLineUpdatedModel notification); 

// you can host this somewhere else 
[OperationContract] 
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
string MyInternalService(AuditLineUpdatedModel1 notification); 

public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext) 
{ 
    object response; 
    var isCallToMyInternalServiceRequired = VerificationMethod(request, out response); 
    if(!isCallToMyInternalServiceRequired) 
    { 
     using(var client = new NotifyAuditLineUpdatedClient()) 
     { 
      return client.NotifyAuditLineUpdated(response as AuditLineUpdatedModel); 
     } 
    } 

    using(var client = new MyInternalServiceClient()) 
    { 
     return client.MyInternalServiceClient(response as AuditLineUpdatedModel1); 
    } 
} 

private bool VerificationMethod(object notification, out object output) 
{ 
    // your validation method. 
} 
+0

나는 이것이 지금까지 얻은 최고의 대답이라고 생각하지만, 한 가지는이 대답을 완전한 것으로 만들 것이다. 이 솔루션을 사용하면받은 요청에 따라 이름으로 필요한 모든 메서드를 호출 할 수 있지만 한 가지 문제는 WCF가 원래 클라이언트 요청 메서드를 호출한다는 것입니다. 여기서는 다른 메서드로 호출을 완전히 벗어날 수는 없습니다. ? –