ASP.NET Core中是否可以为单个控制器启用XmlSerialization

问题描述 投票:0回答:4

我有一个 Web API,它有多个控制器,其中一个由于遗留原因返回 XML,而所有其他控制器都返回 JSON。

在 .NET Framework 中,我可以通过访问

HttpControllerSettings.Formatters
(通常在用于装饰控制器的属性中)有选择地为单个控制器启用 XML 序列化。

是否可以在 ASP.NET Core 中执行相同的操作,即仅为单个控制器启用 Xml 序列化?

我发现在 ASP.NET Core 2.1 中启用 Xml 序列化的唯一方法是全局使用:

services.AddMvc()
     .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
     .AddXmlSerializerFormatters();

这工作正常,但有一个我认为不受欢迎的副作用:当我在 Visual Studio 中运行应用程序时,我看到来自

XmlSerializerOutputFormatter
的警告痕迹,例如:

Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerOutputFormatter:Warning: An error occurred while trying to create an XmlSerializer for the type 'MyApp.MyModel'.

System.InvalidOperationException: There was an error reflecting type 'MyApp.MyModel'. ---> System.InvalidOperationException: Cannot serialize member ... see inner exception for more details. ---> System.NotSupportedException: Cannot serialize ... because it is an interface.
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.StructModel.CheckSupportedMember(TypeDesc typeDesc, MemberInfo member, Type type)
   ...
   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”控制器未使用的类型创建

XmlSerializer

虽然它不是一个令人惊叹的东西,但我宁愿不创建 XmlSerializers,除非我需要它们。

asp.net-core asp.net-core-2.1 xmlserializer
4个回答
4
投票

我也遇到过同样的问题。我不认为目前有解决方案,因此我在 Github 项目上创建了 功能请求

与此同时,我已经设定了

"Logging": { 
    "LogLevel": {
        "Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerOutputFormatter":  "Error"
    }
}

抑制启动期间的警告。


0
投票

我遇到了同样的问题。然后我更改了代码:

builder.Services.AddControllers().AddNewtonsoftJson().AddXmlSerializerFormatters();

你可以看看这个,我希望它对你有帮助。


0
投票

我也有同样的问题。

通过在导致问题的操作上将 Produces 属性设置为 application/json 来解决。

[HttpGet]
[Route("yourroute")]
[Produces("application/json")]
public async Task<IActionResult<Whatever> GetSomething() {

0
投票

没有“内置”方法可以做到这一点,除非通过

FileContentResult
或类似方式手动序列化和返回。但是,您可以添加“标记”类和专门处理标记类的格式化程序。

步骤是:

  1. 定义一个标记包装结构,它包装要序列化/反序列化的值。
    实现示例
  2. 定义一个
    TextInputFormatter
    /
    TextOutputFormatter
    ,使用
    XmlSerializable
    读取/写入标记类。
    MSDN 指南输入实现示例输出实现示例
  3. MvcOptions
    中将格式化程序注册到列表中早于DCS的位置。
    实现示例
  4. 可选:将
    JsonConverter
    添加到标记类以使其对 JSON 不可见

此方法的实现可在 Rmg.AspNetCore.ByXmlSerializerNuget,MIT 许可)中找到。 使用示例

// Add Nuget reference to Rmg.AspNetCore.ByXmlSerializer

// in Program.cs
builder.Services.AddControllers()
    .AddByXmlSerializerFormatters()
    .AddXmlDataContractSerializerFormatters();

// in controller
[HttpGet("xs")]
public ByXmlSerializer<WeatherForecast[]> GetWeatherForecastXmlSerializer()
{
    WeatherForecast[] result = /* ... */;
    return result;
}

// or for input
[HttpPost("postxs")]
public void PostWeatherForecastXs([FromBody] ByXmlSerializer<ForecastArea> area)
{
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.