2012-09-26 19 views
10

Dưới đây là cấu hình định tuyến trong WebApiConfig.cs:Làm thế nào để xác định phương pháp PUT trong định tuyến chỉ giới hạn các phương thức Đặt trong bộ điều khiển mà không có tham số?

config.Routes.MapHttpRoute(
    name: "DefaultApiPut", 
    routeTemplate: "api/{controller}", 
    defaults: new { httpMethod = new HttpMethodConstraint(HttpMethod.Put) } 
); 


config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get, HttpMethod.Post, HttpMethod.Delete) } 
); 

Đây là bộ điều khiển của tôi:

public class MyController : ApiController { 
    [HttpPut] 
    public void Put() 
    { 
     //blah 
    } 
} 

Bằng cách nào đó khi sents khách hàng yêu cầu PUT với URL /api/myController/12345, nó vẫn maps cho Put phương pháp trong MyController, tôi đang mong đợi một lỗi như tài nguyên không tìm thấy.

Cách buộc phương thức Put chỉ chấp nhận yêu cầu mà không có tham số?

Cảm ơn trước!

Trả lời

9

Bạn đang đặt httpMethod ràng buộc vào defaults nhưng phải ở số constraints.

defaults chỉ nói giá trị mặc định sẽ là gì nếu yêu cầu không bao gồm một số hoặc tất cả chúng làm thông số định tuyến (trong trường hợp động từ, là vô nghĩa, vì mọi yêu cầu HTTP luôn có động từ như một phần của giao thức). constraints giới hạn sự kết hợp của các giá trị tuyến đường sẽ kích hoạt tuyến đường, đó là những gì bạn đang thực sự cố gắng làm.

FYI, cho định tuyến đơn giản/tiêu chuẩn này, bạn không cần thuộc tính [HttpPut] trong bộ điều khiển API. Điều đó đã được xử lý bởi định tuyến HTTP để ánh xạ động từ đến phương thức điều khiển.

10

này hoạt động để hạn chế phương pháp http trên các tuyến đường:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
    config.Routes.MapHttpRoute(
     name: "LocationApiPOST", 
     routeTemplate: "api/{orgname}/{fleetname}/vehicle/location", 
     defaults: new { controller = "location" } 
     constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) } 
    ); 

    config.Routes.MapHttpRoute(
     name: "LocationApiGET", 
     routeTemplate: "api/{orgname}/{fleetname}/{vehiclename}/location/{start}", 
     defaults: new { controller = "location", start = RouteParameter.Optional } 
     constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) } 
    ); 

    ... 

} 
+2

Mã này mẫu làm việc cho tôi ngoại trừ việc tôi đã phải ghi rõ những hạn chế như trong câu hỏi, ví dụ: hạn chế: mới {httpMethod = new HttpMethodConstraint (HttpMethod .Get)} –

+1

Có hai lớp HttpMethodConstraint trong .net 4.5.1. Một trong System.Web.Routing và một trong System.Web.Http.Routing. Chúng yêu cầu các mẫu tham số khác nhau, một mẫu chấp nhận các chuỗi, cái kia sẽ tìm kiếm enum. Tôi chưa biết liệu họ có những hành vi khác ngoài điều đó không. – Rozwel

+0

@Rozwel cảm ơn! Tôi đã đập đầu của tôi một chút nhận được không thể chuyển đổi thành chuỗi lỗi bởi vì tôi đã sử dụng system.web.routing không system.web.http.routing. – Matt

Các vấn đề liên quan