Отображение кода состояния HTTP ответа HTTP и пользовательских кодов ошибок - PullRequest
1 голос
/ 14 апреля 2020

Как сохранить отображения кодов состояния http и кодов ошибок. Чтобы дать основную c идею, код состояния и код ошибки, над которыми я работаю, похож на twitter Error code .

Теперь вопрос в том, есть ли у меня несколько кодов ошибок для один код состояния http (в случае twitter коды ошибок 3,44,215,323,324,325,407 сопоставлены с кодом состояния http 400), как мне сохранить эти значения в моем коде. Я использую Dictionary<int, List<int>> или есть другой способ сделать это?

Я буду устанавливать код ошибки в Исключении. Фильтр исключений проанализирует код ошибки и установит соответствующий код состояния http и отправит ответ API.

Класс исключения

public class APIException : Exception
{
    public int ErrorCode { get; set; }


    public APIException(int errorCode, string message) : base(message)
    {
        ErrorCode = errorCode;
    }
}

Фрагмент кода фильтра исключений

var apiException = actionExecutedContext.Exception as APIException;

int statusCode = GetHttpStatusCode(apiException.ErrorCode)

var response = new HttpResponseMessage((HttpStatusCode)(statusCode));

var apiResult = new APIResult(apiException.ErrorCode, apiException.Message);

response.Content = new ObjectContent<APIResult>(apiResult, new JsonMediaTypeFormatter(), "application/json");

actionExecutedContext.Response = response;

Теперь вопрос по реализации функции GetHttpStatusCode(). В настоящее время я думаю использовать Dictionary<int, List<int>> для хранения сопоставлений. Получить ключ (httpStatusCode), выполнив поиск по значениям (кодам ошибок).

У меня может быть плоский словарь, в котором код ошибки - это ключ, а код состояния http - это значение. Но список будет расти, и читаемость будет затруднена, если мне придется посмотреть, какие у нас есть коды ошибок для определенного c кода состояния.

1 Ответ

1 голос
/ 14 апреля 2020

Честно говоря, при плоском словаре

[...] список вырастет огромным, и читаемость будет затруднена, если мне придется посмотреть, какие у нас есть коды ошибок для конкретного c код состояния.

не очень хорошее оправдание, чтобы сделать код чрезмерно сложным и менее производительным. Хотя читаемость Dictionary<int, List<int>> могла бы быть немного лучше, читаемость самого кода (и это должен быть код, который имеет значение) пострадает. ИМХО, это скорее симптом субоптимальной структуры кода.

При использовании плоского словаря поиск становится таким простым, как

int GetHttpStatus(int errorCode)
{
   return errorCodeMappings[errorCode]; 
}

И поскольку ключ не может существовать более одного раза в словаре, не существует способа умножения кодов ошибок.

(Плюс, это супербыстрое по сравнению с решением, использующим Dictionary<int, List<int>> с обратным поиском, потому что вы можете использовать хеширование. Хотя это, скорее всего, не будет узким местом, приятно иметь бесплатно.)

Если вы обернули это в некоторый класс StatusCodeMapper, вы можете определить свой конструктор как

public ErrorCodeMapper(Dictionary<int, List<int>> reverseMappings)
{
    // Convert mappings to a more efficient format
    this.mappings = reverseMappings.SelectMany(entry => entry.Value.Select(errorCode => new { errorCode, status=entry.Key}))
                                   .ToDictionary(mapping => mapping.errorCode, mapping => mapping.status)
}

и сохранить свой Dictionary<int, List<int>> на верхнем уровне, но используйте более краткий и быстрый поиск и автоматическую c проверку на наличие дубликатов кодов ошибок, которые вы получаете с помощью Dictionary, если использовать их по назначению. Если вы создадите только один экземпляр ErrorCodeMapper, «дорогой» код (ну, не слишком дорогой, но более чем на 10 * * поиск) будет запущен только один раз.

...