5

我正在使用用 Java 编写的第 3 方 Web 服务并使用 Apache Axis 1.3。该服务有许多重载操作。当 WCF Svcutil 生成代理时,它会通过在操作名称后附加一个数字来重命名重载操作。例如:

getDataResponse getData(getDataRequest request);

getDataResponse1 getData1(getDataRequest1 request);

这本身不是问题,但是当 Svcutil 生成请求/响应消息时,它会忽略更改 MessageContracts 的 WrapperName 属性。

    [MessageContractAttribute(
        WrapperName = "getData", 
        WrapperNamespace = "http://namespace.com", 
        IsWrapped = true)]
    public partial class getDataRequest1 {  ..  }

当客户端应用程序尝试打开代理时,会抛出以下异常:

InvalidOperationException:操作 getData1 中的 RPC 消息 getDataRequest1 具有无效的正文名称 getData。它必须是 getData1

如果我更改 WrapperName = "getData1" 代理将打开,但是......

  1. 我无法调用该操作,因为该服务无法识别“getData1”
  2. 该服务有近 1100 次操作,其中近一半是重载

有没有办法生成和/或修改代理,以便所有操作都与 WCF 一起工作?

标记

4

6 回答 6

5

对于它的价值(4年后),似乎通过WSDL.exe手动调用并传递/protocol:SOAP参数,可以避免这个问题。对于 Apache Axis 生成的服务,从 VS2012 开始,通过 UI 生成服务客户端似乎仍然会导致此问题。

示例用法:

c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools>wsdl /l:cs /protocol:SOAP http://rxnav.nlm.nih.gov/RxNormDBService.xml /out:c:\drop\rxnavapi.cs

编辑: sphinxxx正确指出 SOAP 协议选项在 UI 中公开为“添加 Web 引用”,因此wsdl.exe不需要直接执行。

于 2013-02-16T00:54:15.630 回答
3

我能够找到的唯一解决方法是手动编辑生成的代码并删除所有我不需要的重载。

于 2009-07-31T13:21:40.310 回答
1

我之前没有看到这个问题,因为你上面有一个“java”标签,我忽略了 Java 问题。您的问题Java 无关,因此不应该有“java”标签。

svcutil 不会重命名重载操作。那是因为没有重载操作之类的东西。WSDL 没有两个具有相同名称但使用不同消息的操作的概念。

如果您查看 Axis 的 WSDL,我相信您会发现这些操作都附加了数字。


更正:在评论中,Mark Good正确地指出 WSDL 1.1 确实允许重载。我碰巧认为它仅在基于 RPC 的服务的上下文中才有意义,其中消息名称可用于区分一个重载和另一个重载。

但是,他可能不知道WS-I Basic Profile 1.1禁止运算符重载:

4.5.3 特殊操作

wsdl:portType配置文件不允许在 a 中重载操作名称。

描述wsdl:portType中的R2304 A的名称属性必须具有具有不同值的操作。

请注意,此要求仅适用wsdl:operations于给定的wsdl:portType. A的名称wsdl:portType可能wsdl:operations与 other 中的名称相同wsdl:portTypes


如果阅读更多 WS-I BP1.1,就会明白为什么 WSDL 1.1 中的所有内容都不是一个好主意。

于 2009-07-31T15:29:18.070 回答
0

编写一个脚本来修复此文本并将其设置为代理库的构建后脚本。

于 2009-04-28T19:09:42.510 回答
0

我发现当使用“老式”时AddServiceReference,它会正确生成具有重载的类,即使在 VS2012 中也是如此。

于 2013-04-05T16:31:34.547 回答
0

这里没有一个解决方案对我有用。

在针对 .NET2 的 vs2010 项目中生成引用,然后在针对 .NET4 的 vs2012 或 vs2013 中打开解决方案,确实可以。

于 2015-05-06T11:32:38.790 回答