这似乎是一个基本的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类?有优雅的解决方案吗?
谢谢, 下摆
答案 0 :(得分:0)
包含XmlSerializerOperationBehavior的自己的类型映射可能会起作用,但我还没有尝试过(请参阅GetXmlMappings)。
或者,如果您指定自己的已知类型,则强制通过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
希望有所帮助。