Как отобразить только методы, принадлежащие контроллеру, указанному в URL

Я работаю над настройкой страниц справки ASP.NET Web API.

Я ищу лучший подход для отображения методов, которые принадлежат контроллеру, указанному в URL. Все мои контроллеры имеют префикс "ws_".

Я добавил запись в свой RouteConfig для распознавания URL-адресов, содержащих строку "ws_", следующим образом:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "WSContext",
            url: "ws_{webservice}",
            defaults: new { controller = "Help", action = "WsContext" }
        );

        var route = routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Help", action = "Index", id = UrlParameter.Optional }
        );

        route.DataTokens["area"] = "HelpPage";
    }
}

Вот мой HelpController. Я пытаюсь получить метод WsContext для удаления методов, которые не принадлежат контроллеру (например, ws_testController), передаваемому через URL (например, mysite.com/ws_test).

public class HelpController : Controller
{
    public HttpConfiguration Configuration { get; private set; }
    private Collection<ApiDescription> apiDescriptionCollection;

    public HelpController()
        : this(GlobalConfiguration.Configuration)
    {
    }

    public HelpController(HttpConfiguration config)
    {
        Configuration = config;
        this.apiDescriptionCollection = Configuration.Services.GetApiExplorer().ApiDescriptions;
    }        

    public ActionResult Index()
    {
        ViewBag.DocumentationProvider = Configuration.Services.GetDocumentationProvider();
        return View(this.apiDescriptionCollection);
    }

    public ActionResult WsContext(string webservice)
    {
        ViewBag.DocumentationProvider = Configuration.Services.GetDocumentationProvider();
        Collection<ApiDescription> apiCollection = new Collection<ApiDescription>();
        foreach (ApiDescription desc in this.apiDescriptionCollection)
        {
            if (desc.GetControllerName() == ("ws_" + webservice))
                apiCollection.Add(desc);                
        }
        if (apiCollection.Count > 0)
            this.apiDescriptionCollection = apiCollection;
        return RedirectToAction("Index");
    }
...
}

В настоящее время я получаю следующую ошибку:

Ни один маршрут в таблице маршрутов не соответствует указанным значениям.

2 ответа

Решение

Я смог выполнить то, что я пытаюсь сделать, с помощью следующего.

RougeConfig.cs:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        var route = routes.MapRoute(
            name: "WSContext",
            url: "ws_{webservice}",
            defaults: new { controller = "Help", action = "Index" }
        );

        route.DataTokens["area"] = "HelpPage";

        route = routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Help", action = "Index", id = UrlParameter.Optional }
        );

        route.DataTokens["area"] = "HelpPage";
    }
}

HelpController.cs

    //public ActionResult Index()
    //{
    //    ViewBag.DocumentationProvider = Configuration.Services.GetDocumentationProvider();
    //    return View(this.apiDescriptionCollection);
    //}

    public ActionResult Index(string webservice)
    {
        ViewBag.DocumentationProvider = Configuration.Services.GetDocumentationProvider();
        if (!string.IsNullOrEmpty(webservice))
        {
            Collection<ApiDescription> apiCollection = new Collection<ApiDescription>();
            foreach (ApiDescription desc in this.apiDescriptionCollection)
            {
                if (desc.GetControllerName() == ("ws_" + webservice))
                    apiCollection.Add(desc);
            }
            if (apiCollection.Count > 0)
                this.apiDescriptionCollection = apiCollection;
        }
        return View(this.apiDescriptionCollection);
    }

Измените свой первый маршрут на (но подстановочные знаки могут быть дорогими)

routes.MapRoute(
name: "WSContext",
url: "{ws_*}",
defaults: new { controller = "Help", action = "WsContext" }