获取方法无法在web api中工作

时间:2017-02-26 05:20:38

标签: c# asp.net-web-api asp.net-web-api-routing

您好我正在开发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 }
);

任何帮助都将不胜感激。

5 个答案:

答案 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) { ... }

来源:Attribute Routing in ASP.NET Web API 2

答案 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, "");
    }
}

新网址 - http://yourUrl/api/processes/projects/2/processes

More info on Attribute routing

答案 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 属性。这与我们将在后面的文章中讨论的安全性有关。