Условно отключить ASP.NET контроллер MVC

каков наилучший способ отключить ASP.NET контроллер MVC условно?

Я хочу иметь доступ к действиям регулятора, если какое-то значение в интернете.config-это " true "и 404, если это" false"

должен ли я написать свой собственный атрибут?

обновление: Ищете более элегантное решение, чем атрибут фильтра действий (с возможностью передачи не постоянного параметра конструктору атрибутов)

    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
    public class CloseForSomeSettingAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            bool mySettingValue = MySettingManager.GetMySettingValue();

            if (mySettingValue)
            {
                filterContext.Result = new HttpStatusCodeResult(404);
            }
            else
            {
                base.OnActionExecuting(filterContext);
            }
        }
    }

2 ответов


самым простым, вероятно, было бы реализовать пользовательский фильтр действий:

http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs

вы также можете условно добавить маршрут, который соответствует этому контроллеру, который приведет к возвращению 404.


кросспостинга из: https://stackoverflow.com/a/43044667/257470

мое решение для отключения :

  • использует флаг конфигурации WebConfig AppSettings вместо (#if DEBUG)
  • перед вызовом метода 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);
    }