我想要一条路线
{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或电子邮件获取图像?
答案 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验证为数字。