这是正确的默认行为。每次发送请求或响应数据时,它们都会自动包装在包装元素中。它也称为 Wrapped 参数样式。如果您不想使用它,而是想使用 Bare 参数样式,则必须定义消息协定并将其 IsWrapped 属性设置为 false。像这个简单的例子:
[ServiceContract]
public interface IService
{
[OperationContract]
GetMessageResponse GetMessage(GetMessageRequest request);
}
[MessageContract(IsWrapped = false)]
public class GetMessageResponse
{
[MessageBodyMember]
public string Result { get; set; }
}
[MessageContract(IsWrapped = false)]
public class GetMessageRequest
{
[MessageBodyMember]
public string Data { get; set; }
}
GetMessage 操作不会在请求和响应中使用包装。
限制是操作必须只接受单个 MessageContract 作为参数,并且总是必须返回 MessageContract(即使它返回 void)。因此,实现您的要求的最简单方法是通过替换属性将所有数据合约转换为消息合约。
另一种方法是为每个请求和响应创建单独的消息协定,并使用数据协定类型的属性作为消息正文。如果出于某种原因您不喜欢为每个操作创建两个额外的消息合同的想法,并且您仍然想保留旧的数据合同,您可以使用 little hack(我看不出有任何使用它的理由,但它有效)。将 MessageContract 属性添加到您的数据合同,并将 MessageBodyMember 属性添加到您的所有数据成员。
[DataContract, MessageContract(IsWrapped = false)]
public class MyData
{
[DataMember, MessageBodyMember]
public string Data { get; set; }
}