Динамическое включение / отключение ответа веб-API

#asp.net-mvc #asp.net-web-api #asp.net-web-api2

#asp.net-mvc #asp.net-web-api #asp.net-web-api2

Вопрос:

Я хочу иметь возможность включать / выключать все мои маршруты веб-api на основе определенного пользователем логического значения. На данный момент это может быть получено из Web.config. Если для этого флага установлено значение false, я хочу иметь возможность отвечать на любой запрос (любые и все маршруты действительны или нет) с сообщением об ошибке — «.. api отключен …»

Просто поиграйте с идеей переопределения метода инициализации контроллера с помощью некоторого псевдокода. Я предполагаю, что это предполагает, что запрашиваемый маршрут действителен там, где я хочу отвечать на любые запросы, какие бы они ни были. Я даже не уверен, смогу ли я ввести свойство IsEnabled в конфигурацию.Коллекция свойств. Ищу какие-либо рекомендации, как я могу отключить маршрутизацию и соответствующим образом реагировать на основе настроек.

Спасибо

  public class MyController : ApiController
    {
        protected override void Initialize(HttpControllerContext controllerContext)
        {
            if (!Convert.ToBoolean(controllerContext.Configuration.Properties["IsEnabled"]))
            {
                throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Api is currently disabled."));
            }
            base.Initialize(controllerContext);
        }
  

РЕДАКТИРОВАТЬ: возможно использование HttpConfiguration.MessageHandlers.Add() для перехвата всех запросов?

Ответ №1:

Попробуйте пользовательский обработчик делегирования

 internal class BaseApiHandler : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.Forbidden);

        var allowRequest = //web config value

        // if request is allowed then let it through to the next level
        if(allowRequest)
            response = await base.SendAsync(request, cancellationToken);

        // set response message or reasonphrase here

        // return default result - forbidden
        return response;
   }
}
  

Отредактируйте свой webapiconfig.cs, чтобы включить этот маршрут вверху

 config.Routes.MapHttpRoute(
    name: "Default",
    routeTemplate: "{*path}",
    handler: HttpClientFactory.CreatePipeline
    (
        innerHandler: new HttpClientHandler(),
        handlers: new DelegatingHandler[] { new BaseApiHandler() }
    ),
    defaults: new { path = RouteParameter.Optional },
    constraints: null
);