Arhn - архитектура программирования

Маршрутизация веб-API .Net и страница справки

Я изо всех сил пытаюсь заставить страницу справки API отображать все мои конечные точки API и отображать их в том стиле, который я хочу.

Вот мои маршруты:

config.Routes.MapHttpRoute("Orgs", "v1/Orgs/{orgId}", 
new { controller = "Orgs", orgId = RouteParameter.Optional });

config.Routes.MapHttpRoute("OrgDescendants", "v1/Orgs/{orgId}/Descendants", 
new { controller = "Orgs", action = "OrgDescendants" });

Вот все мои методы контроллера:

[HttpGet]
public IEnumerable<Org> GetAllOrgs()

[HttpGet]
public Org Get(string orgId)

[HttpGet]
[ActionName("OrgDescendants")]
public List<Org> Descendants(string orgId)

[HttpPost]
public HttpResponseMessage Post(Org org)

[HttpPut]
public HttpResponseMessage Put(string orgId, Org org)

[HttpDelete]
public void Delete(string orgId)

И вот конечные точки, которые отображаются на странице справки:

GET v1/Orgs
POST v1/Orgs
PUT v1/Orgs/{orgId}
DELETE v1/Orgs/{orgId}
GET v1/Orgs/{orgId}/Descendants

Как видите, на странице справки отсутствует следующая конечная точка:

GET v1/Orgs/{orgId}

Я пробовал так много разных перестановок маршрутизации, что потерял след. Что бы я ни пытался, я всегда заканчивал тем, что некоторые конечные точки отсутствовали или были «неправильно» отформатированы.

Например, я получаю:

GET v1/Orgs/{orgId}/Get

когда я хочу:

GET v1/Orgs/{orgId}

или я получаю:

PUT v1/Orgs?orgId={orgId}

когда я хочу:

PUT v1/Orgs/{orgId}

Независимо от того, какую комбинацию я пробую, я не могу получить их так, как хочу. Любая помощь приветствуется!


  • Я предполагаю, что HelpPage считает, что маршрут GET v1/Orgs/{orgId} имеет конфликты между Get(string orgId) и Descendants(string orgId). На самом деле вы, вероятно, могли бы попробовать сделать запрос к GET v1/Orgs/{orgId} и должны увидеть ошибку, например, «Найдено несколько действий» ... и т. Д. 10.07.2013
  • Когда я определяю вложенные маршруты таким образом, я обычно устанавливаю вложенные ресурсы как другой контроллер, в вашем случае это будет DescendantsController. Таким образом, вы можете иметь полный API-интерфейс для потомков, если это необходимо. Может быть, это обходной путь, который вы можете изучить... 10.07.2013
  • Я думал о перемещении потомков на их собственный контроллер, но, поскольку они также являются организациями, я хотел оставить их в одном контроллере, чтобы сэкономить на дублированном коде. Похоже, что на данный момент это может быть лучшим обходным путем. Я попробую и посмотрю, работает ли он. 11.07.2013

Ответы:


1

Обычно такая проблема встречается, когда есть проблемы с архитектурой проекта (иерархией).

Кроме того, вы можете попробовать добавить маршрутизаторы другим способом. Например:

RouteTable.Routes.Add(
            "UserProfiles",
            new Route("Profile/{uid}/{mode}", new ProfileRouterHandler("~/Profile/Default.aspx")));

Обработчик маршрутизатора будет выглядеть примерно так:

public class ProfileRouterHandler: IRouteHandler
{
    private string VirtualPath { get; set; }
    public ProfileRouterHandler()
    {

    }

    public ProfileRouterHandler(string virtualPath)
    {
        VirtualPath = virtualPath;
    }

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string param = requestContext.RouteData.Values["uid"] as string;
        string mode = requestContext.RouteData.Values["mode"] as string;
        long id;
        long.TryParse(param, out id);
        if (id > 0)
        {
            string filePath = "~/Profile/Default.aspx?uid=" + param + (!string.IsNullOrEmpty(mode) ? "&mode=" + mode : "");
            VirtualPath = "~/Profile/Default.aspx";
            HttpContext.Current.RewritePath(filePath);
        }
        else
        {
            string filePath = "~/Profile/" + param + ".aspx";
            VirtualPath = filePath;
            HttpContext.Current.RewritePath(filePath);
        }

        return BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as Page; 
    }
}

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

18.09.2013
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..