您好我正在开发web api2和angularjs中的一个应用程序。我在从angularjs访问网址时遇到了一些路由问题。
我正在尝试访问以下网址。
var url = '/api/projects/4/processes';
我的控制器代码如下所示。
[RoutePrefix("api/processes")]
public class processesController : ApiController
{
[ActionName("projects/{projectsId}/processes")]
public HttpResponseMessage Get(int id)
{
return Request.CreateResponse(HttpStatusCode.OK, "");
}
}
我收到404错误。我无法点击网址。
这是我的webapi.config文件。
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
//routeTemplate: "{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
任何帮助都将不胜感激。
答案 0 :(得分:5)
首先确保在基于约定的路由之前启用属性路由。
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
如果目标网址是/api/projects/4/processes
那么给定的操作需要更新其路由模板以匹配。控制器已经有一个路由前缀但可以通过在路由模板前加上波形符~
在method属性上使用波浪号(〜)来覆盖路由前缀:
//GET /api/projects/4/processes
[HttpGet]
[Route("~/api/projects/{projectsId:int}/processes")]
public HttpResponseMessage Get(int projectsId) { ... }
答案 1 :(得分:3)
在您的情况下,网址应为
http://yourUrl/api/processes?projectsId=yourValue
另外,将ActionName更改为Route属性
[RoutePrefix("api/processes")]
public class ProcessesController : ApiController
{
[Route("projects/{projectsId}/processes"),HttpGet]
public HttpResponseMessage Get(int projectsId)
{
return Request.CreateResponse(HttpStatusCode.OK, "");
}
}
答案 2 :(得分:1)
你有一个路由前缀,这意味着行动的网址是RoutePrefix + ActionRoute
即。 HTTP GET api / processes / projects / {projectsId} / processes
参考docs
答案 3 :(得分:1)
请确保在基于约定的路由之前启用属性路由。
config.MapHttpAttributeRoutes();
然后你可以进行路由
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
定义方法如:
//GET /api/projects/4/processes ([ActionName("projects/{projectsId}/processes")])
[RoutePrefix("api/processes")]
public class processesController : ApiController
{
[HttpGet]
[Route("~/api/projects/{projectId:int}/processes")]
public HttpResponseMessage Get(int projectId) { ... }
}
答案 4 :(得分:0)
注释掉 ValuesController 类上的“[Authorize]”属性就是我所需要的...... 全部归功于DotNetTutorials
来自文章: “api/{controller}/{id}”
此时,如果您在浏览器中使用以下 URI,您将收到一条错误消息,指出此请求的授权已被拒绝。
http://localhost:xxxxx/api/values
要消除此错误,请注释 ValuesController 类的 Authorize 属性。这与我们将在后面的文章中讨论的安全性有关。