Я создаю API в .NETCore (2.2.0), который должен поддерживать как XML, так и JSON. Для подавляющего большинства конечных точек он должен отвечать в XML по умолчанию, но с уважением относится к заголовку «Accept», который возвращает JSON, если клиент запрашивает его. Это работает.
Один контроллер является особым случаем в том смысле, что он должен поддерживать только JSON и имеет ответы, которые являются словарями. Запросы к этому контроллеру дают правильный ответ JSON, но в моих журналах я вижу исключение System.NotSupportedException, которое происходит от «Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerOutputFormatter.CreateSerializer»
Если я удалю свой код, который манипулирует порядком списка OutputFormatters, я не вижу исключения.
В файле startup.cs мой метод ConfigureServices содержит следующее:
services.AddMvc()
.AddXmlSerializerFormatters();
services.Configure<MvcOptions>(options =>
{
var outputFormatters = options.OutputFormatters;
var jsonOutputFormatter = outputFormatters.First(f => f is JsonOutputFormatter);
// Remove JSON output formatter and reappend at end to default to XML
outputFormatters.Remove(jsonOutputFormatter);
outputFormatters.Add(jsonOutputFormatter);
// Allow the client to request other content types (JSON)
options.RespectBrowserAcceptHeader = true;
});
Ошибка может быть воспроизведена с использованием следующего контроллера.
[Route("api/[controller]")]
[Produces("application/json")]
[ApiController]
public class ExampleController : ControllerBase
{
[HttpGet]
public IActionResult GetDict()
{
return Ok(new Dictionary<int, string>());
}
}
Следующее предупреждение / ошибка выдается, когда вызывается GET / api / Example, и это происходит, когда заголовок 'Accept' равен 'application / json' или не указан.
Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerOutputFormatter:Warning: An error occurred while trying to create an XmlSerializer for the type 'System.Collections.Generic.Dictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]'.
System.NotSupportedException: The type System.Collections.Generic.Dictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]] is not supported because it implements IDictionary.
at System.Xml.Serialization.TypeScope.GetDefaultIndexer(Type type, String memberInfo)
at System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference)
at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)
at System.Xml.Serialization.ModelScope.GetTypeModel(Type type, Boolean directReference)
at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type)
at Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerOutputFormatter.CreateSerializer(Type type)
Можно ли как-то предотвратить это предупреждение, но при этом сохранить желаемое поведение всех других контроллеров, отвечающих в XML по умолчанию?