我有一个 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,除非我需要它们。
我也遇到过同样的问题。我不认为目前有解决方案,因此我在 Github 项目上创建了 功能请求。
与此同时,我已经设定了
"Logging": {
"LogLevel": {
"Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerOutputFormatter": "Error"
}
}
抑制启动期间的警告。
我遇到了同样的问题。然后我更改了代码:
builder.Services.AddControllers().AddNewtonsoftJson().AddXmlSerializerFormatters();
你可以看看这个,我希望它对你有帮助。
我也有同样的问题。
通过在导致问题的操作上将 Produces 属性设置为 application/json 来解决。
[HttpGet]
[Route("yourroute")]
[Produces("application/json")]
public async Task<IActionResult<Whatever> GetSomething() {
没有“内置”方法可以做到这一点,除非通过
FileContentResult
或类似方式手动序列化和返回。但是,您可以添加“标记”类和专门处理标记类的格式化程序。
步骤是:
TextInputFormatter
/TextOutputFormatter
,使用 XmlSerializable
读取/写入标记类。 MvcOptions
中将格式化程序注册到列表中早于DCS的位置。 JsonConverter
添加到标记类以使其对 JSON 不可见此方法的实现可在 Rmg.AspNetCore.ByXmlSerializer(Nuget,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)
{
// ...
}