ASP.NET MVC 3 Перенаправить на другой контроллер и action & Restful API версии - PullRequest
3 голосов
/ 09 мая 2011

Моя первоначальная проблема в том, что я смотрю, как лучше всего делать управление версиями в Restful API .Об этом мало кто говорит, у меня нет хорошего ответа, или я не могу найти точное решение в данный момент.

(1) Сначала я думаю использовать Tag или Branch для каждоговерсия http://domain.com/API/{version}. Так что, если выпущен новый API, я Tag it, экспортирую и публикую в соответствующий URL, но, похоже, сложно смешать разные версии исходного кода в одном веб-приложении.

(2)Затем я подумываю использовать один контроллер для одной версии: (точно так же, как этот вопрос Управление версиями REST API, созданного с помощью ASP.NET MVC 3 - Best Practices )

http://domain.com/API/1.0/{AnAction} => will go to APIV1Controller.{AnAction}

http://domain.com/API/2.0/{AnAction} => will go to APIV2Controller.{AnAction}

, но для каждой версии необходимо написать маршрут.

(3) Третий способ получить идею от API PayPal, которая не является версиейв URL, но в параметре POST.Таким образом, URL-адрес зафиксирован на http://domain.com/API/, но пользователь должен указать параметр Version, чтобы иметь "1.0" или "2.0".

Решение для этого: (2) мне подходит, и в настоящее время яиспользуйте этот способ, но я хочу смешать (2) и (3), чтобы у меня был APIController, у которого есть только одно действие Index для проверки этого параметра Version и передачи запроса соответствующему контроллеру и действия либо APIV1Controller. {AnAction}или APIV2Controller. {AnAction}.

После Googling и Stackoverflowing о том, как передавать, вызывать или вызывать другой контроллер и действие без перенаправления.Кажется, что нет хорошего ответа и хорошей практики.Кто-то отвечает .NET MVC Вызов метода на другом контроллере , просто создав новый экземпляр контроллера.Внезапно я понял, как насчет reroute!

Вопрос:

Возможно ли reroute другой контроллер и действие из другого действия безперенаправление и как это сделать?

Или конкретный вопрос, когда пользовательский запрос http://domain.com/API/{AnAction} с Version="2.0", как я могу reroute с APIController.Index до APIV2Controller.{AnAction}?

Я не использую IoC.

Ответы [ 2 ]

1 голос
/ 05 ноября 2013

Это можно сделать с помощью ограничений маршрутизации.Сначала реализуйте IRouteConstraint:

public class RequestParameterConstraint : IRouteConstraint
{
    public string ParameterName { get; private set; }
    public string ParameterValue { get; private set; }

    public RequestParameterConstraint(string parameter, string value)
    {
        ParameterName = parameter;
        ParameterValue = value;
    }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName,
        RouteValueDictionary values, RouteDirection routeDirection)
    {
        var value = httpContext.Request[ParameterName] ?? "";
        return value.Equals(ParameterValue);
    }
}

Затем зарегистрируйте маршруты:

routes.MapRoute(
    "Version10",
    "API/{action}/{id}",
    new { controller = "APIV1", action = "Index", id = UrlParameter.Optional },
    new { header = new RequestParameterConstraint("Version", "1.0") }
    );

routes.MapRoute(
    "Version20",
    "API/{action}/{id}",
    new { controller = "APIV2", action = "Index", id = UrlParameter.Optional },
    new { header = new RequestParameterConstraint("Version", "2.0") }
    );

Вот и все.Это сделает свое дело.

0 голосов
/ 12 мая 2011

http://coderjournal.com/2010/09/simple-rest-api-versioning-using-mef-and-mvc/

Кажется, что это именно то, что вам нужно, но для этого нужен совершенно другой подход, использующий совершенно другой набор контроллеров, а не перенаправляющий их.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...