如何调试带参数和CSV文件的HTTP触发型Azure Function
解决方案
问题根因
你当前的报错源于代码逻辑直接将完整HTTP请求体作为JSON格式反序列化,但传输带文件的请求时,请求体为multipart/form-data(表单格式)或二进制流,不符合JSON格式要求,因此反序列化直接抛出异常。
相关配置截图:
步骤1:调整Azure Function请求解析逻辑
替换原直接读取全量请求体反序列化的逻辑,改为先解析多部分表单内容,分别提取参数和文件,参考代码如下:
public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log) { // 优先从Query中读取两个参数,兼容原有GET请求逻辑 string name = req.Query["name"]; string source = req.Query["source"]; // 处理带文件的表单请求 if (req.ContentType.StartsWith("multipart/form-data")) { var formCollection = await req.ReadFormAsync(); // 兼容参数放在表单内的场景 name ??= formCollection["name"]; source ??= formCollection["source"]; // 读取CSV文件附件,key需和Postman/Logic App配置的文件key一致 var csvFile = formCollection.Files.GetFile("csv_file"); if (csvFile != null && csvFile.Length > 0) { using var streamReader = new StreamReader(csvFile.OpenReadStream()); string csvContent = await streamReader.ReadToEndAsync(); // 此处添加你的CSV处理逻辑 } } // 保留原有纯JSON请求逻辑,兼容其他调用场景 else if (req.ContentType == "application/json") { string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); dynamic data = JsonConvert.DeserializeObject(requestBody); name ??= data?.name; source ??= data?.source; } // 后续业务逻辑 return new OkObjectResult($"参数name:{name}, source:{source},文件读取完成"); }
步骤2:Postman调试请求配置
- 请求方法选
POST,地址填本地调试地址http://localhost:7071/api/TradematchHttpFunctions - 两种传参方式二选一,和你Logic App的传参逻辑对齐即可:
- 方式一:在Params栏直接填写
name、source两个参数和对应值,参数会自动拼接在URL查询串中 - 方式二:在Body的form-data中添加两个
Text类型字段,key分别为name、source,填写对应值
- 方式一:在Params栏直接填写
- Body区选择
form-data,添加文件字段:- 新建字段key填写你代码中约定的文件标识(比如上述示例的
csv_file),鼠标悬浮在key输入框右侧,下拉选择「File」类型 - 在Value栏点击「Select Files」,选择本地待上传的CSV文件
- 新建字段key填写你代码中约定的文件标识(比如上述示例的
- 点击发送即可正常触发函数调试,不会再出现JSON反序列化报错。
步骤3:对齐Logic App调用配置
要保证线上Logic App调用正常,只需确认Logic App的HTTP动作配置:
- 请求方法选
POST - 参数按你实际需求配置在URL查询串或者表单字段中
- 文件上传部分选择
multipart/form-data格式,文件的key和你函数代码中的读取key保持一致即可
内容的提问来源于stack exchange,提问作者solarissf
相关产品推荐
相关产品推荐

