【问题标题】:ASP.NET WebApi custom routeASP.NET WebApi 自定义路由
【发布时间】:2013-10-15 18:25:34
【问题描述】:

我有一个返回缩略图的简单控制器,它的定义如下:

public class ThumbnailsController : ApiController
{
    public HttpResponseMessage Get(string id)
    {
        //code here
    }
}

一切正常,我可以使用 url http://site.com/api/Thumbnails/mylogin 访问图片

但我想像这样修改这个方法:

public class ThumbnailsController : ApiController
{
    public HttpResponseMessage Get(string login="", int size=64)
    {
        //code here
    }
}

想法是能够调用:
- http://site.com/api/Thumbnails/ - 这将以默认 (64x64) 大小返回当前登录的用户图片
- http://site.com/api/Thumbnails/mylogin - 这将返回默认 (64x64) 大小的 mylogin 用户图片
- http://site.com/api/Thumbnails/mylogin/128 - 这将返回 128x128 大小的 mylogin 用户图片

我的问题是路由,默认路由适用于我未更改的方法,但我应该如何更改默认路由才能使其正常工作?

我还会有其他 Api 控制器,但只有这个应该有自定义路由。

这是我的尝试,但它不起作用。

routes.MapHttpRoute(
            name: "Thumbnails",
            routeTemplate: "api/thumbnails/{login}/{size}",
            defaults: new {controller="Thumbnails", action="Get", login = RouteParameter.Optional, size = RouteParameter.Optional }
            );

编辑 这是我的带有测试方法的控制器:

public class ThumbnailsController : ApiController
{
    public string Get(string login="", int size=64)
    {
        return string.Format("login: {0}, size: {1}", login, size);
    }
}

这是我的 RouteConfig:

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

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

        routes.MapHttpRoute(
            name: "Thumbnails",
            routeTemplate: "api/Thumbnails/{login}/{size}",
            defaults: new { controller = "Thumbnails" , login = RouteParameter.Optional, size = RouteParameter.Optional }
            );
    }
}

【问题讨论】:

    标签: asp.net asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    确保在 WebApiConfig 中的默认路由之前声明自定义路由。 编辑:

    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
        name: "Thumbnails",
        routeTemplate: "api/Thumbnails/{login}/{size}",
        defaults: new { controller = "Thumbnails", action = "Get", 
            login = RouteParameter.Optional, size = RouteParameter.Optional }
        );
    
        config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
        );
    }
    

    【讨论】:

    • 我没有声明默认路由,就这个,目前我只有这个Web API控制器
    • 我已经复制了你的代码,一切似乎都在这里工作。您是否收到错误消息,或者您的电话只是没有击中控制器?
    • 我的参数没有传递给方法,它正在获取默认值。我会修改我的问题并添加测试方法
    • 您的自定义 api 路由应在 WebApiConfig 而不是 RouteConfig 中声明。同样如前所述,它需要是第一个声明的路由(即在自动添加的默认路由之前)。
    【解决方案2】:

    自定义路由应该在默认路由之前 公共静态无效注册路由(RouteCollection 路由) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapHttpRoute(
            name: "Thumbnails",
            routeTemplate: "api/Thumbnails/{login}/{size}",
            defaults: new { controller = "Thumbnails" , login = RouteParameter.Optional, size = RouteParameter.Optional }
            );
    
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional}
            );
    }
    

    并尝试将“大小”的类型更改为可为空的整数:

    public HttpResponseMessage Get(string login = null, int? size = 64)
    

    【讨论】:

    • 感谢您的帮助,很遗憾我不能做出更多正确的答案,但@Jonny 关于路由声明的评论解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    相关资源
    最近更新 更多