2016-04-08 18 views
1

Bazı biri varsayılan JSON değerle dönmelidir http://apuUrl/getBooks gibi API uzantıyı sağlamaması halindeWebAPI MVC 4 set varsayılan yanıt tip

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

Şimdi istediğiniz kod şu var.

Benim şu senaryoları

iyi çalışıyor:

http://apuUrl/getBooks.json -> döndürür JSON

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

Not döndürür: Her API

+0

Olası kopya: http://stackoverflow.com/questions/13053485/return-either-xml-or-json-from-mvc-web-api-based-on-request – smoksnes

+0

Bunu gördüm ... Ama bu Her API –

+0

için ekstra yönlendirme gerektirir İçerik türü ayarlanarak da yapılabilir. Bu bir seçenek mi yoksa rotada mı olmalı? – smoksnes

cevap

2
için ekstra yönlendirme yapmak istemiyorum

Bir alıcıyı geçersiz kılmak için DelegatingHandler'u kullanmaya ne dersiniz?

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

Ve yapılandırmasında

:

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

Ve denetleyicisi:

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

Ve http://yoursite.com/api/Foo/?.json giderseniz dönmelidir:

"test" 

iken Kontrolör .json-parametresini beklemediğini beri, hala rota parametre girişini işlemek gerekir Not:

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

Düzenleme dönmelidir. Bu yüzden ? gerekli olabilir.