使用以下路线时:
config.Routes.MapHttpRoute(
name: "new_device",
routeTemplate: "api/v1/devices",
defaults: new { controller = "Devices", action = "new_device" }
);
config.Routes.MapHttpRoute(
name: "devices_list",
routeTemplate: "api/v1/devices",
defaults: new { controller = "Devices", action = "devices_list", httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);
控制器如下所示:
public class DevicesController : ApiController
{
[HttpPost]
[ResponseType(typeof(IHttpActionResult))]
[Route("api/v1/devices")]
[ActionName("new_device")]
[ValidateModel]
public IHttpActionResult NewDevice([System.Web.Http.FromBody] Device device )
{
...
}
[HttpGet]
[ResponseType(typeof(IHttpActionResult))]
[Route("api/v1/devices")]
[ActionName("devices_list")]
[ValidateModel]
public List<Device> GetAllDevices()
{
...
}
我的期望是路由器会根据使用的HttpMethod找到正确的路由,因为即使它使用的是同一个URI,它也使用不同的HttpMethod。
但相反,它失败了以下内容:
“消息”:“请求的资源不支持http方法'GET'。”
我的猜测是因为它与URI匹配,然后检查方法是否相同。
有没有办法实现使用相同的URI与不同的Http方法,这是REST指南的方式?我错过了什么吗?
好的,我查看你的整个代码。我想你正试图以复杂的方式实现调用。
以下代码用于配置:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/v1/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
以下是您的控制器代码:
public class DevicesController : ApiController
{
[HttpPost]
[ResponseType(typeof(IHttpActionResult))]
[ActionName("newDevice")]
public IHttpActionResult NewDevice([System.Web.Http.FromBody] Device device)
{
return null;
}
[HttpGet]
[ResponseType(typeof(IHttpActionResult))]
[ActionName("devices_list")]
public List<Device> GetAllDevices()
{
return null;
}
}
我删除了ValidateModel。我认为这是你的自定义属性或以某种方式与内置的nuget包相关。
无论如何,使用Postman或任何HTTP客户端工具执行调用。它应该工作,因为它在我的最后使用上面提到的代码。
示例呼叫:
https://localhost:44370/api/v1/devices/devices_list =>得到。 https://localhost:44370/api/v1/devices/newDevice =>发布。提供body作为对象的post调用。