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

.NET 7中WSDL服务FaultException未捕获问题求助

问题原因及解决办法

可能的原因

  1. SOAP Fault反序列化失败:服务端返回的Fault XML结构(如命名空间、字段名)与生成的AuthentificationError代理类不匹配,导致WCF无法将其反序列化为FaultException<AuthentificationError>,转而抛出ProtocolException。
  2. CustomBinding配置不匹配:手动创建的CustomBinding的MessageVersion、编码或传输设置与服务端实际绑定不一致,无法正确解析SOAP Fault。
  3. 服务引用生成不完整:添加服务引用时,Visual Studio可能未正确生成对应Fault类型的代理类,或遗漏了WSDL中的Fault定义。
  4. .NET 7 WCF客户端行为差异:在.NET Core/.NET 5+中,WCF客户端对SOAP Fault的处理逻辑与.NET Framework不同,默认可能不会自动转换某些格式的Fault。

解决步骤

1. 检查并验证SOAP Fault结构

捕获ProtocolException时提取服务端原始XML响应,对比生成的AuthentificationError类:

catch (ProtocolException ex)
{
    if (ws10Client.InnerChannel is IRequestChannel channel && channel.LastResponse != null)
    {
        using var reader = XmlReader.Create(channel.LastResponse.GetReaderAtBodyContents());
        Console.WriteLine("原始SOAP Fault响应:");
        Console.WriteLine(reader.ReadOuterXml());
    }
}

将输出的XML与AuthentificationError类的命名空间、字段逐一比对,确保完全一致。若存在不匹配,需重新生成服务引用。

2. 调整CustomBinding配置,匹配服务端设置

优先使用Visual Studio添加服务引用时自动生成的绑定配置,避免手动创建:

// 直接使用自动生成的绑定实例化客户端
var ws10Client = new ServiceReference2.WsaImportPortTypeClient();

若必须手动创建CustomBinding,需确保MessageVersion与服务端WSDL定义完全一致:

// 示例:若服务端使用SOAP 1.2 + WS-Addressing 1.0
var messageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.WSAddressing10);
var binding = new CustomBinding(
    new TextMessageEncodingBindingElement(messageVersion, Encoding.UTF8),
    new HttpsTransportBindingElement { MaxReceivedMessageSize = 104857600 }
);

3. 重新生成服务引用

删除现有服务引用,重新添加时在“高级”设置中勾选“生成异步操作”和“生成Fault类型”相关选项。也可使用svcutil.exe命令行生成,确保类型完整:

svcutil.exe https://wsaimport.uni-login.dk/wsaimport-v7/ws?WSDL /language:C# /out:WsaImportClient.cs /config:app.config

4. 强制转换SOAP Fault为FaultException

通过自定义EndpointBehavior和FaultConverter,强制WCF将SOAP Fault转换为对应异常类型:

// 给客户端添加自定义行为
var ws10Client = new ServiceReference2.WsaImportPortTypeClient(binding, new EndpointAddress("https://wsaimport.uni-login.dk/wsaimport-v7/ws"));
ws10Client.Endpoint.Behaviors.Add(new CustomEndpointBehavior());

// 自定义EndpointBehavior类
public class CustomEndpointBehavior : IEndpointBehavior
{
    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) {}
    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        clientRuntime.FaultConverter = new CustomFaultConverter();
    }
    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) {}
    public void Validate(ServiceEndpoint endpoint) {}
}

// 自定义FaultConverter类
public class CustomFaultConverter : FaultConverter
{
    protected override bool OnTryCreateException(Message message, MessageFault fault, out Exception exception)
    {
        if (fault.HasDetail)
        {
            try
            {
                var authError = fault.GetDetail<AuthentificationError>();
                exception = new FaultException<AuthentificationError>(authError, fault.Reason, fault.Code);
                return true;
            }
            catch
            {
                exception = new FaultException(fault.Reason, fault.Code);
                return true;
            }
        }
        exception = new FaultException(fault.Reason, fault.Code);
        return true;
    }
}

补充提示

若服务端返回4xx/5xx状态码(而非200 OK),即使包含SOAP Fault,WCF也会视为传输错误抛出ProtocolException。此时可在HttpsTransportBindingElement中设置AllowCookies = true,或根据服务端要求启用对应AuthenticationScheme。

内容的提问来源于stack exchange,提问作者Benjiinator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:15:52