我有一个WSDL文件,定义了我必须在WCF中实现的服务。我曾经读过我可以使用WSDL文件中的svcutil生成代理,然后我可以使用生成的接口来实现服务。
不幸的是,我似乎找不到让接口包含正确属性来公开合同的方法。
所有操作都具有“OperationContractAttribute”属性,但看起来好像要公开服务,我需要每个操作“OperationContract”。 “ServiceContractAttribute”和“ServiceContract”也是如此,我想象DataContract,但我还没有那么远。
我可以手动进行这些更改,但我更喜欢一种可以轻松使用现有代码的技术,或者可以为我的用途生成更好的代码。有什么方法可以做到这一点吗?
感谢。
编辑:
使用的命令:
svcutil ObjectManagerService.wsdl /n:*,Sample /o:ObjectManagerServiceProxy.cs /nologo
代码示例:
public interface ObjectManagerSyncPortType
{
// CODEGEN: Generating message contract since the operation createObject is neither RPC nor document wrapped.
[System.ServiceModel.OperationContractAttribute(Action="http://www.sample.com/createObject", ReplyAction="*")]
[System.ServiceModel.XmlSerializerFormatAttribute()]
Sample.createObjectResponse1 createObject(Sample.createObjectRequest1 request);
// ...
}
尽我所知/看到WSDL文件完全是自包含的,不需要额外的XSD文件。
答案 0 :(得分:6)
事实证明ReplyAction="*"
是culprit。谢谢你的帮助。
答案 1 :(得分:1)
我没有看到生成的代码有任何问题,实际上:
public interface ObjectManagerSyncPortType
{
// CODEGEN: Generating message contract since the operation createObject is neither RPC nor document wrapped.
[System.ServiceModel.OperationContractAttribute(Action="http://www.sample.com/createObject", ReplyAction="*")]
[System.ServiceModel.XmlSerializerFormatAttribute()]
Sample.createObjectResponse1 createObject(Sample.createObjectRequest1 request);
这绝对是完全有效的代码 - 试试吧!我很确定它会运行。
所有操作都有 “OperationContractAttribute” 属性,但看起来好像 为了接受服务,我 要求“OperationContract” 每一个。
使用[OperationContract]
只是一个简写符号(对于任何 .NET属性来说都是真实有效的,实际上 - 这里没有关于WCF属性的特别之处)并且是100 %相当于[OperationContractAttribute]
。我没有看到任何问题。