2016-04-08 9 views
1

Ich habe folgenden CodeWebAPI mvc 4 Satz Standardantworttyp

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); 
config.Formatters.JsonFormatter.MediaTypeMappings.Add(
    new UriPathExtensionMapping("json", "application/json")); 
config.Formatters.XmlFormatter.MediaTypeMappings.Add(
    new UriPathExtensionMapping("xml", "application/xml")); 

Jetzt möchte ich, wenn jemand nicht Erweiterung nicht bieten in api wie http://apuUrl/getBooks es standardmäßig JSON Wert zurückgeben sollte.

Meine folgenden Szenarien arbeiten gut:

http://apuUrl/getBooks.json -> liefert JSON

http://apuUrl/getBooks.xml -> liefert XML

Hinweis: Ich möchte nicht zusätzliche Routing für jede API

+0

Mögliche Duplikate: http://stackoverflow.com/questions/13053485/return-either-xml-or-json-from-mvc-web-api-based-on-request – smoksnes

+0

Ich sah dies ... Aber das erfordert ein zusätzliches Routing für jedes API –

+0

Es kann auch durch Festlegen von Inhaltstyp erreicht werden. Ist das eine Option, oder muss es in der Route sein? – smoksnes

Antwort

2
machen

Wie wäre es mit einer DelegatingHandler den acceptheader zu überschreiben?

public class MediaTypeDelegatingHandler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     var url = request.RequestUri.ToString(); 
     //TODO: Maybe a more elegant check? 
     if (url.EndsWith(".json")) 
     { 
      // clear the accept and replace it to use JSON. 
      request.Headers.Accept.Clear(); 
      request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     } 
     else if (url.EndsWith(".xml")) 
     { 
      request.Headers.Accept.Clear(); 
      request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml")); 
     } 
     return await base.SendAsync(request, cancellationToken); 
    } 
} 

Und in Ihrer Konfiguration:

GlobalConfiguration.Configuration.MessageHandlers.Add(new MediaTypeDelegatingHandler()); 

Und Ihre Controller:

public class FooController : ApiController 
{ 
    public string Get() 
    { 
     return "test"; 
    } 
} 

Und wenn Sie http://yoursite.com/api/Foo/?.json sollte gehen zurück:

"test" 

Während http://yoursite.com/api/Foo/?.xml sollte

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">test</string> 

bearbeiten zurück: Beachten Sie, dass Sie immer noch die Strecke Parametereingabe behandeln müssen, da der Controller die .json-Parameter nicht erwarten. Deshalb kann die ? erforderlich sein.