15

我消耗预定的WSDL与两个操作SvcUtil工具一拉:.NET 4.5 SvcUtil工具生成具有相同名称(方法和MethodAsync)

svcutil some_service.wsdl 

的产生的方法中的一个具有以下特征:

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

虽然从VS2010 scvutil/.net35仅生成上述和VS没有问题lanuching服务, 的SvcUtil工具程序,它是VS2012/.net45的一部分也生成与签名的方法

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

这会导致运行时异常:

System.InvalidOperationException:不能有相同名称的 同一合同两种操作,方法SubmitDataAsync和类型的MyType SubmitData违反此规则。您可以通过更改方法名称或使用OperationContractAttribute的Name属性来更改其中一个操作的名称 。

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

+1

其他解决方法:使用'/ async-'命令行标志。 – 2012-07-18 16:54:40

+0

什么是您的运行时框架? – 2012-07-18 18:01:36

+0

@JamesManning汇编目标.Net 4.5 – vossad01 2012-07-18 18:10:08

回答

20

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

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

谢谢,@Jimmy,但我知道行为已经改变(请参阅问题)。我也知道'/ syncOnly'标志(请参阅我对该问题的评论)。我很好奇行为改变的原因。最好的是,新界面对于客户端来说是可取的,但对服务器无效。 – vossad01 2012-11-27 21:32:00

+1

另一件让我困惑的事情是,当我寻找解决方案时,WWW上的信息表明,这是因为重载的方法,并且问题可以通过赋予不同的OperationContract名称来解决,但显然是'Method'和'MethodAsync'不是重载方法,所以不知何故,生成的代码或VS将其解释为具有相同的OperationContract名称。 – 2014-10-19 02:21:27