Чувствительное к регистру перечисление в ASP .NET Web API - PullRequest
1 голос
/ 15 апреля 2019

В моем веб-API у меня есть конечная точка для операций CRUD над объектом, который содержит enum Свойства.

// User.cs
public class User
{
    public string Username { get; set; }
    public Platform Platform { get; set; }
}

public enum Platform
{
    Windows, Linux, MacOS
}

// UserController.cs
public class UserController : ApiController 
{
    public IHttpActionResult Post(User value)
    {
        users.Add(value);
        return Ok();
    }
    //...
}

Когда конечная точка вызывается со следующей полезной нагрузкой, она отлично работает:

{"Username": "jason", "Platform": "Linux"}

ASP .NET правильно анализирует значение перечисления как Platform.Linux Однако, если корпус отличается, например:

{"Username": "jason", "Platform": "linux"}

Тогда ASP .NET не распознает это как Platform.Linux и вместо этого будет молча использовать значение по умолчанию Platform.Windows.

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

Я знаю, что могу просто использовать два эквивалентных значения перечисления с разными регистрами, например:

public enum Platform
{
    Windows=0, windows=0,
    Linux=1, linux=1,
    MacOS=2, macos=2
}

Но мне интересно, есть ли лучшее решение?

1 Ответ

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

Оказывается, в моем случае для объекта использовался специальный преобразователь до того, как он был передан в контроллер.Этот преобразователь использовал Enum.TryParse для анализа значения:

if (Enum.TryParse(enumLiteral, out result))
{
    return result;
}

Я изменил это значение на

if (Enum.TryParse(enumLiteral, true, out result))
{
    return result;
}

, что сделало разбор нечувствительным к регистру.

Обратите внимание, что этобыл пользовательский конвертер, который не является частью самого ASP.NET.Проблема не возникла, когда я полностью удалил этот конвертер и использовал только встроенную функциональность.

...