varias tenga solicitud solicitado recurso que público parámetros ningún net método multiple maphttproute encontraron encontrado controlador con coincidían coinciden coincida asp asegúrese admite acciones c# asp.net-web-api json.net

c# - tenga - API web: configure los ajustes del serializador JSON en el nivel de acción o controlador



se encontraron varias acciones que coincidían con la solicitud post (2)

Opción 1 (la más rápida)

En el nivel de acción, siempre puede usar una instancia personalizada de JsonSerializerSettings mientras usa el método Json :

public class MyController : ApiController { public IHttpActionResult Get() { var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var model = new MyModel(); return Json(model, settings); } }

Opción 2 (nivel de controlador)

Puede crear un nuevo atributo IControllerConfiguration que personaliza el JsonFormatter:

public class CustomJsonAttribute : Attribute, IControllerConfiguration { public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor) { var formatter = controllerSettings.Formatters.JsonFormatter; controllerSettings.Formatters.Remove(formatter); formatter = new JsonMediaTypeFormatter { SerializerSettings = { ContractResolver = new CamelCasePropertyNamesContractResolver() } }; controllerSettings.Formatters.Insert(0, formatter); } } [CustomJson] public class MyController : ApiController { public IHttpActionResult Get() { var model = new MyModel(); return Ok(model); } }

La anulación de la configuración predeterminada del serializador JSON para la API web en el nivel de aplicación se ha cubierto en muchos subprocesos SO. ¿Pero cómo puedo configurar sus ajustes en el nivel de acción? Por ejemplo, podría querer serializar el uso de las propiedades de camelcase en una de mis acciones, pero no en las demás.


Aquí hay una implementación de lo anterior como atributo de acción:

public class CustomActionJsonFormatAttribute : ActionFilterAttribute { public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { if (actionExecutedContext?.Response == null) return; var content = actionExecutedContext.Response.Content as ObjectContent; if (content?.Formatter is JsonMediaTypeFormatter) { var formatter = new JsonMediaTypeFormatter { SerializerSettings = { ContractResolver = new CamelCasePropertyNamesContractResolver() } }; actionExecutedContext.Response.Content = new ObjectContent(content.ObjectType, content.Value, formatter); } } } public class MyController : ApiController { [CustomActionJsonFormat] public IHttpActionResult Get() { var model = new MyModel(); return Ok(model); } }