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

OData Client接收Bad Request时未获取到服务返回的详细错误信息

解决OData客户端无法获取服务端详细验证错误的问题

问题分析

当OData服务因模型验证失败返回400 BadRequest时,客户端调用SaveChanges()仅抛出显示"BadRequest"的异常,无法获取响应中innererror字段里的详细验证信息。这是因为默认的异常捕获逻辑没有解析OData客户端返回的响应内容。

解决方案

需要捕获DataServiceRequestException类型的异常,读取响应流并解析其中的JSON错误信息,提取出innererror中的详细内容。

修改后的客户端代码

using System.Text.Json;
using Microsoft.OData.Client;

public async Task<ActionResult> AddOrder(Order order)
{
    try
    {
        var client = new Container(new Uri(ConfigHelper.ApiUrl)) 
        { 
            Timeout = 60 * 60,  
            AddAndUpdateResponsePreference = DataServiceResponsePreference.IncludeContent
        };
        client.AddToOrder(order);
        // 使用异步版本匹配服务端实现
        await client.SaveChangesAsync();
        return Json("AddOrder request has completed successfully");
    }
    catch (DataServiceRequestException ex)
    {
        string detailedError = "Unknown error";
        if (ex.Response != null && ex.Response.StatusCode == 400)
        {
            // 读取服务端返回的错误响应流
            using var stream = await ex.Response.GetResponseStreamAsync();
            if (stream != null)
            {
                var errorResponse = await JsonSerializer.DeserializeAsync<ODataErrorResponse>(stream);
                detailedError = errorResponse?.Error?.InnerError?.Message ?? ex.Message;
            }
        }
        return Json($"Error: AddOrder request failed. {detailedError}");
    }
    catch (Exception ex)
    {
        return Json($"Error: AddOrder request failed. {ex.Message} : {ex.InnerException?.Message}");
    }
}

// 用于解析OData错误响应的模型类
public class ODataErrorResponse
{
    [JsonPropertyName("error")]
    public ODataErrorDetails Error { get; set; }
}

public class ODataErrorDetails
{
    [JsonPropertyName("message")]
    public string Message { get; set; }
    [JsonPropertyName("innererror")]
    public ODataInnerError InnerError { get; set; }
}

public class ODataInnerError
{
    [JsonPropertyName("message")]
    public string Message { get; set; }
}

关键说明

  • 优先捕获DataServiceRequestException:这是OData客户端请求失败时抛出的特定异常类型,包含完整的服务端响应信息。
  • 解析响应流:通过ex.Response.GetResponseStreamAsync()获取服务端返回的JSON错误内容,反序列化为自定义模型类后提取innererror中的详细验证提示。
  • 异步方法适配:将SaveChanges()替换为SaveChangesAsync(),与服务端的异步实现保持一致,避免线程阻塞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:10:52