在我的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]。
这可以通过将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会在此答案中说明如何使用操作过滤器(目前在下面发布)。