奇特的情况,我有这个方法
[HttpGet]
[Route("api/models/getallmachines")]
public IHttpActionResult GetAllMachines()
{
var model= db.machine.ToList();
return Ok(model);
}
我总是在调用http://localhost:xxx/api/models/getallmachines
时找不到资源。但是,如果我添加一个参数,请说
[HttpGet]
[Route("api/models/getallmachines/{blub}")]
public IHttpActionResult GetAllMachines(int blub)
{
var model= db.machine.ToList();
return Ok(model);
}
适用于http://localhost:xxx/api/models/getallmachines/0
!为什么?这是我的webapiconfig
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
}
更新
在同一个控制器中有另一种方法,这个方法在这里
[HttpGet]
[Route("api/models/getmodel/{id}")]
public IHttpActionResult GetModel(int id)
{
var model = models.FirstOrDefault(p => p.ApiModelId == id);
if (model == null)
return NotFound();
return Ok(model);
}
这给了我浏览器中的json文件和这个路由调试器信息
答案 0 :(得分:1)
我认为您可以为RouteConfig添加新路线。
`config.Routes.MapHttpRoute(
name: "DefaultApiWithoutId",
routeTemplate: "api/{controller}/{action}/",
defaults: null
);`
此路线应放在第一条路线之后(因为它的限制性较小)。下面是一个很好的包的描述,它可以更容易检查,采取哪些路由以及原因:Route Debugger。
注意:在您发布内容之前,您必须卸载/禁用routedebugger ..可能会导致恼人的问题......
答案 1 :(得分:0)
问题是 - 经常 - 非常愚蠢...我忘了提及,我正在使用web.api以及常规mvc 。在Global.asax.cs
中,首先初始化mvc路由,然后初始化为web.api,即
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
而不是
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
这导致模式api/models/whatever
与mvc中的默认路由配置匹配,即
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
因此更改Global.asax.cs
中的通话顺序解决了这个问题。谢谢@Joshit