我使用SVCutil从WSDL生成了WCF Web服务接口。然后,我创建了一个service.svc文件,在该文件中,Implmenet就是这样的界面:
public class Service2 : wsEquipmentSoap
{
public GetEquipmentResponse GetEquipment(GetEquipmentRequest request)
{
throw new NotImplementedException();
}
public Task<GetEquipmentResponse> GetEquipmentAsync(GetEquipmentRequest request)
{
throw new NotImplementedException();
}
}
浏览此服务时,出现以下异常:
同一合约中不能有两个具有相同名称的操作, wsEquipmentSoap类型的方法GetEquipmentAsync和GetEquipment 违反此规则。您可以通过以下方式更改其中一项操作的名称 更改方法名称或通过使用Name属性 OperationContractAttribute。
但是,Thay没有相同的名字吗?一个名为GetEquipment,另一个名为GetEquipmentAsync。
但是我可以看到svcutil在接口中产生了相同的Action字符串:
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/GetEquipment", ReplyAction="*")]
GetEquipmentResponse GetEquipment(GetEquipmentRequest request);
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/GetEquipment", ReplyAction="*")]
System.Threading.Tasks.Task<GetEquipmentResponse> GetEquipmentAsync(GetEquipmentRequest request);
我不想更改接口,但是我更改了Action并在Async方法的末尾添加了Async,我得到了这个异常:
类型中的同步OperationContract方法“ GetEquipment” “ wsEquipmentSoap”与基于任务的异步匹配 OperationContract方法“ GetEquipmentAsync”,因为它们具有 相同的操作名称“ GetEquipment”。同步时 OperationContract方法与基于任务的异步匹配 OperationContract方法,两个OperationContracts必须具有 “ Action”属性的值相同。在这种情况下,值是 不同。要解决此问题,请更改其中一项的“操作”属性 OperationContract以匹配另一个。或者,更改 其中一种方法的名称将阻止匹配。
即使有了解释,我仍然不明白为什么抛出这些异常?接口是用svcutil生成的,在接口中更改感觉不对吗?