C# 外部服务的WSDL处理实践
我有一个项目,它依赖于Oracle托管的web服务(而不是WCF)。我有一份服务及其相关XSD的WSDL副本 为此生成代理和datacontract程序集的正确方法是什么 我从C# 外部服务的WSDL处理实践,c#,xml,web-services,wsdl,svcutil.exe,C#,Xml,Web Services,Wsdl,Svcutil.exe,我有一个项目,它依赖于Oracle托管的web服务(而不是WCF)。我有一份服务及其相关XSD的WSDL副本 为此生成代理和datacontract程序集的正确方法是什么 我从 XSD.exe /c /language:CS user.xsd 对于我的每个XSD。这将生成一组共享类型冲突的类对象(所有类中都是同一个对象),因此我删减了所有重复项,使它们具有单个声明 然后仅使用我的类文件“datacontracts.dll”构建该程序集 然后我生成了我的服务客户机 svcutil.exe us
XSD.exe /c /language:CS user.xsd
对于我的每个XSD。这将生成一组共享类型冲突的类对象(所有类中都是同一个对象),因此我删减了所有重复项,使它们具有单个声明
然后仅使用我的类文件“datacontracts.dll”构建该程序集
然后我生成了我的服务客户机
svcutil.exe user.wsdl /n*:SomeNameSpace /r:datacontracts.dll /noconfig
但这似乎并没有真正满足我的需求,因为它仍然导致了服务客户机中所有类的重复
在从XSD生成的类中,我注意到每个类定义都有
[XmlType(Namespace = "urn:/crmondemand/xml/...")]
我是否需要将该属性放置在重复类上的方式,在我将其设置为单数类的每个类中显示一次?这样我就可以
[XmlType(Namespace = "urn:/crmondemand/xml/user")]
[XmlType(Namespace = "urn:/crmondemand/xml/campaign")]
[XmlType(Namespace = "urn:/crmondemand/xml/lead")]
public class SharedClass
还是我的做法错了?下面的工作不是如预期的那样吗
svcutil *.wsdl *.xsd /language:C#
首先是一个警告。。。你可能知道-但如果你不知道,我肯定会说修剪生成的代码是一个灾难的食谱 至于重用类型,我自己从来没有发现微软的堆栈在这方面特别好。。。不过有两种想法。。。有人说“所有的web服务”——就其本质而言——都是独立的实体。。。因此-发出的所有代码仅在该web服务内有效 我觉得这是难以置信的短视。我更喜欢重复使用任何类型的我可以。。。然而,对于.NET,我发现这非常困难。。。我发现的最接近的东西是一个叫做WSCF的工具。它做了一些我非常喜欢的事情,比如为每个类发出单独的cs文件。这使得从其他源“覆盖”它们变得非常容易——只要源生成可序列化的等价物即可 我使用WSCF(classic mind you)时遇到的问题是,它没有实现“xml命名空间”到“c#命名空间”的映射。。。事实上,我必须自己把它添加到工具中。。。(我试着把它重新投入到项目中,但没有收到回音) 因此,我会告诉您尝试WSCF.blue(目标WCF)或查看WCF classic。你可以在codeplex上找到它们
希望这对您有所帮助。“依赖Oracle托管的web服务(而非WCF)”如果我能控制代码,用WCF替换web服务,我可能会使用NHibernate。我会选择这个答案,因为它只承认web服务不是WCF,问题是web服务不是WCF。好吧,谢谢Chris,但我实际上提倡每个Microsoft web堆栈在这方面,我使用的服务“糟糕透了”(不过大部分情况下——我喜欢MS的堆栈)。。。我真的鼓励你看看WSCF.Blue。。。我认为它可以做你想做的事-或者至少让你更接近。。。(我在.NET中处理的每一个项目都使用它)你会发现最大的“爆炸”是“在单独的文件中发射”选项。。。然后-即使完全相同的类被多次发出,它也会被覆盖。。。(假设它们不是“实际的”名称冲突)我不确定这是否如预期的那样起作用,我有一大堆不同的类用于相同的名称,如Account1 Account2等。这可能是他们的XSD搞砸了=/