2013-08-07 25 views
5

Tôi muốn tạo một webservice REST của sử dụng ASP.net WebAPI trên .net 4.5ASP.net WebAPI Parameter Ràng buộc để loại phức tạp từ URI

url nên có một định dạng như thế này:

/values?Age=55&Height=176&Race=1&Weight=80&Gender=male&id=800001 

Bộ điều khiển được liên kết trông giống như sau:

[HttpGet] 
public string Get(int id, [FromUri]Demographics demographics) 
{ // etc.} 

Trong đó Nhân khẩu học là đối tượng tùy chỉnh về cơ bản chỉ là DTO với các thuộc tính nhất định. Tuy nhiên, nó chứa một tài sản mà có loại một enum tùy chỉnh:

enum Gender 
{ 
Female = 0, 
Male 
} 

Các ánh xạ mặc định chỉ hoạt động tốt nếu URL là các định dạng trên. Tuy nhiên, tất nhiên tôi cũng cần phải kiểm tra xem các thông số được cung cấp bởi url có đúng không.

ASP.net WebApi (afaik) theo mặc định cố gắng ánh xạ từng thông số dựa trên loại giả định (hoặc nếu nó có thể được chuyển đổi thành loại đó). Nếu nó không thể tìm thấy một giá trị phù hợp trong URI nó xuất hiện để giả định nó chỉ là 0,

Bây giờ điều này sẽ đưa tôi đến một tình huống rất đáng tiếc khi 0 theo định nghĩa vẫn là giá trị hợp lệ cho giới tính dân số.Gender (0 ~ Giới tính. Đồng tính).

Giải pháp đơn giản nhất là thay đổi enum để 0 sẽ là trạng thái "không xác định" mà tôi có thể kiểm tra. Tuy nhiên, tôi không thể thay đổi enum. Tôi có thể tạo ra quá tải của riêng mình cho đối tượng Nhân khẩu học nhưng không muốn làm điều này, bởi vì tôi nghĩ rằng phải có một cách đẹp hơn.

Tôi có thể ràng buộc rõ ràng thông số giới tính với thông số trong URI và ném ngoại lệ nếu nó không được gửi?

Tôi đọc về trình chuyển đổi loại nhưng tôi sẽ phải làm việc trên chuỗi URI và nghĩ rằng tôi sẽ phải triển khai nhiều chức năng mà WebApi dường như đã có.

Hãy nhớ rằng tôi phải làm việc trên URI và không thể sử dụng Nội dung yêu cầu.

Trả lời

4

Làm thế nào để làm cho enum rỗng như thế này?

public class Demographics 
{ 
    public Gender? Gender { get; set; } 
} 

Bên trong phương thức hành động, bạn chỉ có thể kiểm tra xem demographics.Gender có bị vô hiệu hay không.

1

WebAPI có khung xác thực thông qua data annotations. Điều này cho phép bạn đánh dấu các giới bất động sản trong nhân khẩu học đối tượng như [Bắt buộc]:

public class Demographics 
{ 
    [Required] 
    public Gender Gender { get; set; } 
} 

Sau đó, đánh dấu bộ điều khiển hoặc phương pháp điều khiển với [ValidateModel] thuộc tính để buộc xác nhận (đọc về những cách khác để buộc điều này, ví dụtoàn cầu: model validation):

[HttpGet] 
[ValidateModel] 
public string Get(int id, [FromUri]Demographics demographics) 
{ // etc.} 

Sau này, nếu bạn bỏ lỡ để cung cấp các thông số, bạn sẽ nhận được xác nhận tự động và một lỗi 400 Bad Request với một thông điệp:

{"Message":"The request is invalid.","ModelState":{"Gender":["The Gender field is required."]}} 

giá trị không hợp lệ được xử lý theo mặc định, ngay cả khi không có thuộc tính bắt buộc, do đó, giá trị không chính xác của Foo được cung cấp cho giới tính cũng được phản hồi với thông báo Yêu cầu không hợp lệ 400:

{"Message":"The request is invalid.","ModelState":{"Gender":["The value 'Foo' is not valid for Gender."]}} 
Các vấn đề liên quan