ASP.NET Web API realiza la negociación de contenido de forma predeterminada; devolverá XML o JSON u otro tipo basado en el encabezado Accept
. No necesito/quiero esto, ¿hay alguna manera (como un atributo o algo) de decirle a la API web que siempre devuelva JSON?¿Cómo forzar a ASP.NET Web API a devolver siempre JSON?
Respuesta
Supporting only JSON in ASP.NET Web API – THE RIGHT WAY
Reemplazar IContentNegotiator con JsonContentNegotiator:
var jsonFormatter = new JsonMediaTypeFormatter();
//optional: set serializer settings here
config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));
JsonContentNegotiator aplicación:
public class JsonContentNegotiator : IContentNegotiator
{
private readonly JsonMediaTypeFormatter _jsonFormatter;
public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
{
_jsonFormatter = formatter;
}
public ContentNegotiationResult Negotiate(
Type type,
HttpRequestMessage request,
IEnumerable<MediaTypeFormatter> formatters)
{
return new ContentNegotiationResult(
_jsonFormatter,
new MediaTypeHeaderValue("application/json"));
}
}
¿dónde se corta y pega la primera parte del código?No veo un objeto "config" en mi Global.asax. ¿De dónde viene esa variable? el artículo tampoco explica. – BuddyJoe
Comprobar el método static public void Register (HttpConfiguration config) {...} en el archivo WebApiConfig.cs que ha sido creado por VS2012 en la creación del proyecto –
Esto forzará a JSON en el sentido de que un cliente 'Accept'ing XML obtendrá JSON, y ** no recibirá un 406 **? –
Borrar todos los formateadores y volver a agregar el formateador Json.
GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());
EDITAR
he añadido a Global.asax
dentro Application_Start()
.
Si quieres hacer eso por un solo método, entonces declarar su método como devolver HttpResponseMessage
vez de IEnumerable<Whatever>
y do:
public HttpResponseMessage GetAllWhatever()
{
return Request.CreateResponse(HttpStatusCode.OK, new List<Whatever>(), Configuration.Formatters.JsonFormatter);
}
este código es el dolor para las pruebas unitarias, sino que también es posible de esta manera:
sut = new WhateverController() { Configuration = new HttpConfiguration() };
sut.Configuration.Formatters.Add(new Mock<JsonMediaTypeFormatter>().Object);
sut.Request = new HttpRequestMessage();
Si quiere algo para un método, solo cree un http://msdn.microsoft.com/en-us/library/system.web.mvc.actionfilterattribute(v=vs.118).aspx – Elisabeth
Inspirado por una excelente respuesta de Dmitry Pavlov, alteré un poco para que pudiera plug-in lo formateador quería cumplir .
Gracias a Dmitry.
/// <summary>
/// A ContentNegotiator implementation that does not negotiate. Inspired by the film Taken.
/// </summary>
internal sealed class LiamNeesonContentNegotiator : IContentNegotiator
{
private readonly MediaTypeFormatter _formatter;
private readonly string _mimeTypeId;
public LiamNeesonContentNegotiator(MediaTypeFormatter formatter, string mimeTypeId)
{
if (formatter == null)
throw new ArgumentNullException("formatter");
if (String.IsNullOrWhiteSpace(mimeTypeId))
throw new ArgumentException("Mime type identifier string is null or whitespace.");
_formatter = formatter;
_mimeTypeId = mimeTypeId.Trim();
}
public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
{
return new ContentNegotiationResult(_formatter, new MediaTypeHeaderValue(_mimeTypeId));
}
}
Philip W tenía la respuesta correcta, pero para mayor claridad y una solución de trabajo completa, editar el archivo Global.asax.cs a tener este aspecto: (Tenga en cuenta que tenía que agregar la referencia System.Net.Http.Formatting en el fichero generado Stock)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Formatting;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace BoomInteractive.TrainerCentral.Server {
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class WebApiApplication : System.Web.HttpApplication {
protected void Application_Start() {
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//Force JSON responses on all requests
GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());
}
}
}
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
Esto borra el formateador XML y el impago de este modo a formato JSON.
Perfeccione todo lo que necesite – tfa
Yo puede utilizar en WebApiConfig.cs:
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
Esto tiene cabeceras correctas establecidas. Parece un poco más elegante.
public JsonResult<string> TestMethod()
{
return Json("your string or object");
}
- 1. Devolver algunos campos de ASP.NET Web API
- 2. Cómo devolver JSON desde el controlador de MVC WEB API
- 3. ¿Hay alguna manera de forzar a ASP.NET Web API a que devuelva texto sin formato?
- 4. ASP.NET Web API en IE
- 5. ¿Cómo forzar a XCode 4 a actualizar siempre los recursos?
- 6. ¿Cómo forzar a NSWindow a estar siempre activo/enfocado?
- 7. ¿Cómo forzar a Kaminari a incluir siempre param de página?
- 8. WCF Web API vs servicios web ASP.NET MVC JSON
- 9. Cómo devolver JSON desde el servicio web
- 10. Asp.Net Web Api - ModelBinders
- 11. Cómo forzar C# binary int division a devolver un doble?
- 12. Herencia y el formateador JSON de ASP.NET Web API
- 13. ¿Cómo puedo obligar a asp.net webapi a decodificar siempre los datos POST como JSON
- 14. Devolver objeto JSON desde una página ASP.NET
- 15. Cómo devolver JSON desde un servicio web 2.0 asmx
- 16. Gestión de excepciones ASP.NET MVC Web API
- 17. ¿Puedes forzar a MSI a ser siempre administrador?
- 18. Devolver tipos anónimos con API web
- 19. Cómo forzar a mi aplicación ASP.net 2.0 a recompilar
- 20. ASP.NET Web API Questions - Autorización/Autenticación
- 21. Devolver JSON de PHP a JavaScript?
- 22. ASP.NET Web API descargar texto
- 23. Cómo devolver un valor de fecha de JSON a API de visualización de Google
- 24. ASP.NET Web API con DotNetOpenAuth
- 25. ASP.net Web API y System.Net.Http
- 26. ¿Cómo crear ASP.NET Web API Url?
- 27. actualización parcial con asp.net web api
- 28. ¿Cómo devolver la respuesta correcta por error en ASP.NET MVC 3.0 a través de JSON?
- 29. C# MVC4 Web API: el JSON resultante debe devolver objetos en lugar de $ ref al objeto
- 30. ¿Cómo puede mi clase Asp.Net C# devolver un formato json
Usted puede ser capaz de hacer esto la eliminación de todos los formateadores excepto JSON de 'GlobalConfiguration.Configuration.Formatters' –