WCF:Svcutil生成无效的客户端代理,Apache AXIS Web Service,重载操作

时间:2009-04-28 18:55:26

标签: wcf wsdl svcutil.exe

我正在使用用Java编写并使用Apache Axis 1.3的第三方Web服务。该服务有许多过载操作。当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:RPC   消息getDataRequest1正在运行   getData1具有无效的正文名称   的getData。它必须是getData1

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

  1. 我无法调用该操作,因为该服务无法识别“getData1”
  2. 该服务有近1100次操作,其中近一半是超载
  3. 有没有办法生成和/或修改代理,以便所有操作都可以使用WCF?

    标记

6 个答案:

答案 0 :(得分:4)

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

使用示例:

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中公开为“Add Web Reference”,因此不需要直接执行wsdl.exe。< / p>

答案 1 :(得分:2)

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

答案 2 :(得分: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中的操作名称重载。

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

请注意,此要求仅适用于给定wsdl:operations内的wsdl:portTypewsdl:portType可能wsdl:operations的名称与其他wsdl:portTypes中的名称相同。


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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

这里的解决方案都不适合我。

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