【问题标题】:How to create a Net Core Middleware to validate a route parameter如何创建 Net Core 中间件来验证路由参数
【发布时间】:2023-01-08 02:19:15
【问题描述】:

使用 Net Core 7 我有带有 culture 路由参数的 Razor Pages:

@page "/{culture:validculture}/about"

我创建了一个自定义路由约束来检查 culture 是否具有有效值。

culture 值无效时,我将被重定向到 404 错误页面。

public class CultureRouteConstraint : IRouteConstraint {

    private readonly RequestLocalizationOptions _options;

  public CultureRouteConstraint(IOptionsSnapshot<RequestLocalizationOptions> options) {

        _options = options.Value;

  } 

  public Boolean Match(HttpContext? httpContext, IRouter? route, String routeKey, RouteValueDictionary values, RouteDirection routeDirection) {
    
    String? culture = Convert.ToString(value, CultureInfo.InvariantCulture);

    List<String>? cultures = _options.SupportedCultures?.Select(x => x.TwoLetterISOLanguageName).ToList();

    if (culture != null && cultures != null)
      return cultures.Contains(culture, StringComparer.InvariantCultureIgnoreCase);

  }

}

如果我对有效文化进行硬编码,这会很好用,例如:

List<String>? cultures = new() { "en", "pt" };

但是如果我注入RequestLocalizationOptions,我会得到错误:

RouteCreationException: An error occurred while trying to create an instance of 'CultureRouteConstraint'.

也许我需要为此使用中间件?我怎样才能做到这一点?

【问题讨论】:

  • 您是否向 DI 容器注册了 IOptionsSnapshot<RequestLocalizationOptions>?

标签: asp.net-core asp.net-core-middleware asp.net-core-routing asp.net-core-7.0


【解决方案1】:

看起来您正在使用 DI 将 RequestLocalizationOptions 注入您的 CultureRouteConstraint 类。然而,IRouteConstraint 接口不支持 DI,所以你不能直接向它注入依赖。

您可以考虑的一种选择是使用中间件来处理路由约束。中间件可以使用 DI 注入 RequestLocalizationOptions,然后在将控制权传递给适当的 Razor 页面之前检查区域性值。

这是一个可能看起来像的示例:

public class CultureMiddleware
{
    private readonly RequestDelegate _next;
    private readonly RequestLocalizationOptions _options;

    public CultureMiddleware(RequestDelegate next, IOptionsSnapshot<RequestLocalizationOptions> options)
    {
        _next = next;
        _options = options.Value;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // Check the culture value
        string culture = context.Request.RouteValues["culture"].ToString();
        if (!_options.SupportedCultures.Select(x => x.TwoLetterISOLanguageName).Contains(culture, StringComparer.InvariantCultureIgnoreCase))
        {
            // Redirect to a 404 page if the culture value is invalid
            context.Response.StatusCode = 404;
            return;
        }

        // If the culture value is valid, pass control to the next middleware
        await _next(context);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2019-03-02
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    相关资源
    最近更新 更多