2017-02-10 40 views
3

我有以下2个路由设置,并且在发送有效请求时它们工作正常。允许使用ASP.NET MVC路由的字符串ID

config.Routes.MapHttpRoute("DefaultApiWithId", "{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" }); 
config.Routes.MapHttpRoute("DefaultApiWithAction", "{controller}/{action}"); 

我想测试一些错误的请求,以确保反应是正确的。我正在尝试在我的控制器中调用以下Action。

public HttpResponseMessage Get(string id) 
{ 
    //output the id again 
} 

如果我叫localhost:80/users/123,我得到响应是有效的,它会输出123。例如,当我尝试使用无效的ID时,包含字母的字母会失败,并显示以下错误。

{“消息”:“没有HTTP资源发现该请求URI ‘http://localhost:80/users/d1g’相匹配。”,“MessageDetail”:“无动作发现 上的名称相匹配的控制器‘用户’' d1g'。“}

我可以看到最新的错误。该请求应该与第一条路线匹配,但与第二条路线匹配。我有两种方法称为Get。一个接受ID,另一个不需要ID。不需要ID的那个返回所有记录的列表。我遇到了很多麻烦,上面的路线是我如何解决这个问题。

+0

它不应该匹配第一条路线。该路由有一个约束条件,只允许为id参数使用数字“new {id = @”\ d +“}'。这是为了它不会与第二条路线图冲突 – Nkosi

+0

我认为你的第一个GET,你在这里指定了一个掩码:'new {id = @“\ d +”}',尝试删除它。但是,我认为你应该只有一个方法,只需一个简单的决定:如果通过'ID',则返回一个Object,否则返回一个列表。但我会采取另一种方式。 –

+0

如果我删除约束,我得到一个错误“发现多个匹配请求的操作:\ r \ nSystem.Net.Http.HttpResponseMessage Get()”。这是有道理的,因为我有2个get方法。一个采取一个id和另一个不采用以返回记录列表 –

回答

2

通过删除约束来更新路由,使用操作更新路由以避免冲突,然后切换订单。

config.Routes.MapHttpRoute(
    "DefaultApiWithAction", 
    "{controller}/{action}/{id}" 
    new { id = RouteParameter.Optional } 
); 

config.Routes.MapHttpRoute(
    "DefaultApiWithId", 
    "{controller}/{id}", 
    new { action = "Get", id = RouteParameter.Optional } 
); 
+0

这解决了这个问题,但反过来又产生了我之前遇到的同样的问题。找到与请求匹配的多个操作:\ r \ nSystem.Net.Http.HttpResponseMessage类型为Get()。我想让一个控制器像这样工作/ controller/=调用get(),/ controller/id = call get(string id) –

+0

Bingo,这个工作。不知道为什么,但我认为硬编码的行动将导致问题,但这似乎已完美运作 –