2013-01-09 9 views
2

WCF 라우팅 서비스를 구현했습니다. 또한 서비스 (또는 이와 유사한 WCF 서비스)를 통해 규정 된 균일 한 (컨텐트에 무관 한) 방식으로 페이로드를 변형하고 싶습니다. 예를 들어 페이로드는 항상 Foo<T>의 형식을 취하며 모든 경우에 Bar<T>으로 전달하려고합니다. XSLT 또는 프로그래밍 방식의 변환에 만족합니다. 수신 된 메시지의 유형이 Foo<T>이 아닌 경우 어떤 일이 발생하는지 상관하지 않습니다.콘텐츠 변환을 사용하는 WCF 라우팅

많은 OOTB 기능 (예 : 수많은 바인딩 지원)을 제공하므로 WCF를 사용하고 싶습니다. 새로운 메시지 유형이 라우팅 될 때마다 재 컴파일/재배포가 필요하므로 각각의 닫힌 일반 (Foo<Class1>Bar<Class1>, Foo<Class2>-Bar<Class2> 등)을 변환하는 수많은 상용구 메서드를 사용하여 WCF 서비스를 구현하는 것은 실용적이지 않습니다.

내가 아는 한 WCF는 공개 제네릭을 처리하지 않으며 WCF 라우팅은 콘텐츠 변환 OOTB를 용이하게하지 않습니다. 즉, System.ServiceModel.Routing.RoutingService은 분명히 특정 형식이 아닌 WCF 호출을 가로 채기 때문에 동일한 목표를 달성하기 위해 동일한 패턴을 활용하기를 희망했습니다. 아무도 이것을 수행하는 방법에 대한 방향을 제시 할 수 있습니까? (또는 불가능한 이유를 나타낼 수 있습니까?)

+1

는 XML 기반의 변환의 어떤 종류를 구현하기 위해 아마도 낮은 수준의 메시지 처리에 가능하지만, 난 당신이 하나 개의 핵심 아이디어를 기반으로 그 때문에 두 가지 이유에 대한 일반적인 지원을 찾을 수 없습니다 생각 : MS는 이미 도구를 가지고 라우팅 및 변환을위한 준비 : 쉬운 시나리오를위한 워크 플로 서비스 및 실제 응용 프로그램 통합을위한 BizTalk Server –

+0

이것은 IDispatchMessageInspector를 사용하여 가능할 것으로 보입니다. – Mark

+0

혹시 이것에 대한 해결책을 찾았습니까? 고마워요. –

답변

3

질문에 대한 내 의견에 제안했듯이 IDispatchMessageInspector를 사용하여이 문제를 해결할 수 있습니다. 내가 20 개 클래스의 코드를 게시하는 것보다 쉽게 ​​쓰는 것을 끝내 버린 극히 무언가 다운 버전을 찾으십시오. 누구든지이 코드를 훨씬 깔끔하고 진보 된 방식으로 구현하려는 완전한 솔루션을 원한다면 알려주십시오. CodeProject에서 데모를 시작하겠습니다. 당분간, 당신은 배짱의 발췌 문장에 행복하다고 생각할 것입니다.

콘솔 명령을 분명히 제거 할 수 있습니다 (자체 호스팅하는 경우 디버깅 할 수 있습니다).

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
    { 
     if (request == null || request.IsEmpty) 
      return null; 

     Console.WriteLine(); 
     Console.ForegroundColor = ConsoleColor.Green; 
     Console.WriteLine(request); 
     Console.ResetColor(); 

     // Load the request into a document. 
     XPathDocument document; 
     MemoryStream stream; 
     using (stream = new MemoryStream()) 
     { 
      using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(stream)) 
      { 
       request.WriteMessage(writer); 
       writer.Flush(); 
       stream.Position = 0L; 
       document = new XPathDocument(stream); 
      } 
     } 

     // Load the XSLT. 
     XslCompiledTransform transformer = new XslCompiledTransform(); 
     transformer.Load("RequestTransformation.xslt"); 

     // Transform the document. 
     byte[] transformedDocument; 
     using (stream = new MemoryStream()) 
     { 
      transformer.Transform(document, null, stream); 
      transformedDocument = stream.ToArray(); 
     } 

     // Construct new request from tranformed document. 
     stream = new MemoryStream(transformedDocument); 
     XmlReader reader = XmlReader.Create(stream); 
     Message modifiedMessage = Message.CreateMessage(reader, int.MaxValue, request.Version); 
     modifiedMessage.Properties.CopyProperties(request.Properties); 
     request = modifiedMessage; 

     Console.WriteLine(); 
     Console.ForegroundColor = ConsoleColor.Yellow; 
     Console.WriteLine(new System.Text.UTF8Encoding(false).GetString(transformedDocument)); 
     Console.ResetColor(); 

     return null; 
    } 
+0

나는 완전한 해결책을보고 싶습니다. 기사를 쓸 시간이 있다면 알려주십시오. 감사. – Kamyar