update una studio nivel modificar minsdkversion como check change cambiar c# asp.net-web-api asp.net-web-api2

c# - una - modificar api



¿Cómo cambiar la API Web 2 predeterminada al formateador JSON? (6)

Tengo un proyecto de API web que devuelve algunos datos del producto. Negocia el tipo de devolución correctamente según el encabezado Aceptar (JSON / XML) de la solicitud. El problema es que si no se especifica ningún encabezado Accept, se devuelve XML, pero quiero que devuelva JSON de manera predeterminada

http://website.com/MyPage?type=json // returns json http://website.com/MyPage?type=xml // returns xml http://website.com/MyPage // returns xml by default

Aquí está mi código actual se ve así:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add( new QueryStringMapping("type", "xml", new MediaTypeHeaderValue("application/xml"))); GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add( new QueryStringMapping("type", "json", new MediaTypeHeaderValue("application/json")));


Creo que deberías cambiar como sigue.

/*Response as default json format * example (http://localhost:9090/WebApp/api/user/) */ GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); /*Response as json format depend on request type * http://localhost:9090/WebApp/api/user/?type=json */ GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add( new QueryStringMapping("type", "json", new MediaTypeHeaderValue("application/json"))); /*Response as xml format depend on request type * http://localhost:9090/WebApp/api/user/?type=xml */ GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add( new QueryStringMapping("type", "xml", new MediaTypeHeaderValue("application/xml")));


Creo que Web API solo usa el primer formateador que puede encontrar en la colección de Formateadores. Puedes cambiar el orden con algo como

GlobalConfiguration.Configuration.Formatters.Clear(); GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter()); GlobalConfiguration.Configuration.Formatters.Add(new XmlMediaTypeFormatter());

Pero parece que el formateador JSON debe ser el primero por defecto, por lo que es posible que desee verificar si ya está modificando esta colección en alguna parte.


O simplemente elimine el XmlFormatter

var formatters = GlobalConfiguration.Configuration.Formatters; formatters.Remove(formatters.XmlFormatter);


Agregue esto en su App_Start/WebApiConfig.cs :

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));


Ninguna de las respuestas anteriores funcionó para mí. El problema era que estaba obteniendo los formateadores de GlobalConfiguration y no el objeto de config creado con la new HttpConfiguration() Aquí está el código que funciona para mí:

public class WebApiConfig { public static HttpConfiguration Register() { var config = new HttpConfiguration(); // This next line could stay if you want xml formatting config.Formatters.Remove(config.Formatters.XmlFormatter); // This next commented out line was causing the problem //var jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter; // This next line was the solution var jsonFormatter = config.Formatters.JsonFormatter; jsonFormatter.UseDataContractJsonSerializer = false; // defaults to false, but no harm done jsonFormatter.SerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat; jsonFormatter.SerializerSettings.Formatting = Formatting.None; jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); // remaining irrelevant code commented out return config; } }


config.EnableSystemDiagnosticsTracing(); GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); // Adding formatter for Json config.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("type", "json", new MediaTypeHeaderValue("application/json"))); // Adding formatter for XML config.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("type", "xml", new MediaTypeHeaderValue("application/xml")));