【问题标题】:ASP.NET Web Api Routing (IIS vs Self Hosted)ASP.NET Web Api 路由(IIS 与自托管)
【发布时间】:2012-02-23 08:59:21
【问题描述】:

我发现 ASP.NET Web Api 中的路由基类存在细微差别,这迫使我编写了一个小助手类,它允许我只定义一次路由。是否有一个原因?我假设框架的改动太大,无法让RouteCollections 都从同一个基类派生或实现同一个接口(这会使这个类变得更简单)

public static class RouteMapper
{
    private class Route
    {
        public string Name { get; set; }
        public string Template { get; set; }
        public object Defaults { get; set; }

        public Route(string name, string template, object defaults)
        {
            Name = name;
            Template = template;
            Defaults = defaults;
        }
    }

    private static List<Route> GetRoutes()
    {
        return new List<Route>
                   {
                       new Route(
                           "API Default",
                           "api/{controller}/{id}",
                           new {id = RouteParameter.Optional})
                   };
    }

    public static void AddHttpRoutes(this HttpRouteCollection routeCollection)
    {
        var routes = GetRoutes();
        routes.ForEach(route => routeCollection.MapHttpRoute(route.Name, route.Template, route.Defaults));
    }

    public static void AddHttpRoutes(this RouteCollection routeCollection)
    {
        var routes = GetRoutes();
        routes.ForEach(route => routeCollection.MapHttpRoute(route.Name, route.Template, route.Defaults));            
    }
}

这允许我在我的 Global.asax 和我的集成测试中调用一个简单的 AddHttpRoutes 方法。

集成测试

        var configuration = new HttpSelfHostConfiguration("http://localhost:20000");
        configuration.Routes.AddHttpRoutes();

        _server = new HttpSelfHostServer(configuration);
        _server.OpenAsync().Wait();

Global.asax

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

        routes.AddHttpRoutes();

        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

这是一个已知问题吗?它可能会在以后的 ASP.NET Web Api 版本中得到修复?

【问题讨论】:

  • 很好的示例代码,我稍作修改,将所有路由代码保留在原始 RouteConfig.cs 文件中。

标签: asp.net-mvc-routing integration-testing asp.net-web-api


【解决方案1】:

是的,路由略有不同,因为 ASP.NET 已经有路由,但我们不能直接依赖它,因为这会阻止自主机支持。我们仍在研究如何让事情变得更有意义。

【讨论】:

  • 我认为如果将它们都更改为实现一个通用接口,则可以使用扩展方法,并且只需要在一个地方完成路由。与我所做的类似,但只需要一种扩展方法。我相信你会想出比这更聪明的东西:)
猜你喜欢
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 2015-01-09
  • 2018-11-10
相关资源
最近更新 更多