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

svcutil generating MessageContractAttribute or OperationContractAttribute for different services

我正在使用 svcutil 制作代理 classes 并且我注意到对于不同的服务我得到不同的结果。

我正在使用这个 svcutil 命令:

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

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

[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
{
    ...
}

第二个服务的代理 classes 生成这个:

[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
{
    ...
}

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

svcutil) 使用的 DataContract 格式 supports only a subset of XML Schema Definition. So it depends on the service metadata: svcutil (actually System.ServiceModel.Description.WsdlImporter 尝试默认生成 DataContract。如果遇到无法表示为 DataContract 的模式,它会生成一个 MessageContract 作为回退。