2013-11-01 13 views
6

tôi đã thiết lập một mẫu đường:Wildcard trong WebAPI Route mẫu

config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{id}/{*wildcard}", 
     defaults: new { id = RouteParameter.Optional } 
     ); 

chữ ký controller action của:

public IEnumerable<object> Get(Int64 id,string abc) 

Tôi cố gắng để kết hợp nó với URL http://mymachine.com/api/Individuals/1?abc=4, nhưng nó mang lại cho tôi một ngoại lệ

{"$ id": "1", "Thư": "Đã xảy ra lỗi .", "ExceptionMessage": "Tham chiếu đối tượng không s và đối với một thể hiện của đối tượng . "," Loại ngoại lệ ":" System.NullReferenceException "," StackTrace ":" tại System.Web.Http.ValueProviders.Providers.RouteDataValueProvider.d__4.MoveNext() \ r \ n

Kỳ lạ, http://mymachine.com/api/Individuals?id=1&abc=4 không khớp với bộ điều khiển, hành động và thông số.

tôi nghĩ "{id}" của "api/{controller}/{id}/{* wildcard}" sẽ làm việc.

Tại sao?

+0

Bạn không thể có tham số tùy chọn, sau đó là một tham số không bắt buộc! Ngoài ra nếu bạn đang đi qua abc như chuỗi truy vấn thì bạn không cần phải có nó trong tuyến đường! Tôi sẽ làm lại tuyến đường của tôi nếu tôi ở vị trí của bạn ... cho nó một ý nghĩ –

Trả lời

7

Ký tự đại diện sẽ báo cho công cụ định tuyến khớp với phần còn lại của URI với thông số tuyến đường (ví dụ: xem phần "Nhận sách theo ngày xuất bản") in this article).

Nó không có nghĩa là khớp với bất kỳ biến nào được đặt tên bất kỳ tham số nào - đây là thứ mà WebApi làm theo mặc định với các mục trên chuỗi truy vấn bất kể cấu hình tuyến đường của bạn. .

Nó không khớp với {id} trong tuyến đường của bạn vì nó đang mong đợi thông số được gọi là {wildcard} không được đánh dấu là tùy chọn.

Để minh họa, nếu bạn chỉ đơn giản là thay đổi 'wildcard' thành 'abc':

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}/{*abc}", 
    defaults: new {id = RouteParameter.Optional}); 

Sau đó, nó sẽ phù hợp với thành công URI sau:

http://mymachine.com/api/Individual/1/a/b/c

Với các giá trị id=1, abc=a/b/c

Để khắc phục, chỉ cần xóa ký tự đại diện khỏi tuyến đường của bạn để trông giống như sau:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new {id = RouteParameter.Optional}); 
4

Câu trả lời từ gooid là chính xác. Tôi chỉ muốn trả lời phần thứ hai của câu hỏi:

Kỳ lạ, http://mymachine.com/api/Individuals?id=1&abc=4 không khớp với bộ điều khiển, hành động và thông số.

Vì bạn có id = RouteParameter.Optional, nếu tuyến đường không cung cấp id, nó vẫn là khớp với mẫu tuyến đường. Trình giữ chỗ {* wildcard} tìm phần còn lại của tuyến đường và đặt nó vào Từ điển tuyến đường trong "ký tự đại diện" chính. Trong trường hợp này, nó là chuỗi rỗng (hoặc null).

Hãy nhớ rằng các tham số truy vấn cũng đi vào Từ điển tuyến đường. Do đó, từ điển Route của bạn sẽ là: { "id": "1", "abc": "4", "đại diện": ""}

Mọi chi tiết, bạn có thể nhìn vào http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

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