【问题标题】:ASP.NET Web API action routing doesn't not workASP.NET Web API 操作路由不起作用
【发布时间】:2018-01-01 03:20:09
【问题描述】:

我是 Web API 的新手,我知道 Web api 和 MVC 之间的区别之一 是不是 web API 使用 HTTP 方法来按约定选择调用哪个方法。

现在我在路由中添加了一个动作参数, 我觉得我的知识出了点问题, 路线不通。

这是我的控制器,主要问题是我只需要映射 SignInSignUp 方法。 (其他 RestFul 方法工作正常。)

public class UsersController : ApiController
{
    private Model1Container db = new Model1Container();

    public IEnumerable<User> GetUsers()
    {
        return db.UserSet;
    }

    [HttpPost]
    public IHttpActionResult SignIn(string account, string password)
    {
        ...
    }

    [HttpPost]
    public IHttpActionResult SignUp(User user)
    {
        ...
    }

    public IHttpActionResult GetUser(int id)
    {
        ...
    }

    public IHttpActionResult PutUser(int id, User user)
    {
        ...
    }

    public IHttpActionResult DeleteUser(int id)
    {
        ...
    }

}

我什至尝试在两种方法的前两条路线上添加直接约束,

config.Routes.MapHttpRoute(
            name: "UsersSignIn",
            routeTemplate: "api/Users/SignIn",
            defaults: new { controller = "Users", action = "SignIn" }
        );

config.Routes.MapHttpRoute(
            name: "UsersSignUp",
            routeTemplate: "api/Users/SignUp",
            defaults: new { controller = "Users", action = "SignUp" }
        );

config.Routes.MapHttpRoute(
            name: "RestFulUser",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: new { controller = "Users" }
        );

但事实证明 [POST] "api/Users/SignUp""api/Users" 可以映射到 SignUp 方法,但 "api/Users/SignIn" 总是不成功。

这里是关于我如何在 POSTMAN 中尝试 API

请指出我哪里出错了..

【问题讨论】:

  • 你打电话给config.Routes.MapAttributeRoutes了吗?
  • 是的,这样其他 RestFul 方法就可以正常工作了。
  • 装饰你的方法,如[HttpPost][Route("SignIn")],它们偏离约定并删除除最后一次调用MapHttpRoute之外的所有方法
  • 那么 "api/Users/SignIn" 总是映射到 SignUp 方法。如果我删除 SignUp 方法,它会返回一条消息“您请求的资源不支持 Http Post 方法。”
  • 你需要装饰它们。另外,发帖到api/Users 是什么意思?如果这意味着创建一个用户,那么创建一个执行该操作的方法并将其命名为Post

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


【解决方案1】:

如果使用属性路由,您需要区分这两个路由。同样,一旦使用路由,控制器本身就是全部或全部。您不能将它们与基于约定的路线混合使用。

评论Attribute Routing in ASP.NET Web API 2

[RoutePrefix("api/Users")]
public class UsersController : ApiController {
    private Model1Container db = new Model1Container();

    [HttpGet]
    [Route("")] //Matches GET api/Users
    public IEnumerable<User> GetUsers() {
        return db.UserSet;
    }

    [HttpPost]
    [Route("SignIn")] //Matches POST api/Users/SignIn
    public IHttpActionResult SignIn(string account, string password) {
        //...
    }

    [HttpPost]
    [Route("SignUp")] //Matches POST api/Users/SignUp
    public IHttpActionResult SignUp([FromBody]User user) {
        //...
    }

    [HttpGet]
    [Route("{id:int}")] //Matches GET api/Users/5
    public IHttpActionResult GetUser(int id) {
        //...
    }

    [HttpPut]
    [Route("{id:int}")] //Matches PUT api/Users/5
    public IHttpActionResult PutUser(int id,[FromBody]User user) {
        //...
    }

    [HttpDelete]
    [Route("{id:int}")] //Matches DELETE api/Users/5
    public IHttpActionResult DeleteUser(int id) {
        //...
    }
} 

【讨论】:

  • 嗯,一开始你给的方式行不通,后来我发现问题是参数(string 帐户,string 密码)不能以 "application/x-www-form-urlencoded" 格式传递,这是 web api 约定之一吗?所以我更改为将两个参数都添加到 URL 或将参数更改为类型 User,然后使用属性路由一切正常,谢谢。
猜你喜欢
  • 2014-03-12
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 2018-10-10
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多