25

Cho webapiconfig sau;Trả về xml hoặc json từ api MVC web dựa trên yêu cầu

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

và bộ điều khiển này;

public class ProductsController : ApiController 
    { 
     Product[] _products = new Product[] 
     { 
      new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 }, 
      new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }, 
      new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M } 
     }; 

     public IEnumerable<Product> GetAllProducts() 
     { 
      return _products; 
     } 
    } 

Sử dụng URL http://localhost/api/Products Tôi nhận được danh sách các sản phẩm ở định dạng XML.

Điều tôi muốn làm là có tùy chọn trả về json hoặc xml dựa trên yêu cầu. Vì vậy, đối với json, nó sẽ là;

http://localhost/api/Products.json 

và cho XML, nó sẽ là;

http://localhost/api/Products.xml 

tương tự;

http://localhost/api/Products.json/1/ 
http://localhost/api/Products.xml/1/ 

Điều này có thể và làm cách nào để đạt được chức năng này?

Một giải pháp thay thế sẽ giống như;

http://localhost/api/json/Products/ 

Trả lời

37

Có bạn có thể đạt được điều đó với AddUriPathExtensionMapping

Bạn có thể tạo các tuyến đường như thế này:

routes.MapHttpRoute(
    name: "Api UriPathExtension", 
    routeTemplate: "api/{controller}.{extension}/{id}", 
    defaults: new { id = RouteParameter.Optional, extension = RouteParameter.Optional } 
); 

routes.MapHttpRoute(
    name: "Api UriPathExtension ID", 
    routeTemplate: "api/{controller}/{id}.{extension}", 
    defaults: new { id = RouteParameter.Optional, extension = RouteParameter.Optional } 
); 

Sau đó, bạn cần phải mở rộng và định dạng:

config.Formatters.JsonFormatter.AddUriPathExtensionMapping("json", "application/json"); 
    config.Formatters.XmlFormatter.AddUriPathExtensionMapping("xml", "text/xml"); 

hãy chắc chắn để thêm tham chiếu đến System.Net.Http.Formatting, vì các phương pháp này là các phương pháp mở rộng và intel lisense sẽ không nhìn thấy chúng theo mặc định.

Hãy nhớ trong ví dụ này, bạn vẫn phải đưa ra yêu cầu với loại nội dung thích hợp. Tuy nhiên, nếu bạn muốn có sẵn trực tiếp thông qua thanh địa chỉ trình duyệt, bạn có thể ánh xạ tới "văn bản/html".

tôi đã viết một bài đăng blog về tất cả những gì một thời gian trước - mà nên hữu ích và đưa bạn vào nhiều chi tiết http://www.strathweb.com/2012/04/different-mediatypeformatters-for-same-mediaheadervalue-in-asp-net-web-api/

+0

Các tuyến đường dường như để làm việc, nhưng các công cụ mở rộng không làm gì cả. Tôi đã thêm chúng vào global.asax, đây có phải là vấn đề không? – ChrisBint

+5

Chris, sử dụng {ext} thay vì {extension}, vì {ext} dường như được mã hóa cứng để tham chiếu đến trình định dạng được ánh xạ. – MCattle

+0

Chủ đề tuyệt vời. Giống như @MCattle nói, Luôn nhớ: EXT thay vì EXTENSION –