C # «Ресурс не найден для сегмента» ошибка в Odata v3 с кодом состояния 200 - PullRequest
3 голосов
/ 12 апреля 2019

Я пытаюсь получить данные из проекта Online API URL через 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?Есть ли способ справиться с этим?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Если вам нужен быстрый и простой способ обойти проблему, вы можете проанализировать свойство response.Content на наличие соответствующих сообщений об ошибках.

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

0 голосов
/ 15 апреля 2019

Вы не можете просто полагаться на ответ о статусе 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();        
...