You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:45:17