.NET WebApi 参数绑定可选参数

.NET WebApi Parameter bound optional parameter

我有一个内置于 .NET WebApi 中的 REST API。我创建了一个自定义参数绑定属性,用于从 HTTP headers 中提取值。在某些情况下,header 可能会或可能不会出现在请求中,因此我希望能够执行以下操作以将 header 视为可选参数。

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

当我使用包含的授权 header 调用端点时,这工作正常。 但是,在没有 header 的情况下调用端点时,我收到以下错误消息:

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

我一直在搜索以尝试确定是否可以通过这种方式将参数视为可选参数,但发现了一些混合结果。似乎在 C# 8.0 中我可以使用可为 null 的引用类型来实现此目的,但 Visual Studio 表示 8.0 目前处于预览状态,因此对我来说并不是一个真正的选择。 也就是说,我还没有真正找到任何其他东西来表明这种类型的事情是否可能。

我的问题是,是否可以将此 header 参数视为可选参数,还是我需要以不同的方式处理此问题?

我最终放弃了 header 参数并朝稍微不同的方向前进。

我已经创建了一个 class 来扩展 HttpRequestMessage 来做一些事情,比如获取调用端点的客户端的 IP,我最后添加了一个方法来处理 header 并根据需要检索必要的身份信息。

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;
    }
}

我们遇到了类似的情况 (ASP .NET Core 6),即使我们分配了默认值 (range变量)。

public async Task<IActionResult> GetMessages(
            [EmailAddress(ErrorMessage = "Invalid Mailbox Address")][FromRoute][Required] string mailbox,
            [FromRoute][Required] string folderId,
            [FromQuery] GetMessageBodyParameter getMessageBodyParameter,
            [FromHeader] string range = "0-9")

并且我们将该变量标记为可为空 (string? range),它现在工作正常。

public async Task<IActionResult> GetMessages(
            [EmailAddress(ErrorMessage = "Invalid Mailbox Address")][FromRoute][Required] string mailbox,
            [FromRoute][Required] string folderId,
            [FromQuery] GetMessageBodyParameter getMessageBodyParameter,
            [FromHeader] string? range = "0-9")