CoreWCF如何返回带nil="true"的自定义SOAP Fault?
解决方案:在CoreWCF中返回带
xsi:nil="true"的SOAP Fault 要让CoreWCF返回符合要求的SOAP Fault(即<faultstring xsi:nil="true"/>),需要自定义FaultConverter覆盖默认的SOAP Fault序列化逻辑,具体步骤如下:
1. 自定义FaultConverter
创建继承自SoapFaultConverter的类,重写WriteFault方法,手动生成带nil属性的faultstring元素:
using CoreWCF.Channels; using System.Xml; public class NilFaultConverter : SoapFaultConverter { protected override void WriteFault(XmlDictionaryWriter writer, MessageVersion version, FaultCode faultCode, FaultReason faultReason, string faultAction) { // 开始写入Fault节点 writer.WriteStartElement("Fault", version.Envelope.Namespace); // 写入faultcode writer.WriteElementString("faultcode", faultCode.ToString()); // 写入带xsi:nil="true"的faultstring writer.WriteStartElement("faultstring"); writer.WriteAttributeString( prefix: "xsi", localName: "nil", ns: "http://www.w3.org/2001/XMLSchema-instance", value: "true" ); writer.WriteEndElement(); // 结束Fault节点 writer.WriteEndElement(); } }
2. 注册自定义FaultConverter
在服务配置中替换默认的FaultConverter,以ASP.NET Core为例,在Program.cs中添加:
builder.Services.AddServiceModelServices() .AddSingleton<FaultConverter>(sp => new NilFaultConverter());
如果需要仅对特定服务或端点生效,可以通过端点行为注册:
public class NilFaultBehavior : IEndpointBehavior { public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { bindingParameters.Add(new FaultConverter(new NilFaultConverter())); } public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { } public void Validate(ServiceEndpoint endpoint) { } } // 注册行为 builder.Services.AddServiceModelServices() .AddSingleton<IEndpointBehavior, NilFaultBehavior>();
3. 抛出符合要求的FaultException
在服务方法中直接抛出无参FaultException即可:
throw new FaultException();
此时CoreWCF会使用自定义的NilFaultConverter生成SOAP响应,其中faultstring元素会带上xsi:nil="true"属性,完全匹配需求格式。
内容的提问来源于stack exchange,提问作者Dolph
相关产品推荐
相关产品推荐

