ASP.NET核心是否可以仅在开发模式下在控制器中配置动作?

mm9*_*m98 4 c# asp.net-core

在我的ASP.NET核心Web应用程序中,我想要一个仅在开发模式下运行的操作。在生产模式下,可能会出现404错误就足够了。有可能这样做吗?

Dab*_*oul 13

一种很好的方法是创建一个DevOnlyActionFilter过滤器https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.2

过滤器看起来像这样:

public class DevOnlyActionFilter : ActionFilterAttribute
{
    private IHostingEnvironment HostingEnv { get; }
    public DevOnlyActionFilter(IHostingEnvironment hostingEnv)
    {
        HostingEnv = hostingEnv;
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if(!HostingEnv.IsDevelopment())
        {
            context.Result = new NotFoundResult();
            return;
        }    

        base.OnActionExecuting(context);
    }
}
Run Code Online (Sandbox Code Playgroud)

并注释您的控制器操作 [TypeFilter(typeof(DevOnlyActionFilter))]


ele*_*xis 11

@Daboul 的答案非常好,但我不喜欢它TypeFilter(typeof(x))感觉笨重。

事实证明,实现IFilterFactory允许属性过滤器具有 DI,同时仍然可以干净地使用。

public class DevOnlyAttribute : Attribute, IFilterFactory
{
    public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
    {
        return new DevOnlyAttributeImpl(serviceProvider.GetRequiredService<IWebHostEnvironment>());
    }

    public bool IsReusable => true;

    private class DevOnlyAttributeImpl : Attribute, IAuthorizationFilter
    {
        public DevOnlyAttributeImpl(IWebHostEnvironment hostingEnv)
        {
            HostingEnv = hostingEnv;
        }

        private IWebHostEnvironment HostingEnv { get; }

        public void OnAuthorization(AuthorizationFilterContext context)
        {
            if (!HostingEnv.IsDevelopment())
            {
                context.Result = new NotFoundResult();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在控制器/动作可以用 进行注释[DevOnly]

  • 太棒了——这个问题的三个很好的答案,相互借鉴。这就是 Stack Exchange 的意义所在。谢谢柯克·拉金、达布尔和埃莱克西斯!“Attribute”和“IFilterFactory”的这种组合非常干净,我确信我能够在其他上下文中重用它。 (3认同)

Kir*_*kin 5

这可以通过将IHostingEnvironment其注入控制器并IsDevelopment()在动作本身内部使用其方法来实现。这是一个完整的示例,该示例在开发环境以外的任何其他情况下返回404:

public class SomeController : Controller
{
    private readonly IHostingEnvironment hostingEnvironment;

    public SomeController(IHostingEnvironment hostingEnvironment)
    {
        this.hostingEnvironment = hostingEnvironment;
    }

    public IActionResult SomeAction()
    {
        if (!hostingEnvironment.IsDevelopment())
            return NotFound();

        // Otherwise, return something else for Development.
    }
}
Run Code Online (Sandbox Code Playgroud)

对于ASP.NET Core 3.0+,请使用IWebHostEnvironment代替IHostingEnvironment

如果您想更全局地应用此功能,或者只是想分离出关注点,Daboul会在此答案中说明如何使用操作过滤器(目前在下面发布)。