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

时间:2019-04-12 14:36:11

标签: c# rest asp.net-web-api odata

我正在尝试通过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,如何检查错误数据?有办法处理吗?

2 个答案:

答案 0 :(得分:0)

您不能仅仅依靠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();        

答案 1 :(得分:0)

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

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