C#REST API控制器:具有2个不同操作的相同路由

问题描述 投票:0回答:1

使用以下路线时:

        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指南的方式?我错过了什么吗?

c# asp.net-mvc rest owin
1个回答
2
投票

好的,我查看你的整个代码。我想你正试图以复杂的方式实现调用。

以下代码用于配置:

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调用。

© www.soinside.com 2019 - 2024. All rights reserved.