#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
);