如何为ASP.Net Boilerplate添加XML输出格式化器?需修改哪个项目?
解决ASP.NET Core + ABP中API同时支持JSON和XML输出的问题
首先明确:你需要修改RootNs.Web.Host项目的Startup.cs,而不是Web.Mvc项目。因为Web.Host是ABP架构中专门承载API服务的宿主项目,你的API请求实际是发送到Web.Host的,Web.Mvc主要负责MVC视图渲染,所以之前在Web.Mvc里的配置不会对API生效。
接下来是具体的配置步骤,结合ABP 4.x和ASP.NET Core 2.2的特性:
1. 在Web.Host的ConfigureServices中配置格式化器
找到ConfigureServices方法里的AddMvc配置块,添加XML输入/输出格式化器,同时保留ABP默认的JSON配置:
public IServiceProvider ConfigureServices(IServiceCollection services) { // ... 保留其他ABP初始化代码 ... services.AddMvc(options => { // 启用Accept请求头识别,当客户端请求的格式不被支持时返回406 Not Acceptable options.RespectBrowserAcceptHeader = true; options.ReturnHttpNotAcceptable = true; // 移除HttpNoContentOutputFormatter,避免接口返回204时自动清空响应内容 options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>(); // 添加XML输出格式化器,二选一即可(根据你的序列化需求) // 选项1:使用XmlSerializer options.OutputFormatters.Add(new XmlSerializerOutputFormatter()); // 选项2:使用DataContractSerializer(适合复杂类型或需要DataContract特性的场景) // options.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter()); // 添加XML输入格式化器,支持接收XML格式的请求体 options.InputFormatters.Add(new XmlSerializerInputFormatter(options)); // options.InputFormatters.Add(new XmlDataContractSerializerInputFormatter(options)); // 配置URL参数映射,允许通过?format=xml或?format=json指定响应格式 options.FormatterMappings .SetMediaTypeMappingForFormat("xml", MediaTypeHeaderValue.Parse("application/xml")) .SetMediaTypeMappingForFormat("json", MediaTypeHeaderValue.Parse("application/json")); }) .AddJsonOptions(options => { // 保留ABP默认的JSON序列化配置(比如驼峰命名、忽略空值等) options.SerializerSettings.ContractResolver = new AbpContractResolver(); }); // ... 保留其他服务配置代码 ... }
2. 测试XML输出
配置完成后,不需要给API方法添加FormatFilter特性,通过以下两种方式即可触发XML响应:
- 方式1:设置请求头:在请求中添加
Accept: application/xml头,接口会返回XML格式的响应。 - 方式2:URL参数:在API地址后追加
?format=xml,比如/api/your-controller/your-action?format=xml。
为什么之前的配置没生效?
你之前修改Web.Mvc的Startup.cs是无效的,因为ABP的Web.Mvc项目主要负责处理MVC视图(比如Razor页面、HTML响应),而你的API接口是部署在Web.Host项目中的,所有API请求都会路由到Web.Host,自然Web.Mvc的格式化器配置不会影响API的响应格式。
内容的提问来源于stack exchange,提问作者XelaNimed
相关产品推荐
相关产品推荐

