C# 有条件地禁用ASP.NET MVC控制器

C# 有条件地禁用ASP.NET MVC控制器,c#,asp.net,.net,asp.net-mvc,asp.net-mvc-3,C#,Asp.net,.net,Asp.net Mvc,Asp.net Mvc 3,有条件禁用ASP.NET MVC控制器的最佳方法是什么 如果web.config中的某个值为“true”,我想访问控制器操作,如果该值为“false”,则访问404 我应该写我自己的属性吗 更新: 寻找比action filter属性更优雅的解决方案(能够将非常量参数传递给属性构造函数) 最简单的方法可能是实现自定义操作筛选器: 您还可以有条件地添加与该控制器匹配的路由,该路由将导致返回404。交叉过帐来源: 禁用ApiController控制器的我的解决方案: 使用WebConfig Ap

有条件禁用ASP.NET MVC控制器的最佳方法是什么

如果web.config中的某个值为“true”,我想访问控制器操作,如果该值为“false”,则访问404

我应该写我自己的属性吗

更新: 寻找比action filter属性更优雅的解决方案(能够将非常量参数传递给属性构造函数)


最简单的方法可能是实现自定义操作筛选器:

您还可以有条件地添加与该控制器匹配的路由,该路由将导致返回404。

交叉过帐来源:

禁用
ApiController
控制器的我的解决方案:

  • 使用WebConfig AppSettings配置标志代替(
    #如果调试
  • 调用方法之前,
    ExecuteAsync
    截取调用并检查功能切换(功能标志)
  • 如果功能被禁用,则返回HTTP 410 GONE
  • 如果这对于许多控制器都很常见,请将代码移动到控制器的基类
守则:

public class TestController : ApiController
{
    public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
    {
        var featureFlag = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["EnableTest"]);

        if (featureFlag == false)
        {
            return Task.FromResult(new HttpResponseMessage(HttpStatusCode.Gone));
        }

        return base.ExecuteAsync(controllerContext, cancellationToken);
    }
公共类TestController:ApiController
{
公共覆盖任务ExecuteAsync(HttpControllerContext controllerContext,CancellationToken CancellationToken)
{
var featureFlag=Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings[“EnableTest”]);
如果(featureFlag==false)
{
返回Task.FromResult(新的HttpResponseMessage(HttpStatusCode.Gone));
}
返回base.ExecuteAsync(controllerContext,cancellationToken);
}
回答如下-


这种方法不需要过滤器,并且隐藏控制器以防招摇过市等。

谢谢。已经编写了action filter属性(请参阅我的评论)。但可能存在一些更优雅的解决方案?我不知道您在这里的目的,但也许最好不要在应用程序级别执行此操作?我正在考虑使用IIS url重写模块为您要返回的路由设置规则404。请看下面的示例:不。我需要能够从web.config文件进行切换。rul用于url重写的电子邮件存储在web.config中
public class TestController : ApiController
{
    public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
    {
        var featureFlag = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["EnableTest"]);

        if (featureFlag == false)
        {
            return Task.FromResult(new HttpResponseMessage(HttpStatusCode.Gone));
        }

        return base.ExecuteAsync(controllerContext, cancellationToken);
    }