Условно отключить 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 ответов
самым простым, вероятно, было бы реализовать пользовательский фильтр действий:
вы также можете условно добавить маршрут, который соответствует этому контроллеру, который приведет к возвращению 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);
}