net core 3 AddXmlSerializerFormatters () настроить параметры - PullRequest
0 голосов
/ 20 февраля 2020

Приложение должно иметь возможность возвращать данные как в Json, так и в Xml, который работает. Однако приложение, которое взаимодействует с этим API, не поддерживает пространства имен в своем результате. <Item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

Ранее перед этой версией мне приходилось писать собственный xml serilaiser, чтобы сделать это для меня:

public static string Serialise<T>(T model) where T : class, new()
        {
            // Initalise the Xml writer with required settings.
            XmlWriterSettings settings = new XmlWriterSettings
            {
                OmitXmlDeclaration = true
            };
            // Set the namespaces accordingly.
            XmlSerializerNamespaces xmlNamespaceOverride = new XmlSerializerNamespaces();
            xmlNamespaceOverride.Add("", "");
            string xml = "";
            // Create a new string writer.
            using (StringWriter stringWriter = new StringWriter())
            {
                // And a new Xmlwriter.
                using (XmlWriter writer = XmlWriter.Create(stringWriter, settings))
                {
                    // Serialise the data.
                    new XmlSerializer(typeof(T)).Serialize(writer, model, xmlNamespaceOverride);
                    xml = stringWriter.ToString();
                }
            }
            return xml;
        }

Я использую .AddXmlSerializerFormatters (); однако при запуске создается пространство имен. Есть ли способ заставить net core 3 переопределить пространство имен в webapi без необходимости писать пользовательскую оболочку сериализатора?

Тестовый контроллер, который у меня есть, выглядит следующим образом:

[Area("Api")]
[Route("test")]
[FormatFilter]
[Produces("application/json", "application/xml")]
public class DeleteMeController : BaseController
{
    public DeleteMeController(SpApiDbContext spApiDbContext) : base(spApiDbContext) { }

    [Route("{format}/{responseType?}")]
    [HttpGet]
    public async Task<ActionResult<List<Item>>> DeleteMe(string format, string responseType = null)
    {
        try
        {
            return responseType switch
            {
                "badrequest" => BadRequest(),
                "error" => throw new Exception(),
                "notfound" => NotFound(),
                "nocontent" => null,
                _ => new List<Item>()
                {
                    Item.Empty(),
                    Item.Empty()
                },
            };
        }
        catch(Exception exception)
        {
            return await ExceptionResponse(exception, "TEST, please ignore.");
        }
    }
}

1 Ответ

2 голосов
/ 21 февраля 2020

Есть ли способ заставить net core 3 переопределить пространство имен в webapi, без необходимости писать специальную оболочку сериализатора?

По умолчанию такого способа не существует Сериализатор.

Вам необходимо создать собственный форматер сериализатора для xml, как показано ниже:

public class XmlSerializerOutputFormatterNamespace : XmlSerializerOutputFormatter
{
    protected override void Serialize(XmlSerializer xmlSerializer, XmlWriter xmlWriter, object value)
    {
        //applying "empty" namespace will produce no namespaces
        var emptyNamespaces = new XmlSerializerNamespaces();
        emptyNamespaces.Add("", "");
        xmlSerializer.Serialize(xmlWriter, value, emptyNamespaces);
    }
}

Startup.cs:

services.AddControllers(options =>
{
     options.OutputFormatters.Add(new XmlSerializerOutputFormatterNamespace());
}).AddXmlSerializerFormatters();
...