svcutil为不同的服务生成MessageContractAttribute或OperationContractAttribute

时间:2016-03-30 14:10:17

标签: wcf svcutil.exe

我正在使用svcutil来创建代理类,我注意到对于不同的服务,我会得到不同的结果。

我正在使用这个svcutil命令:

svcutil http://server/SomeService.asmx 
    /l:c# 
    /syncOnly 
    /out:C:\ISomeService
    /config:C:\ISomeService.config 
    /namespace:*,SomeServiceProxy

第一个服务的代理类生成如下代码:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="GetFirstService", Namespace="http://othernamespace.com")]
public partial class GetFirstServiceRequest : SomeServiceProxy.ResponseInfoBase
{
    ...
}

第二项服务的代理类产生了这个:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetSecondService", WrapperNamespace = "http://somenamespace.com", IsWrapped = true)]
public partial class GetSecondServiceRequest
{
    ...
}

为什么一个类用MessageContractAttribute标记,另一个用DataContractAttribute标记? svcutil如何决定使用其中一个,两个服务的命令是否相同?

1 个答案:

答案 0 :(得分:1)

DataContract格式supports only a subset of XML Schema Definition。因此,它取决于服务元数据:svcutilsvcutil使用的实际System.ServiceModel.Description.WsdlImporter)默认尝试生成DataContracts。如果它遇到无法表示为DataContract的模式,它会生成一个MessageContract作为后备。