C# SOAP服务响应格式不符,如何移除SomeWrapperXML包装标签?
嘿,我刚好碰到过类似的SOAP服务序列化问题,给你几个关键的调整点,应该能解决你的问题:
问题根源
你当前代码里的[return: XmlElementAttribute("SomeWrapperXML")]特性是导致响应多了一层<SomeWrapperXML>标签的直接原因——这个特性会告诉序列化器把返回的MyActualResponseType对象包裹在指定名称的元素里。你说移除这个特性没用,大概率是因为接口定义里还保留着这个特性,或者MyActualResponseType类的序列化配置有问题。
具体修复步骤
彻底移除返回值的包装特性
不仅要在实现类的MyServiceRequest方法里移除[return: XmlElementAttribute("SomeWrapperXML")],还要检查你实现的MyServiceBindingSoap接口,如果接口里的同名方法也有这个返回特性,必须一起移除。配置返回类型的序列化根元素
给MyActualResponseType类添加XmlRoot特性,指定正确的命名空间和元素名称,确保它能直接作为SOAP Body的子元素输出:[XmlRoot(Namespace = "http://mynamespace.com/", ElementName = "MyActualResponseType")] public class MyActualResponseType { // 你的类属性定义 }保留正确的SOAP方法配置
确保SoapDocumentMethod的ParameterStyle = SoapParameterStyle.Bare保持不变,这个配置会让请求/响应的内容直接作为SOAP Body的子元素,不会额外生成方法名称的包裹标签。
修改后的完整服务端代码示例
[WebService(Namespace = "http://mynamespace.com/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class MyServiceStub1 : System.Web.Services.WebService, MyServiceBindingSoap { [WebMethod] [SoapDocumentMethod(Action = "http://mynamespace.com/MySoapAction", ParameterStyle = SoapParameterStyle.Bare)] public MyActualResponseType MyServiceRequest( [XmlElement(ElementName = "MyRequestName")] MyServiceRequestType myServiceRequest) { return new MyActualResponseType(); } } // 对应的返回类型配置 [XmlRoot(Namespace = "http://mynamespace.com/", ElementName = "MyActualResponseType")] public class MyActualResponseType { // 你的属性定义 }
这样调整后,SOAP响应就会直接把<MyActualResponseType>放在<soap:Body>里,完全符合客户的期望格式。
内容的提问来源于stack exchange,提问作者Simon Larsen

