C#web-service客户端:具有相同(复杂)返回类型的多个Web服务方法?

我正在努力建立一个Java B2B Web服务的客户端,我想我已经确定了我们已经遇到的问题的原因已经有一段时间了。 不幸的是我无法发布WSDL。

显然,我的自动生成的代理代码(通过wsdl.exe:由于WCF不支持密码摘要而必须使用WSE 3.0)无法处理具有多个具有相同复杂返回类型的Web方法的Web服务的WSDL。

举例来说 – 一个定义以下方法的Web服务:

Public ComplexTypeX Blah(); Public ComplexTypeX Blue(); Public ComplexTypeX Foo(); Public ComplexTypeY Bar(); 

在我的Reference.cs文件中,如果我注释掉所有调用Blah(),Blue()或Foo()中的任何两个的代码,那么剩余的未注释方法可以被调用没有问题。 但是,如果我没有注释掉这三个方法中的多个(例如,Blah()和Foo()),那么在实例化 Web服务客户端代码时,我会收到以下错误消息:

“方法Blah无法反映出来。” “命名空间’ http://some.url ‘中的XML元素’ComplexTypeX’引用方法和类型。使用WebMethodAttribute更改方法的消息名称,或使用XmlRootAttribute更改类型的根元素。”

现在,肯定没有将ComplexTypeX方法定义为Web服务的一部分,所以我只能假设.NET(或至少wsdl.exe)不允许您使用返回复杂的Web服务(用户定义) )跨多种方法的相同类型的类型……对吗?

我遇到了类似的问题,这就是我发现的:

我已经定义了一个复杂类型作为响应返回:

 public class FooResponse {...} [WebMethod] public FooResponse Foo() {...} 

请注意,这里Foo / Foo + Response的确切名称配对很重要。 当我按如下方式更改方法名称时,问题就消失了:

 public class FooResponse {...} [WebMethod] public FooResponse Fooxxx() {...} 

我相信正在发生的事情是.NET试图使用名为FooResponse的元素自动包装来自Foo方法的响应。 使用与要返回的对象相同的名称会产生歧义。 尝试更改响应对象的名称或方法名称以避免此冲突。

我刚刚搜索了“引用方法和类型”,发现了一个Connect错误报告“ System.InvalidOperationException:来自命名空间*的XML元素*引用了一个方法和一个类型 ”。 在这种情况下,有一个操作和一个具有完全相同名称的元素(本地名称和命名空间)。


值得注意的是微软的部分回应:

我们不再对ASMX进行增强; 我们继续支持其现有function,但在可能的情况下,我们建议使用WCF。

我发现了另一个引发错误的案例! 这是我的代码:

 [WebMethod] public CheckUpdateResponse CheckUpdate() { ... } 

好吧,让我解释一下:返回类型CheckUpdateResponse是一个结构, CheckUpdate()是方法。 因此,在WSDL .NET中,在一个XML元素中自动添加一个“ Response ”后缀到方法名称CheckUpdate ,以描述该方法的返回值。

Etvoilà:它找到了一个重复的元素并给出错误“使用WebMethodAttribute更改方法的消息名称……”

方案 ? 我将返回类型重命名为“CheckUpdateResult”,现在一切正常!

我希望这会对某人有所帮助!

所以我只能假设.NET(或者至少是wsdl.exe)不允许你使用一个web服务来返回多种方法中相同类型的复杂(用户定义)类型……对吗?

这是不正确的。 想象一下,如果它是真的会有多大的痛苦 – 你只能有一个方法返回一个String,一个返回一个Double,一个返回SomeObject,等等……这将是一场噩梦。

我对.NET中的Web服务并不是很熟悉,但是从你得到的错误来看,听起来你遇到了XML命名空间的问题 – 也许存在名称冲突。 我试图按照错误消息中的建议修改WebMethodAttribute

此外,如果由于某些公司隐私/敏感问题而无法发布与您遇到的问题相关的一段代码/文档,您应该发布一个仍然certificate您的测试用例的已清理版本。 几乎任何“敏感”的东西都应该能够被简化为一个更简单的代码片段,这些代码片段仍能让你的观点得到满足而不会背叛任何敏感性。

很奇怪。 通常,WSDL会提供一个通用类型,当通过wsdl.exe或svcutil.exe进行编译时,您将获得一个共享的公共类型,以便在同一个接口中的任意数量的方法中使用。

在同一个应用程序中引用多个独立的 WSDL时会出现问题,这些WSDL共享表面上相同的类型,这会导致生成两种不同的CLR类型。 有很多方法可以解决这个问题 – 它是众所周知的。 然后是将现有业务对象映射到从WSDL生成的类型的一些相关问题。 另一个先前探索的景观。

但是你在谈论不同的东西。

使用WSDL.exe有一个开关/共享类型 。 这应该解决这个问题。

此外,我不同意它是Microsoft的东西,因为相同的类被暴露为多个wsdl中的不同复杂类型。 这不是一个很好的抽象设计。

准备参考用于共享类型的Microsoft文档打开类型共享function。 此function为不同服务之间共享的相同类型创建一个具有单一类型定义的代码文件(名称空间,名称和电线签名必须相同)。 使用http:// URL作为命令行参数引用服务,或为本地文件创建discomap文档。