尝试通过 IErrorHandler 处理请求正文序列化错误,但无法正常工作 (WCF)

Trying to handle request body serialization error by IErrorHandler but not working (WCF)

提问人:Yvonne Lin 提问时间:9/17/2023 更新时间:9/17/2023 访问量:23

问:

我正在通过 WebHttpBinding 使用 WCF 实现 RESTful Web 服务,并处理自定义错误处理程序 (IErrorHandler)。目的是捕获所有异常并返回 JSON 错误对象。 这是我在错误处理程序的 ProvideFault 方法中实现的代码:

public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
    fault = Message.CreateMessage(version, "", new CustomMsg { code = "99", msg = "error" }, new DataContractJsonSerializer(typeof(CustomMsg)));

    var wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
    fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);
    var rmp = new HttpResponseMessageProperty
    {
        StatusCode = HttpStatusCode.OK
    };

    rmp.Headers[HttpResponseHeader.ContentType] = "application/json";
    fault.Properties.Add(HttpResponseMessageProperty.Name, rmp);
}

它适用于除以下情况外的任何其他例外情况: 当给出错误的请求正文的json格式(例如缺少双引号或逗号)时,这会导致ProvideFault方法(get NetDispatcherFaultException)捕获反序列化错误,但最终我得到了意外的html错误(http状态代码400)而不是json格式。 有什么办法可以处理吗?

通过实现 IErrorHandler 自定义错误处理程序,并期望它向客户端返回 JSON 格式对象(http 状态代码 200),尤其是当客户端尝试提供错误的请求正文 json 格式时。

C# .NET WCF iErrorHandler

评论

0赞 jdweng 9/17/2023
服务器上的代码中还有另一个位置正在捕获 400 错误。最好的查找方法是在服务器中放置断点,并单步执行代码以找出其他错误处理程序的位置。它可能位于现有的异常处理程序中。
0赞 QI You 9/18/2023
你能发布错误的地方和错误信息吗?根据您目前提供的信息,很难重现该问题。

答: 暂无答案