我对MessageContract Attribute在WCF中的工作方式感到困惑。
当我放置MessageContract时,代理显示两个参数而不是1。 e.g。
GetResultResponse GetOperation(GetResultRequest request)
[MessageContract]
public class GetResultRequest
{
[MessageHeader]
public Header Header { get; set; }
[MessageBodyMember]
public List<Person> PersonList { get; set; }
}
代理生成此方法签名:
GetOperation(ref Header, List<Person> personList)
删除MEssageContract属性时: 代理生成正确的签名:
GetOperation(GetResultRequest request)
有人可以确认这是否是预期的行为?
答案 0 :(得分:6)
这是默认行为。生成代理时,默认情况下不会创建消息协定。您可以在添加服务参考中advanced configuration启用此功能(通过选中始终生成邮件合同)或/messageContract
切换svcutil }。打开它后,您将获得具有单个消息协定参数的方法,就像您在服务上一样。
答案 1 :(得分:0)
除非您具有使用MessageHeader属性标记标头的特定要求,否则请尝试将class属性更改为Datacontract,将属性更改为DataMember属性,并查看行为是否更改。据我所知,除非您实现自定义序列化程序,否则无法影响svcutil如何创建代理。