在ASP.NET Core中,在控制器执行OnActionExecuting之前执行全局过滤器 - c#

在ASP.NET Core 2.0应用程序中,我试图在执行Controller的变体之前执行全局过滤器的OnActionExecuting。预期的行为是,我可以在全局之前准备一些东西,然后将结果值传递给控制器​​。但是,当前的行为是执行顺序被设计颠倒了。

文档告诉我有关default order of execution的信息:

从Controller基类继承的每个控制器都包含OnActionExecuting和OnActionExecuted方法。这些方法包装为给定操作运行的过滤器:OnActionExecuting在任何过滤器之前调用,OnActionExecuted在所有过滤器之后调用。

这使我解释说,控制器的OnActionExecuting是在任何过滤器之前执行的。说得通。但是文档也通过实现IOrderedFilter指出the default order can be overridden。

我尝试在过滤器中实现此目标的方法如下:

public class FooActionFilter : IActionFilter, IOrderedFilter
{
    // Setting the order to 0, using IOrderedFilter, to attempt executing
    // this filter *before* the BaseController's OnActionExecuting.
    public int Order => 0;

    public void OnActionExecuting(ActionExecutingContext context)
    {
        // removed logic for brevity
        var foo = "bar";

        // Pass the extracted value back to the controller
        context.RouteData.Values.Add("foo", foo);
    }
}

该过滤器在启动时注册为:

services.AddMvc(options => options.Filters.Add(new FooActionFilter()));

最后,我的BaseController看起来像下面的示例。这最好地说明了我要实现的目标:

public class BaseController : Controller
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        // The problem: this gets executed *before* the global filter.
        // I actually want the FooActionFilter to prepare this value for me.
        var foo = context.RouteData.Values.GetValueOrDefault("foo").ToString();
    }
}

Order设置为0或什至是非零值(如-1)似乎对执行顺序没有任何影响。

我的问题:我该如何做才能使全局过滤器在(基本)控制器的OnActionExecuting之前执行OnActionExecuting

参考方案

您快到了。您的小错误是控制器过滤器执行的默认顺序不是0。此顺序在ControllerActionFilter类中定义为int.MinValue(source code):

public class ControllerActionFilter : IAsyncActionFilter, IOrderedFilter
{
    // Controller-filter methods run farthest from the action by default.
    /// <inheritdoc />
    public int Order { get; set; } = int.MinValue;

    // ...
}

因此,您应该对当前代码进行的唯一更改是将FooActionFilter.Order设置为int.MinValue

public class FooActionFilter : IActionFilter, IOrderedFilter
{
    public int Order => int.MinValue;

    //  ...
}

现在FooActionFilterControllerActionFilter具有相同的顺序。但是FooActionFilter是全局过滤器,而ControllerActionFilter是控制器级别的过滤器。这就是为什么FooActionFilter将基于this statement首先执行的原因:

确定筛选器运行的顺序时,Order属性胜过范围。过滤器首先按顺序排序,然后使用作用域断开联系。

在ASP.NET Core 2.1中添加自定义TagHelpers - c#

我严格按照ASP.NET Core文档进行操作,并花费了大量时间来拖曳堆栈溢出,试图实现简单的自定义TagHelper,但没有成功。任何人都可以就任何陷阱或已知错误提出建议吗?应用程序属性:AssemblyName: AmpWeb Target Framework .NET Core 2.1 NuGet软件包Microsoft.AspNetCore.All …

在ASP.NET MVC中创建数据库回调的最有效方法 - c#

我有一个ASP.NET MVC网页,该网页基本上通过日期过滤器显示MS SQL数据库中表的行。当新行插入数据库表时,我想用新行列表更新网页视图。实现此目标的最有效方法是什么?基本上,我想从我的JavaScript创建一个到数据库服务器的回调,以用新结果更新UI。假设数据库表中的行数很大。(〜1百万)谢谢,cas 参考方案 如果数据库更新非常频繁,则可以按特定…

在ASP.NET WebForms中在服务器端初始化bootsrap datatimepicker - javascript

我有这个HTML<div class='datepicker input-group date' id='datetimepickerStart'> <input type='text' class="form-control" /> <span c…

在ASP.NET C#中使用Regex进行Imgur ID匹配 - c#

对于正则表达式,我经验不足,想知道是否有人可以帮助我实现以下目标。我需要一个正则表达式,它将验证某个URL是否为有效的imgur图像并返回图像的ID。 Match imgurMatch = imgurRegex.Match(URL); if(imgurMatch.Success) id = imgurMatch.Groups[0].Value 这里有些例子:…

如何在ASP.NET Core Web应用程序中增加JSON反序列化MaxDepth限制 - c#

我们正在将ASP.NET Core 2.1与.NET Framework 4.6.2结合使用。我们有一个客户需要向我们的Web应用程序发送一个很大程度上嵌套的json结构。当他们进行此调用时,我们将输出以下日志并返回错误: 读取器的MaxDepth超过了32。路径“ super.long.path.to property”,第1行,位置42111。”我浏览了…