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

Posted

技术标签:

【中文标题】WCF:Svcutil 生成无效的客户端代理、Apache AXIS Web 服务、重载操作【英文标题】:WCF: Svcutil generates invalid client proxy, Apache AXIS Web Service, overload operations 【发布时间】:2010-10-22 09:52:49 【问题描述】:

我正在使用用 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   ..  

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

无效操作异常:RPC 消息 getDataRequest1 正在运行 getData1 的正文名称无效 获取数据。一定是getData1

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

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

有没有办法生成和/或修改代理,以便所有操作都可以使用 WCF?

标记

【问题讨论】:

@Mark:你有没有通过connect.microsoft.com/visualstudio向微软报告过这个问题? 不,我没有,但我会的。谢谢! 也许这不是一个糟糕的问题? :-) 我也有同样的问题。同样,Java Axis2 Web 服务。你找到解决方案了吗? 不是一个好...我最终注释掉了我不需要的重载。如果(阅读时间)供应商对其 Web 服务进行重大更改,这将再次困扰我。 【参考方案1】:

对于它的价值(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 中公开为“Add Web Reference”,因此无需直接执行wsdl.exe

【讨论】:

非常感谢,问题解决了!我还发现您可以使用“添加服务引用”对话框,如果您单击[高级],然后选择[添加 Web 引用](我使用的是 VS2012)。【参考方案2】:

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

【讨论】:

这仍然是唯一的选择还是您以其他方式找到了? 说实话,我还没有尝试找到其他方法。我希望微软能够(并且最终)用 SvcUtil 做一些事情来生成一个可用的客户端。但我没有屏住呼吸。【参考方案3】:

我之前没有看到这个问题,因为你上面有一个“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:portType 中的 wsdl:operationswsdl:portType 可能具有与其他 wsdl:portTypes 中的名称相同的 wsdl:operations


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

【讨论】:

这个问题在没有 Java 标签的情况下持续了几个月,而您没有回答。我最近添加了 java 标签,因为第 3 部分软件是用 Java 编写的,我希望有人能够提供一种以不同方式生成 WSDL 的方法。根据我的阅读,WSDL 1.1 支持重载操作(参考 webservices.xml.com/pub/a/ws/2003/01/08/randyray.html)。您对 svcutil 不重命名操作以及在 WSDL 中附加了数字的操作是不正确的。如果您愿意,我可以在星期一给您发送和/或发布 sn-p。 我实际上并没有看到每个人发布的每个问题。由于失业,我才接触到这个。我希望很快就会看到更少的帖子 我没有特别意识到它被 WS-I Basic Profile 1.1 禁止,但感谢您提供的信息。很遗憾听到你失业的消息。我和你一样幸运,帖子更少。 :-) 借此机会阅读ws-i.org/Profiles/BasicProfile-1.1.html。它非常有指导意义,并且教了很多关于如何不编写规范(SOAP、WSDL)的知识。【参考方案4】:

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

【讨论】:

如果我找不到更清洁的方法,我可能最终会这样做。 我不愿意编写这些编辑脚本的部分原因是生成的 cs 文件几乎是 13 兆。【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于WCF:Svcutil 生成无效的客户端代理、Apache AXIS Web 服务、重载操作的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 svcutil 从使用限制隐藏元素的 Web 服务生成 C# WCF 代理?

svcutil 不生成配置文件

WCF系列WCF客户端怎么消费服务

WCF 使用SvcUtil.exe生成客户端代码和配置

svcutil 无法为自托管 wcf 服务生成接口

WCF之安全性