.NET WebApi Параметр привязан необязательный параметр - PullRequest
1 голос
/ 21 июня 2019

У меня есть REST API, встроенный в .NET WebApi. Я создал собственный атрибут привязки параметров для извлечения значения из заголовков HTTP. Существуют сценарии, в которых заголовок может или не может присутствовать в запросе, поэтому я хотел бы иметь возможность сделать что-то вроде следующего, чтобы рассматривать заголовок как необязательный параметр.

public IHttpActionResult Register([FromBody] RegistrationRequest request, [FromHeaderAuthorization] string authorization = null)
{

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

The request is invalid.', MessageDetail='The parameters dictionary does not contain an entry for parameter 'authorization' of type 'System.String'

Я искал, чтобы попытаться определить, можно ли таким образом обрабатывать параметр как необязательный, и нашел несколько смешанных результатов. Похоже, что в C # 8.0 я мог бы добиться этого с помощью обнуляемого ссылочного типа, но Visual Studio указывает, что 8.0 в настоящее время находится в режиме предварительного просмотра и, таким образом, на самом деле не вариант для меня. Тем не менее, я не смог найти ничего другого, что указывало бы, возможен ли этот тип вещей или нет.

У меня вопрос: можно ли трактовать этот параметр заголовка как необязательный или мне нужно поступить иначе?

1 Ответ

0 голосов
/ 25 июня 2019

В итоге я отказался от параметра заголовка и пошел немного в другом направлении.

Я уже создал класс для расширения HttpRequestMessage для таких вещей, как получение IP-адреса клиента, вызывающего конечную точку, в итоге я добавил метод для обработки проверки существования заголовка и получения необходимой идентификационной информации по мере необходимости.

public static class HttpRequestMessageExtensions
{
    private const string HttpContext = "MS_HttpContext";
    private const string RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty";

    /* Method body excluded as irrelevant */
    public static string GetClientIpAddress(this HttpRequestMessage request) { ... }

    /** Added this method for handling the authorization header. **/
    public static Dictionary<string, string> HandleAuthorizationHeader(this HttpRequestMessage request)
    {
        Tenant tenant = new Tenant();
        IEnumerable<string> values;
        request.Headers.TryGetValues("Authorization", out values);
        string tenantConfig = ConfigurationUtility.GetConfigurationValue("tenantConfig");

        if (null != values)
        {
            // perform actions on authorization header.
        }
        else if(!string.IsNullOrEmpty(tenantConfig))
        {
            // retrieve the tenant info based on configuration.
        }
        else
        {
            throw new ArgumentException("Invalid request");
        }

        return tenant;
    }
}
...