Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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# 如何处理web服务中使用的冗余类_C#_Visual Studio_Oxygene - Fatal编程技术网

C# 如何处理web服务中使用的冗余类

C# 如何处理web服务中使用的冗余类,c#,visual-studio,oxygene,C#,Visual Studio,Oxygene,我已经开始使用一些在VisualStudio2012中作为web服务添加时具有惊人冗余的web服务。以下两个WSDL演示了这一点: 这些服务分别用于创建新会话和关闭会话。每个服务都有自己的MessageHeader类,该类又有一个成员,该成员来自在每个生成的代理中重新定义的MessageData类。还有其他类似的,但我不一一列举 当我想要创建一个帮助函数来设置我的请求并填充信封中的所有常见内容(如时间戳、身份验证等)时,这就很困难了,因为Service1.MessageHeader与Serv

我已经开始使用一些在VisualStudio2012中作为web服务添加时具有惊人冗余的web服务。以下两个WSDL演示了这一点:

这些服务分别用于创建新会话和关闭会话。每个服务都有自己的
MessageHeader
类,该类又有一个成员,该成员来自在每个生成的代理中重新定义的
MessageData
类。还有其他类似的,但我不一一列举

当我想要创建一个帮助函数来设置我的请求并填充信封中的所有常见内容(如时间戳、身份验证等)时,这就很困难了,因为Service1.MessageHeader与Service2.MessageHeader的类型不同。我已经尝试过duck类型,但就我所见,这种嵌套的特性会阻止这种方法

查看WSDL,这些类都被定义为来自相同的名称空间。换句话说,在这两个wsdl中,
MessageHeader
被定义为:

<xsd:import namespace="http://www.ebxml.org/namespaces/messageHeader" schemaLocation="msg-header-2_0.xsd"/>
...
<part name="header" element="eb:MessageHeader"/>

...
有没有办法让VS明白这两个类中的内容是相同的,并以某种方式将它们区分为两个类的共同点?还是“web服务是一个孤岛”?我真的不想为我需要的每一种web服务类型创建单独的代码,因为它们远远不止这两种。但它们都使用相同的类

我曾想过亲自动手破解代理类。但是,除了我担心这会使VS滑出一些齿轮,因为我把它在幕后所做的事情搞砸了,它从未期望我去修补,如果WSDL中需要重新同步的东西发生变化,我将失去整个自动生成

我在C#和Oxygene中都试过,遇到了同样的问题。我想在VS下的其他语言中也是如此。这似乎与它如何理解WSDL有关


在任何人询问之前,我不能改变任何关于实际web服务的内容。这完全是另一家公司,而不是一家根据我的奇思妙想对重新设计其广泛使用的系统感兴趣的公司。

我找到了一个解决这个问题的潜在方案,而且它在我所知道的各个方面都能起作用。但我愿意接受批评或“更好的方法”(包括从GUI执行此操作的更好方法)

我发现使用以下命令可以生成我想要的适当的“单单元”类型的接口,所有类型都是共享的:

 wsdl.exe /sharetypes /language:CS "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl" "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCloseRQ.wsdl" /o:"SabreWebServices.cs" /n:SabreWebServices
这就产生了一个C#1。对于Oxygene,我使用:

 wsdl.exe /sharetypes /language:OXYGENE "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl" "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCloseRQ.wsdl" /o:"SabreWebServices.pas" /n:SabreWebServices
FWIW,我在我的机器上使用了
“c:\Program Files\Microsoft SDK\Windows\v8.1A\bin\NETFX 4.5.1 Tools
目录中的wsdl

我将生成的包装文件添加到我的应用程序中,如果与通过添加服务引用创建的包装有点不同的话,那么它工作得非常好。实际上,我更喜欢这样创建的语法。它还具有只创建一个文件而不是多个文件的好处,并且不会干扰app.config。如果您想更改对于端点,您可以只设置实例化的任何服务的
Url
属性


我是通过这个途径找到这个解决方案的。

您是使用Web引用还是服务引用?如果是后者,那么您可以尝试单击高级菜单上的“共享类型”。我是通过添加服务引用添加它的,所以是后者。您指的是“重用引用程序集中的类型”吗“选择?我两个都查过了。你试过这两个例子吗?我不确定这是否对这个问题没有任何作用,或者它是否因为他们编写xsd的方式而不起作用。我确实发现了一些信息,WSCF.blue可能是一个很好的选择,但还没有尝试过。