У меня есть проект, у которого есть один класс реализации IHttpHandler, который маршрутизирует все запросы с помощью огромного оператора switch и т. Д. Я пытаюсь ввести маршрутизацию атрибутов с помощью ApiControllers, но первый всегда имеет приоритет. Можно ли настроить систему (код или IIS), чтобы веб-ApiControllers имели приоритет над моим единственным классом реализации IHttpHandler? В IIS я сначала помещаю свой AttributeRouting, а затем все aspx, но все же Web Api Controller не обрабатывается первым. Независимо от того, что я делаю (имея их в одном проекте). Я не хочу вводить отдельный проект.Как определить приоритеты Web Api Controllers над IHttpHandler?
Редактировать: Существует IHttpModule, который решает на основе того, что после api/направляет его в определенный файл ashx. Один из них - один из описанных.
Редактировать 2: Подробнее: Если ури не имеет списка фильтрованных объектов [файл, сообщение, свойство ...], он перенаправляется в Resource.aspx
так апи/файл, апи/сообщение, апи/собственность будет обращаться с другими .ashx файлов - в противном случае трафик идет к Resource.ashx ...
в результате запросы, которые имеют API/endpoint1 , api/endpoint2, api/endpoint3 все перейдут в Resource.aspx. Вопрос заключается в том, как перенаправить api/endpoint3 в контроллер API, описанный ниже. Благодаря
упрощенный код архитектуры:
//SolutionName/Api/MyModule.cs (Legacy Code)
//this routes based on what is after api/ to Resource.ashx or other ashx files
public class MyModule : IHttpModule {
//if url doesn't contain [file,message,property ...] route to Resource.ashx
}
//SolutionName/API/Resource.ashx (Legacy Code)
//this is hit at any request solutionname/api/anything
public class DefaultHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context) {
String APIBranch = parse(context);
switch(APIBranch)
{
case "endpoint1": methodOne(); break;
case "endpoint2": methodTwo(); break;
[...]
default: throw Exception(); break;
}
}
}
//SolutionName/API/App_Start/AttributeRoutingHttpConfig.cs
public static class AttributeRoutingHttpConfig
{
public static void RegisterRoutes(HttpRouteCollection routes)
{
// See http://github.com/mccalltd/AttributeRouting/wiki for more options.
// To debug routes locally using the built in ASP.NET development server, go to /routes.axd
routes.MapHttpAttributeRoutes();
}
public static void Start()
{
RegisterRoutes(GlobalConfiguration.Configuration.Routes);
}
}
//SolutionName/API/Controllers/MyController.cs
//this should have been hit for a GET on solutionname/api/endpoint3/id
[RoutePrefix("endpoint3")]
public class MyController : ApiController
{
private IModelDao modelDao;
MyController(IModelDao modelDao){
this.modelDao = modelDao;
}
[Route("{id}")]
[HttpGet]
public Model GetSomething(int id)
{
Model model = modelDao.GetSomething(id);
return model;
}
}
'HttpHandlers' работы до того, как контроллер апи ударил. Обработчики используются для проверки и потенциального перехвата или перенаправления («действовать») на заданный запрос ресурса. Это не работает наоборот. Вам придется взять «default» из инструкции переключателя обработчика, чтобы заставить это работать. Однако вы можете сделать то же самое с веб-api - вы можете явно указать все доступные маршруты в конфигурации и иметь маршрут по умолчанию, который переносит их на маршрут, который возвращает ошибку. – ps2goat
Теперь, когда я немного подумал об этом, вы сможете проверить настроенные маршруты api и пропустить их. Теперь я хочу попробовать ... – ps2goat
@ ps2goat Могу ли я иметь HttpModule, который вместо этого ударил бы моего ApiController? Хотя я не знаю, как это будет. Я надеюсь, что это не будет иметь производительности. –