Почему сериализатор XML создается при сериализации в JSON? - PullRequest
0 голосов
/ 04 июня 2019

Я создаю 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 по умолчанию?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...