NSwag生成C#客户端处理IFormFile上传的两类问题
NSwag生成Blazor WASM客户端解决IFormFile上传及Header类型问题
问题1:避免拆分IFormFile为多个参数
有两种可行方案:
方案1:用DTO包装IFormFile
在API端定义包含IFormFile的模型类:
public class FileUploadRequest { public IFormFile Attachment { get; set; } // 可添加其他上传关联参数 }
修改控制器方法接收该DTO:
[HttpPost("upload")] public async Task<IActionResult> UploadFile([FromForm] FileUploadRequest request) { // 文件上传处理逻辑 }
重新生成客户端后,生成的方法会直接接收FileUploadRequest类型参数,无需拆分IFormFile的属性。
方案2:修改NSwag配置自动生成表单参数DTO
在nswag.json的cSharpClientGeneratorOptions中添加以下配置:
"cSharpClientGeneratorOptions": { // 其他已有配置... "generateFormParameterTypes": true, "formParametersAsDto": true }
开启后,NSwag会自动将包含IFormFile在内的表单参数打包为统一DTO类,生成的客户端方法将接收该DTO作为参数,避免手动拆分。
问题2:替换自定义IHeaderDictionary为通用类型
注意:Microsoft.AspNetCore.Http.IHeaderDictionary是服务器端ASP.NET Core专属类型,无法在Blazor WASM环境中直接使用,推荐通过NSwag配置替换为兼容客户端的通用类型:
方案1:使用Dictionary<string, string>
在nswag.json的cSharpClientGeneratorOptions中添加:
"cSharpClientGeneratorOptions": { // 其他已有配置... "headerDictionaryType": "System.Collections.Generic.Dictionary<string, string>" }
重新生成客户端后,所有需要Header参数的方法会使用Dictionary<string, string>类型,直接转换原有Header键值对传入即可:
var headers = new Dictionary<string, string> { ["X-Custom-Header"] = "example-value" }; await _apiClient.UploadFileAsync(request, headers);
方案2:使用跨平台的IHeaderDictionary
如果需要更贴近原有IHeaderDictionary的行为,可指定使用跨平台的Microsoft.Extensions.Primitives.IHeaderDictionary(需确保Blazor项目已引用Microsoft.Extensions.Primitives包):
"cSharpClientGeneratorOptions": { // 其他已有配置... "headerDictionaryType": "Microsoft.Extensions.Primitives.IHeaderDictionary" }
此时可通过HeaderDictionary实例传入参数:
var headers = new HeaderDictionary { ["X-Custom-Header"] = "example-value" }; await _apiClient.UploadFileAsync(request, headers);
内容的提问来源于stack exchange,提问作者kingua
相关产品推荐
相关产品推荐

