Ошибка C # «Ресурс не найден для сегмента» в Odata v3 с кодом состояния 200

#c# #rest #asp.net-web-api #odata

#c# #rest #asp.net-web-api #odata

Вопрос:

Я пытаюсь получить данные из URL-адреса project Online api через Odata V3. Проблема в том, что если ресурс не найден, я получаю код состояния 200, и запрос проходит проверку, и моя программа прерывается из-за неверных данных

Пример запроса URL 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 свойство на предмет соответствующих сообщений об ошибках.

Однако, если вы предпочитаете делать это более обычным способом, вы можете рассмотреть возможность использования надлежащего клиента OData вместо вызова вручную HttpClient .

Ответ №2:

Вы не можете просто полагаться на HTTP status response, поскольку это зависит от того, как разработан 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();