.NET Core 3.0 Web API客户端如何引入非显式序列化类型?
解决方法
1. 用共享类库统一管理报表类型
这是最省心的方案:
- 新建一个.NET Standard或者.NET Core类库,把
ReportTypeBase、MyReportType所有报表相关类型都放到这个类库里 - 服务器端项目和客户端项目都引用这个类库
- 客户端直接就能用这些类型反序列化返回的JSON字符串,完全不用依赖Web API生成的客户端来传递类型,10+种报表类型也能轻松维护
2. 强制API客户端包含指定类型
如果不想拆分共享类库,试试这两种方式:
- 给基类加KnownType特性:在服务器端的
ReportTypeBase上用[KnownType]声明所有派生的报表类型,同时把端点返回类型从string改成Task<ReportTypeBase>:
这样Swagger/OpenAPI会自动包含所有声明的已知类型,生成的客户端就会带上这些报表类型,客户端调用时可以直接转成具体类型,或者用[KnownType(typeof(MyReportType))] [KnownType(typeof(AnotherReportType))] // 其他报表类型也加上 public class ReportTypeBase { // 基类原有属性 } // 修改后的端点 public async Task<ReportTypeBase> GetReportDataAsync(Guid reportType, long id) { // 内部逻辑:根据reportType生成对应报表实例,填充数据后返回 var report = await _reportGenerator.CreateReport(reportType, id); return report; }JsonConvert.DeserializeObject<MyReportType>处理。 - 手动补充OpenAPI文档:如果不想改端点返回类型,可以在OpenAPI文档里手动添加这些报表类型的定义,再用修改后的文档生成客户端。不过这种方式需要手动维护文档,不如前一种方便。
3. 泛型端点优化(可选)
如果后续报表类型还会增加,可以考虑泛型端点,减少重复代码:
public async Task<T> GetReportDataAsync<T>(long id) where T : ReportTypeBase, new() { return await _reportService.GenerateReport<T>(id); }
不过要注意.NET Web API对泛型端点的支持,需要配合Swagger配置来生成正确的客户端代码,或者通过路由参数来指定报表类型。
内容的提问来源于stack exchange,提问作者cmur
相关产品推荐
相关产品推荐

