1

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

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 }
            );
    }
}
4

2 回答 2

7

确保在 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 }
    );
}
于 2013-10-15T10:00:53.950 回答
1

自定义路由应该在默认路由之前 public static void RegisterRoutes(RouteCollection routes) { 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)
于 2013-10-15T10:17:27.170 回答