2011-07-15 53 views
0

這似乎是一個基本的Web服務問題。然而,基於我已經能夠做的一些研究,一個優雅的解決方案是難以捉摸的。我想我在這裏丟失的東西調用Java Web服務的WCF客戶端:XmlSerializer找不到派生類型

我正在使用WCF客戶端連接到我無法控制的外部Web服務。外部WS是基於Java的。有一些程序集提供來調用Web服務中的方法。這些程序集具有基類和派生類。 Web服務方法可以將Base類作爲參數,而從WCF客戶端實例化Derived類並將其傳遞給方法。

爲了模擬這個場景,我創建了一個帶有一個ClassLibrary的小項目,它具有一個BaseClass和一個DerivedClass類型的方法。

然後我創建一個asmx web服務並在其中添加一個HelloWorld方法。我添加了對ClassLibrary的引用。這個方法需要一個BaseClass類型參數。

然後,我創建一個服務引用到ASMX Web服務。在代理類中,如果該方法已經不存在,我將向該方法添加一個XmlSerializerFormatAttribute。

從WCF客戶端,我調用ASMX web方法

BaseClass的BC =新的派生();

ServiceReference1.TestService ts = new WCFTest.ServiceReference1.TestService();

lbl1.Text =(c1.HelloWorld(bc));

調用失敗,錯誤 類型ClassLib.Derived不是預期的。使用XmlInclude或SoapInclude屬性指定靜態未知的類型。

我可以調用此Web服務方法的唯一方法是將XmlInclude屬性添加到ClassLibrary中的BaseClass。 在我的場景中,這個庫是一個由外部供應商提供的DLL。我無法將屬性添加到其類中。我看過DataContractSerializer和KnownTypes和XmlSerializer ctor。但是這些解決方案似乎不適用於我的情況。

我該如何讓XMLSerializer查看我在WCF客戶端中引用的程序集中的派生類?有沒有優雅的解決方案?

感謝, 下襬

回答

0

包括一個XmlSerializerOperationBehavior可能只是工作,你自己的類型映射,但我沒有試過(見GetXmlMappings)。

http://msdn.microsoft.com/en-us/library/system.servicemodel.description.xmlserializeroperationbehavior.aspx

另外,強制使用的DataContractSerializer的通過DataContractSerializerOperationBehavior(相對於它的使用現在XmlSerializerOperationBehavior)可能工作也一樣,如果你指定自己的已知類型

http://msdn.microsoft.com/en-us/library/ms576751%28v=vs.85%29.aspx

最後作爲最後手段,您可以使用DataContractSerializerOperationBehavior強制使用DataContractSerializer,然後指定您自己的DataContractSurrogate以強制使用XmlSerializer,您可以在其中將自定義類型傳遞給它的構造函數(它規避了XmlInclude屬性的需求)。

http://msdn.microsoft.com/en-us/library/ms751540.aspx

希望有所幫助。

+0

我會看看這些選項。謝謝 – Hem