ASP.NET Web Api 2 — маршрутизация атрибутов субдоменов

Я уже довольно давно использую AttributeRouting в своем приложении MVC. Однако одной вещи, которой ему всегда не хватало, — маршрутизации поддоменов в Web Api (среди других функций этой библиотеки, которые работают с MVC, но не с Web Api).

Теперь я только что прочитал о новые улучшения в Web Api в отношении маршрутизации атрибутов, которые теперь включены в Web Api из коробки.

Однако я не вижу упоминания о маршрутизации субдоменов. Поддерживается ли он в Web Api 2? Если нет, то как я могу получить маршрутизацию поддоменов в моем веб-API, чтобы я мог попасть в ApiController, используя http://api.mydomain.com/cars/1?


person parliament    schedule 12.07.2013    source источник


Ответы (1)


Маршрутизация обычно используется для части URL-адреса после домена/порта. Пока ваш хост настроен на обработку запросов веб-API для домена, вы должны иметь возможность маршрутизировать URL-адреса в этом домене.

Если вы хотите, чтобы маршрутизация была специфичной для домена (например, запросы к домену api.mydomain.com обрабатывались определенным маршрутом), вы можете использовать настраиваемое ограничение маршрута. Чтобы сделать это с маршрутизацией атрибутов, я думаю, вам понадобится:

Во-первых, сам класс ограничения пользовательского маршрута. См. http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-custom-route-constraint-cs для примера домена MVC; интерфейс веб-API немного отличается (http://msdn.microsoft.com/en-us/library/system.web.http.routing.ihttprouteconstraint(v=vs.108).aspx).

Во-вторых, пользовательский конструктор маршрутов. Наследуйте от HttpRouteBuilder и переопределите метод BuildHttpRoute, чтобы добавить ограничение. Что-то вроде этого:

public class DomainHttpRouteBuilder : HttpRouteBuilder
{
    private readonly string _domain;
    public DomainHttpRouteBuilder(string domain) { _domain = domain; }
    public override IHttpRoute BuildHttpRoute(string routeTemplate, IEnumerable<HttpMethod> httpMethods, string controllerName, string actionName)
    {
        IHttpRoute route = base.BuildHttpRoute(routeTemplate, httpMethods, controllerName, actionName);
        route.Constraints.Add("Domain", new DomainConstraint(_domain));
        return route;
    }
}

В-третьих, при сопоставлении маршрутов атрибутов используйте собственный построитель маршрутов (вызовите перегрузку, которая использует построитель маршрутов):

config.MapHttpAttributeRoutes(new DomainHttpRouteBuilder("api.mydomain.com"));
person dmatson    schedule 12.07.2013
comment
Спасибо, это сработало отлично. Для записи здесь, для DomainConstraint.Match() просто верните request.RequestUri.Host == _domain; - person parliament; 13.07.2013
comment
dmatson Я задал еще один вопрос, который следует за этим, потому что я застрял немного ниже. Пожалуйста, помогите, если вы знаете этот связанный бит. stackoverflow.com/q/17624551/1267778 - person parliament; 13.07.2013