CoreWCF ServiceContract移除XML中方法参数包裹节点的方案
移除CoreWCF Soap请求中多余的int:query节点解决方案
要让Soap请求的int:GetUserSomething节点直接包含username、id、archive子节点,而非被int:query包裹,可以通过以下两种方式实现:
方法1:使用MessageContract定义请求体
将请求参数类标记为[MessageContract(IsWrapped = false)],并把每个字段用[MessageBodyMember]指定名称和命名空间,这样字段会直接作为SOAP Body的子节点存在:
// 定义请求参数的MessageContract [MessageContract(IsWrapped = false)] public class GetUserSomethingQuery { [MessageBodyMember(Name = "username", Namespace = "int:")] public string Username { get; set; } [MessageBodyMember(Name = "id", Namespace = "int:")] public int Id { get; set; } [MessageBodyMember(Name = "archive", Namespace = "int:")] public bool Archive { get; set; } } // 原ServiceContract接口保持不变 [ServiceContract(Namespace = "int:")] [XmlSerializerFormat] public interface IUsersService { [OperationContract] [FaultContract(typeof(SoapResponse))] Task<GetUserSomethingResponse> GetUserSomething(GetUserSomethingQuery query); }
方法2:给方法参数添加MessageParameter属性
在方法的参数上添加[MessageParameter(Name = "")],让CoreWCF不再生成以参数名命名的包裹节点:
[ServiceContract(Namespace = "int:")] [XmlSerializerFormat] public interface IUsersService { [OperationContract] [FaultContract(typeof(SoapResponse))] Task<GetUserSomethingResponse> GetUserSomething([MessageParameter(Name = "")] GetUserSomethingQuery query); }
两种方法都能达到预期效果,推荐第一种,因为它能更精准地控制SOAP消息的结构,适配严格的XML格式要求。
内容的提问来源于stack exchange,提问作者SimonCrane
相关产品推荐
相关产品推荐

