Есть ли способ программно добавить несколько RouteAttributes для данного ControllerModel - PullRequest
0 голосов
/ 09 июля 2019

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

Чего я хотел бы добиться, так это программно установить 2 маршрута для каждого действия без ручной установки RouteAttribute("MY_ROUTE")дважды на каждое действие.

Вот как я сейчас устанавливаю маршруты.

public static void Map(ControllerModel model)
{
    string templatePrefix = "api/services/app";
    ...
    if (AppStore.Contains(model.ControllerName))
        templatePrefix = "api/services/AppStore";
    ...
    foreach (var action in model.Actions)
    {
        var verb = ProxyScriptingHelper.GetConventionalVerbForMethodName(action.ActionName);
        var constraint = new HttpMethodActionConstraint(new List<string> { verb });

        foreach (var selector in action.Selectors)
        {
            selector.ActionConstraints.Add(constraint);
            selector.AttributeRouteModel = new AttributeRouteModel(new RouteAttribute($"{templatePrefix.EnsureEndsWith('/')}{action.Controller.ControllerName}/{action.ActionName}"));
        }
    }
}

Я пробовал AttributeRouteModel.CombineAttributedRouteModel, но это объединяет строки маршрута, а не то, что я ожидал.

С кодом выше все действия контроллера AppStore становятся

api/services/AppStore/getApps1
api/services/AppStore/getApps2
api/services/AppStore/getApps3

Я бы хотел получить следующие результаты:

api/services/app/getApps1
api/services/AppStore/getApps1

api/services/app/getApps2
api/services/AppStore/getApps2

api/services/app/getApps3
api/services/AppStore/getApps3

1 Ответ

0 голосов
/ 16 июля 2019

Вы можете использовать action.Selectors.Add(). В настоящее время вы просто перезаписываете селектор (ы) по умолчанию вашим собственным маршрутом. Также я думаю, что ваша логика немного ошибочна. Вы перезаписываете templatePrefix, но затем утверждаете, что фактически хотите, чтобы оба маршрута были зарегистрированы.

Вы можете попробовать что-то похожее на следующее:

public static void Map(ControllerModel model)
{
    string templatePrefix = "api/services/app";
    ...
    foreach (var action in model.Actions)
    {
        var verb = ProxyScriptingHelper.GetConventionalVerbForMethodName(action.ActionName);
        var constraint = new HttpMethodActionConstraint(new List<string> { verb });

        foreach (var selector in action.Selectors)
        {
            selector.ActionConstraints.Add(constraint);
            selector.AttributeRouteModel = new AttributeRouteModel(new RouteAttribute($"{templatePrefix.EnsureEndsWith('/')}{action.Controller.ControllerName}/{action.ActionName}"));
        }
    if (AppStore.Contains(model.ControllerName))
            {
                templatePrefix = "api/services/AppStore";
                var sm = new SelectorModel
                {
                    AttributeRouteModel = new AttributeRouteModel(new RouteAttribute(
                        $"{templatePrefix.EnsureEndsWith('/')}{action.Controller.ControllerName}/{action.ActionName}"))
                };
                sm.ActionConstraints.Add(constraint);
                action.Selectors.Add(sm);
            }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...