Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 外部服务的WSDL处理实践_C#_Xml_Web Services_Wsdl_Svcutil.exe - Fatal编程技术网

C# 外部服务的WSDL处理实践

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

我有一个项目,它依赖于Oracle托管的web服务(而不是WCF)。我有一份服务及其相关XSD的WSDL副本

为此生成代理和datacontract程序集的正确方法是什么

我从

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搞砸了=/