Odata v3 中的 C#“找不到该段的资源”错误,状态代码为 200

Posted

技术标签:

【中文标题】Odata v3 中的 C#“找不到该段的资源”错误,状态代码为 200【英文标题】:C# "Resource not found for the segment" error in Odata v3 with status code 200 【发布时间】:2019-09-03 08:40:22 【问题描述】:

我正在尝试通过 Odata V3 从项目 Online api Url 获取数据。问题是,如果找不到资源,我会得到状态代码 200,并且请求通过了验证,我的程序会因为无效数据而中断

示例网址请求 https://QASystem/DevQA/_api/ProjectData/test

如果测试不存在,我会得到以下响应

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <code></code>
    <message xml:lang="en-US">Resource not found for the segment 'test'></message>
</error>

即使没有找到该段,状态码也会返回 200

我的示例简化响应检查

HttpResponseMessage response = await ExecutionContext.HttpClient.GetAsync(odataQuery);

// Different checks in real code but here a simple one 
if (response.StatusCode.Equals(HttpStatusCode.ServiceUnavailable) ||
    response.StatusCode.Equals(HttpStatusCode.RequestTimeout) || 
    response.StatusCode.Equals(HttpStatusCode.NotFound)
    // Log error Here 
    throw new TransientFaultException();

即使状态码是200,如何检查错误数据?有办法处理吗?

【问题讨论】:

【参考方案1】:

如果您想要快速解决问题的方法,可以分析response.Content 属性以获取相关错误消息。

但是,如果您希望以更传统的方式进行操作,您可以考虑使用Proper OData client 而不是手动调用HttpClient

【讨论】:

【参考方案2】:

您不能只依赖 HTTP 状态响应,因为它取决于 API 的开发方式。仍然可以在消息中发送带有错误响应的 HTTP 200 状态。因此,最好检查并解析您收到的响应消息。最好两者兼而有之。

HttpResponseMessage response = await ExecutionContext.HttpClient.GetAsync(odataQuery);

// Different checks in real code but here a simple one 
if (response.StatusCode.Equals(HttpStatusCode.ServiceUnavailable) || 
    response.StatusCode.Equals(HttpStatusCode.RequestTimeout) || 
    response.StatusCode.Equals(HttpStatusCode.NotFound)
    if (response.Content.ToString().Contains("error") ||
        response.Content.ToString().Contains("Resource not found"))
        // Log error Here 
        throw new TransientFaultException();        

【讨论】:

以上是关于Odata v3 中的 C#“找不到该段的资源”错误,状态代码为 200的主要内容,如果未能解决你的问题,请参考以下文章

来自运行时数据层的 C# 中的动态 odata 服务

WebApi oData v3 实体数据模型路由

Web API OData V3 `$inlinecount` 失败

为 JSON 构建 C# 对象 [重复]

转载ODATA服务测试报错处理

转载ODATA服务测试报错处理