25

Geben Sie die folgende Webapiconfig;Geben Sie entweder xml oder json von MVC web API basierend auf Anfrage

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

und dieser Controller;

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

Unter der URL http://localhost/api/Products ich eine Liste von Produkten im XML-Format.

Was ich tun möchte, ist die Option, entweder json oder XML basierend auf der Anfrage zurückzugeben. Also für json wäre es das;

http://localhost/api/Products.json 

und für XML wäre es;

http://localhost/api/Products.xml 

ebenfalls;

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

Ist das möglich und wie würde ich diese Funktionalität erreichen?

Eine Alternative wäre etwas wie;

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

Antwort

37

Ja können Sie erreichen, dass mit AddUriPathExtensionMapping

Sie Routen wie folgt erstellen:

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

Dann müssen Sie die Formatierer erweitern:

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

sicherstellen, zu Fügen Sie einen Verweis auf System.Net.Http.Formatting hinzu, da diese Methoden Erweiterungsmethoden und Intel sind Die Lizenz wird sie standardmäßig nicht sehen.

Denken Sie daran, dass Sie in diesem Beispiel die Anfrage immer noch mit dem entsprechenden Inhaltstyp absetzen müssen. Wenn Sie diese jedoch direkt über die Adressleiste des Browsers verfügbar haben möchten, können Sie "text/html" zuordnen.

Ich schrieb eine Blog-Post über alles eine Weile, das vor - was hilfreich sein sollte, und nehmen Sie in mehr Details http://www.strathweb.com/2012/04/different-mediatypeformatters-for-same-mediaheadervalue-in-asp-net-web-api/

+0

Die Routen zu funktionieren scheinen, aber die Erweiterung Zeug nicht alles tun. Ich habe diese zu global.asax hinzugefügt, ist das ein Problem? – ChrisBint

+5

Chris, verwenden Sie {ext} anstelle von {extension}, da {ext} fest codiert zu sein scheint, um auf den zugeordneten Formatierer zu verweisen. – MCattle

+0

Toller Thread. Wie @Mcattle sagte, immer daran denken: EXT anstelle von EXTENSION –

Verwandte Themen