You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:22:23