0

我有一个需要为其生成客户端代理类的库,并且在我的本地机器上运行此命令和服务时,现有代码可以正常工作

svcutil.exe /config:thn /r:Citi.Rbcs.BusGn.dll /r:Citi.Rbcs.Buscm.dll net.tcp://localhost:8088/RbcThnService/mex

客户端代理生成良好。RbcThnService 使用接口 IRbcThinService。如果我随后向该接口添加一个新方法,如下所示

[OperationContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
        [FaultContract(typeof (GenericException))]
        [FaultContract(typeof (CustomException))]
        RbcCustomerStructure GetCustomerStructures(string CustomerId, short QueueId, DateTime dateUpdate, RbcSecurityContext securityContext);

然后重建并安装服务,并尝试重新生成客户端代理,我得到

There is an error in the XML document.

The value for the 'type' attribute is invalid - 'q32:ArrayOfstring' is an invalid value for the 'type' attribute.

听起来好像在声明中没有找到某种类型,但奇怪的是接口中有另一个方法与原始库中的签名完全相同,它允许客户端代理生成就好了。所以我只是创建一个与已经存在的方法相同的方法,只是用一个新名称。

有没有人有什么建议?

更新:好的,如果我注释掉现有方法之一并重试,那么情节会变厚 - 它适用于新方法。我已经尝试将其简化为仅几种方法加上新方法,它可以工作。我逐渐将其他方法一一重新引入,它一直在工作,直到我添加了最后一个方法,然后它出错了。

有趣的是,我开始将一个原始方法注释掉并且它正在工作,然后我创建了一个 SECOND dummy NEW 方法并且它出错了,同样的错误但是它不是 ArrayOfstring 它有一个不同的类型,因为它失败了。

因此,如果我没有找错树,它似乎与接口定义中的方法数量或生成的 XML 的长度有关。有什么我应该注意的限制吗?

4

1 回答 1

0

对于任何类型的 Web 服务,您都不能有重载的方法。如果您指定不同的 OperationContract Name EG,WCF 允许这样做

[ServiceContract]
interface IService
{
    [OperationContract(Name="Foo")]
    void Foo();

    [OperationContract(Name="Foobar")]
    void Foo(string bar);

}

但这基本上是将公共签名更改为方法,即使它在接口中命名相同,所以我通常不会这样做,因为在创建客户端时可能会更加混乱。

查看此帖子以了解类似问题。在 Web 服务(包括 WCF)中,任何重载(同名)的方法实际上都无法弄清楚您在调用什么。将 OperationContract 中的方法名称或 Name 属性更改为不同的名称,然后重试。

于 2012-10-18T13:33:19.817 回答