.Net 4.5 Svcutil生成两个同名操作(Method和MethodAsync)

15

我正在使用svcutil消耗预定义的wsdl,方法如下:

svcutil some_service.wsdl

其中生成的一个方法具有以下签名:

[System.ServiceModel.OperationContractAttribute(Action="http://ws.example.org/SubmitData", ReplyAction="*")]
SubmitDataResponse SubmitData( SubmitDataRequest request )

尽管来自VS2010/.net35的scvutil仅生成上述内容,并且VS可以正常启动服务,但是作为VS2012/.net45的一部分的svcutil程序同样会生成一个具有上述签名的方法。

[System.ServiceModel.OperationContractAttribute(Action="http://ws.example.org/SubmitData", ReplyAction="*")]
Task<SubmitDataResponse> SubmitDataAsync( SubmitDataRequest request );

这会导致运行时异常:

System.InvalidOperationException: 在同一契约(contract)中拥有两个具有相同名称的操作(operations),类型MyType中的方法SubmitDataAsync和SubmitData违反了此规则。您可以通过更改方法名称或使用OperationContractAttribute的Name属性之一来更改其中一个操作的名称。

我可以通过删除附加的Async方法或者使用VS2010中的svcutil来解决这个问题, 但我想知道为什么svcutil生成了一个导致运行时异常的接口(这是一个bug吗?),以及是否还需要做其他额外的工作使其正常工作。


1
另一种解决方法:使用“/async-”命令行标志。 - Jon Skeet
你使用的运行框架是什么?也许这是一个在后期框架中不存在的限制。 - James Manning
@JamesManning 这个汇编目标是 .Net 4.5。 - vossad01
1
可能之前错过了,或者是 RTM 版本中新增的,但也有一个 /syncOnly 命令行标志,它可以使其不生成基于任务的异步方法。 - vossad01
在我的情况下,我重新配置了服务引用,选中了生成异步操作的单选按钮,而不是生成基于任务的操作。 - Anton
1个回答

21

默认行为似乎已经改变。如果您提供了/syncOnly参数,它会为我保留旧的行为。

 /syncOnly                          - Generate only synchronous method
                                  signature. Default: generate synchronous
                                  and task-based asynchronous method
                                  signatures.

谢谢,@Jimmy,但我知道行为已经改变(请参见问题)。我也知道关于/syncOnly标志(请参见我对问题的评论)。我很好奇为什么行为会改变。我最好的猜测是新接口对客户端有利,但对服务器无效。 - vossad01
1
在我寻找解决方案的过程中让我感到困惑的另一件事是,互联网上的信息表明这是由于方法重载引起的问题,并且可以通过给方法不同的OperationContract名称来解决问题,但显然'Method'和'MethodAsync'并不是重载的方法,因此生成的代码或VS以某种方式将其解释为具有相同的OperationContract名称。 - methon.dagger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接