ASP.NET Web API 2设置控制器路由

时间:2014-11-29 03:27:40

标签: c# asp.net asp.net-web-api2

我一直在摸不着头脑,因为我无法弄清楚我的代码中出了什么问题。

首先,我有一个正常工作的控制器:

namespace MyProject.Controllers {
    [RoutePrefix("api/Account")]
    public class AccountController : ApiController {
        [AllowAnonymous]
        [Route("Register")]
        public async Task<IHttpActionResult> Register(AccountModel model) {
            ...
            return Ok();
        }
    }
}

但是,当我添加新控制器并引入新路径时,会出现问题。

新控制器如下:

namespace MyProject.Controllers {
    [RoutePrefix("api/Admin")]
    public class AdminController : ApiController {
        [AllowAnonymous]
        [Route("Encrypt")]
        public IHttpActionResult Encrypt(string clientSecret) {
            ...
            return Ok();
        }
    }
}

然后我通过Postman发出请求:

Postman Request

不幸的是,返回了一个错误:

{
    "message": "No HTTP resource was found that matches the request URI 'http://localhost/api/admin/encrypt'."
}

我正在使用WebApiConfig.cs中定义的默认路由映射配置:

config.MapHttpAttributeRoutes();

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

任何人都可以对此有所了解吗?


更新

如果我以这种方式发送POST请求,我可以成功获得Ok()响应。

enter image description here

我现在有一个问题。 为什么我只能通过URL传递参数,而不能使用表单对象传递参数?

2 个答案:

答案 0 :(得分:0)

我建议您的路线定义略有变化: api / {controller} / {action} / {id}
imo的原因是Web api动作默认为标准接受动词。 然后你可以命名你的api动作方法,只用相关的accept属性装饰它们。

答案 1 :(得分:0)

要使用参数调用,请在route属性中包含参数并添加POST动词,如下所示:

  [Route("Encrypt/{clientSecret}")]
  [HttpPost]
  public IHttpActionResult Encrypt(string clientSecret) {
            ...
            return Ok();
       }

然后打电话如下:

 http://localhost/api/admin/encrypt/123456     

然而,post方法的约定没有如下参数:

[Route("Encrypt")]
[HttpPost]
public IHttpActionResult Encrypt() {
            ...
            return Ok();
       }
   }

然后打电话如下:

 http://localhost/api/admin/encrypt

如果您不想添加POST动词,可以使用POST动词为方法添加前缀,如下所示:

public IHttpActionResult PostEncrypt(string clientSecret)

public IHttpActionResult PostEncrypt()