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

时间:2019-03-21 12:36:53

标签: c# asp.net-mvc rest owin

使用以下路线时:

curl -G \-d 'location_types=["city"]' \ 
-d 'type=adgeolocation' \ 
-d 'q=dub' \ 
-d 'access_token=<ACCESS_TOKEN>' \ 
https://graph.facebook.com/v2.11/search

控制器如下所示:

        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) }
        );

我的期望是,路由器将根据所使用的HttpMethod找到正确的路由,因为即使它使用的是相同的URI,也使用不同的HttpMethod。

但是相反,它失败并显示以下内容:

  
    

“消息”:“请求的资源不支持http方法'GET'。”

  

我的猜测是因为它找到了与URI匹配的内容,然后检查该方法是否相同。

是否有一种通过REST准则通过不同的Http方法使用相同URI的方法?我想念什么吗?

1 个答案:

答案 0 :(得分: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 =>发布。 提供主体作为对象的调用。