2013-01-09 26 views
2

我已經實現了一個WCF路由服務;我還希望服務(或類似的WCF服務)以規定的和統一的(內容不可知的)方式來轉換有效負載。例如,有效載荷將始終採用Foo<T>的形式,我想在所有情況下都將其作爲Bar<T>傳遞。我很高興XSLT或程序化的轉變。我不在乎接收到的消息的類型不是Foo<T>帶內容轉換的WCF路由

我希望使用WCF,因爲它提供了很多OOTB功能(例如,它支持多種綁定)。這是不切合實際的落實與衆多樣板方法WCF服務以使每個關閉通用(Foo<Class1> - > Bar<Class1>; Foo<Class2> - > Bar<Class2>;等等),因爲這將每一次新的消息類型是被路由需要重新編譯/重新部署。

據我所知,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