C#Web服务客户端:具有相同(复杂)返回类型的多个Web服务方法?我正在尝试为JavaB2BWeb服务设置客户端,我想我已经确定了我们已经遇到一段时间的问题的原因。不幸的是我不能发布WSDL。显然,我自动生成的代理代码(通过wsdl.exe:必须使用WSE3.0,因为WCF不支持加密摘要)无法处理具有多个具有相同复杂返回类型的Web方法的Web服务的WSDL。作为示例-定义以下方法的Web服务:PublicComplexTypeXBlah();公共ComplexTypeXBlue();公共ComplexTypeXFoo();公共ComplexTypeYBar();在我的Reference.cs文件中,如果我注释掉所有调用Blah()、Blue()或Foo()中任意两个的代码,那么可以毫无问题地调用其余未注释的方法。但是,如果我不注释掉这三种方法中的一种以上(例如,Blah()和Foo()),我在实例化Web服务客户端代码时会收到以下错误消息:“MethodBlahcannotReflected。”“命名空间'http://some.url'中的XML元素'ComplexTypeX'指的是方法和类型。使用WebMethodAttribute更改方法的消息名称,或使用XmlRootAttribute更改类型的根元素。“现在,绝对没有ComplexTypeX方法被定义为Web服务的一部分,所以我只能假设.NET(或至少wsdl.exe)不允许您使用返回复杂(用户-已定义)跨多个方法的相同类型...对吗?我有一个类似的问题,这是我发现的:我定义了一个复杂类型作为响应返回:publicclassFooResponse{...}[WebMethod]publicFooResponseFoo(){...}请注意,Foo/Foo+Response的确切名称配对在这里很重要。当我按如下方式更改方法名称时,问题消失了:publicclassFooResponse{...}[WebMethod]publicFooResponseFooxxx(){...}我相信正在发生的事情是.NET试图用一个名为FooResponse的元素自动包装来自Foo方法的响应。使用与返回对象相同的名称会产生歧义。尝试更改名称responseobjectorthemethodname为了避免这种冲突,我刚刚搜索了“referencingmethodsandtypes”,发现了一个Connectbug报告“System.InvalidOperationException:XMLelement*fromnamespace*referencedamethodandatype”。在这种情况下,有一个动作和一个名称完全相同的元素(本地名称和命名空间)。微软回应中值得注意的部分:我们不再对ASMX进行增强;我们继续支持其现有功能,但在可能的情况下,我们建议使用WCF。我发现了另一个抛出错误的案例!这是我的代码:[WebMethod]publicCheckUpdateResponseCheckUpdate(){...}好吧,让我解释一下:返回类型CheckUpdateResponse是一个结构,CheckUpdate()是一个方法。因此,在WSDL.NET中,会自动在一个XML元素中的方法名CheckUpdate后面加上一个“Response”后缀来描述方法的返回值。Etvoilà:它找到一个重复的元素并给出错误“使用WebMethodAttribute更改方法的消息名称......”方案?我将返回类型重命名为“CheckUpdateResult”,现在一切正常!我希望这可以帮助别人!所以我只能假设.NET(或至少wsdl.exe)不允许您使用Web服务在多种方法中返回相同类型的复杂(用户定义)类型……对吗?这是不正确的。想象一下如果它是真的会有多痛苦——你只能有一个方法返回一个String,一个方法返回一个Double,一个返回SomeObject,等等……这将是一场噩梦。我不太熟悉.NET中的Web服务,但从您收到的错误来看,听起来您遇到了XML命名空间问题-可能存在名称冲突。我尝试按照错误消息中的建议修改WebMethodAttribute。此外,如果由于某些公司隐私/敏感性问题而无法发布与您遇到的问题相关的一段代码/文档,则您应该发布一个仍然可以证明的测试用例的清理版本。几乎任何“敏感”的东西都应该能够简化为一个更简单的代码片段,该代码片段仍然可以在不泄露任何敏感性的情况下传达您的观点。很奇怪。通常,WSDL将提供一个通用类型,当通过wsdl.exe或svcutil.exe编译时,您将获得一个共享的公共类型,用于同一接口中的任意数量的方法。当在同一个应用程序中引用多个独立的WSDL,表面上共享相同的类型时,就会出现问题,这会导致生成两种不同的CLR类型。有很多方法可以解决这个问题——这是众所周知的。然后是将现有业务对象映射到从WSDL生成的类型的一些相关问题。另一个以前探索过的景观。但你说的是不同的东西。要使用WSDL.exe,有??一个开关/share类型。这应该可以解决问题。另外,我不同意这是Microsoft的事情,因为同一个类在多个wsdls中公开为不同的复杂类型。这不是一个很好的抽象设计。准备好参考Microsoft文档的共享类型开放类型共享功能。此函数为不同服务之间共享的相同类型创建一个具有单一类型定义的代码文件(命名空间、名称和线路签名必须相同)。使用http://URL作为命令行参数来引用该服务,或为本地文件创建一个discomap文档。以上是C#学习教程:C#web-serviceclient:multiplewebservicemethodswiththesame(complex)returntype?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
