public static void ConfigureFormatter(this TextInputFormatter formatter, Encoding[] encodings) { if (formatter == null) { throw new ArgumentNullException(nameof(formatter)); } if (encodings == null) { throw new ArgumentNullException(nameof(encodings)); } formatter.SupportedMediaTypes.Add(YamlHeadersMediaType.Application); formatter.SupportedMediaTypes.Add(YamlHeadersMediaType.Text); foreach (var encoding in encodings) { formatter.SupportedEncodings.Add(encoding); } }
public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding) { var mvcOpt= context.HttpContext.RequestServices.GetRequiredService<IOptions<MvcOptions>>().Value; var formatters = mvcOpt.InputFormatters; TextInputFormatter formatter =null; // the real formatter : SystemTextJsonInput or Newtonsoft Endpoint endpoint = context.HttpContext.GetEndpoint(); if(endpoint.Metadata.GetMetadata<UseSystemTextJsonAttribute>()!= null) { formatter= formatters.OfType<SystemTextJsonInputFormatter>().FirstOrDefault(); //formatter = formatter ?? SystemTextJsonInputFormatter } else if( endpoint.Metadata.GetMetadata<UseNewtonsoftJsonAttribute>() != null){ // don't use `Of<NewtonsoftJsonInputFormatter>` here because there's a NewtonsoftJsonPatchInputFormatter formatter= (NewtonsoftJsonInputFormatter)(formatters .Where(f =>typeof(NewtonsoftJsonInputFormatter) == f.GetType()) .FirstOrDefault()); } else{ throw new Exception("This formatter is only used for System.Text.Json InputFormatter or NewtonsoftJson InputFormatter"); } var result = await formatter.ReadRequestBodyAsync(context,encoding); return result; }