我一直在摸不着头脑,因为我无法弄清楚我的代码中出了什么问题。
首先,我有一个正常工作的控制器:
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发出请求:
不幸的是,返回了一个错误:
{
"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()
响应。
我现在有一个问题。 为什么我只能通过URL传递参数,而不能使用表单对象传递参数?
答案 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()