WCF客户端调用Java Web服务:XmlSerializer找不到派生类型

时间:2011-07-15 19:17:52

标签: xmlserializer

这似乎是一个基本的Web服务问题。然而,基于我能够做的一些研究,优雅的解决方案是难以捉摸的。我想我错过了一些东西

我正在使用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 = new Derived();

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客户端中引用的程序集中的Derived类?有优雅的解决方案吗?

谢谢, 下摆

1 个答案:

答案 0 :(得分:0)

包含XmlSerializerOperationBehavior的自己的类型映射可能会起作用,但我还没有尝试过(请参阅GetXmlMappings)。

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

或者,如果您指定自己的已知类型,则强制通过DataContractSerializerOperationBehavior使用DataContractSerializer(与现在使用的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

希望有所帮助。