C#配置RESTful路由

时间:2018-04-03 15:12:25

标签: c#

我想要一条路线

{domain}/v1/images/{id}{domain}/v1/images/{email}

第一条路线正在运行(例如:v1/images/1?size=100)但是当我尝试第二条路线时(例如:v1/images/foo@domain.com?size=100我收到此错误:

  

参数字典包含参数' id'的空条目。的   非可空类型&System; Int32'方法   ' System.Net.Http.HttpResponseMessage Get(Int32,   System.Nullable`1 [System.Int32])'在' .... ImageController'。一个   可选参数必须是引用类型,可空类型或be   声明为可选参数。"

我的路线配置如下:

        routes.MapHttpRoute(
            name: "Image",
            routeTemplate: "v1/images/{id}",
            defaults: new { controller = "Image", size = RouteParameter.Optional }
        );

        routes.MapHttpRoute(
            name: "ImageByEmail",
            routeTemplate: "v1/images/{email}",
            defaults: new { controller = "Image", size = RouteParameter.Optional }
        );

是否可以通过ID或电子邮件获取图像?

2 个答案:

答案 0 :(得分:2)

路由器无法确定v1/images/foo@domain.com?size=100/v1/images/{id}还是/v1/images/{email}。它默默地选择/v1/images/{id}并尝试将"foo@domain.com"解析为int,解析失败,因为id参数(int id)不是可选的(而不是(int? id) })它会抛出一个错误。

答案 1 :(得分:2)

  routes.MapHttpRoute(
        name: "Image",
        routeTemplate: "v1/images/{id}",
        defaults: new { 
            controller = "Image", 
            size = RouteParameter.Optional, 
            id = @"\d+" }
    );

@"\d+"会将ID验证为数字。