NodeJS向C# WCF传输PDF文件异常:生成文件仅1KB
问题分析与解决方案
看起来你遇到的核心问题是NodeJS请求发送时没有正确生成带边界的multipart/form-data头部,导致WCF服务无法正确解析文件流,把整个multipart请求体(包括边界、文件头部信息)都当成了文件内容写入,最终生成的1KB文件就是这些额外信息。
为什么Insomnia正常,NodeJS不行?
Insomnia会自动为multipart/form-data请求生成包含边界值的Content-Type头部(比如multipart/form-data; boundary=----WebKitFormBoundaryxxxx),而你的NodeJS代码手动设置了Content-Type: multipart/form-data,覆盖了request模块自动生成的带边界的头部。WCF服务没有边界标识,就无法区分请求体中的文件部分和其他内容,只能把整个请求体当作文件流写入。
解决方案一:修复Request模块的请求代码
直接移除手动设置的Content-Type头部,让request模块自动生成正确的带边界的头部:
const formData2 = { file: fs.createReadStream(reportFile) }; request.post({ url: urlSend, // 确保urlSend已经包含arg1~arg5的URL参数,比如`http://your-wcf-host/uploadFileReport?arg1=xxx&arg2=xxx&arg3=xxx&arg4=xxx&arg5=report.pdf` formData: formData2, // 不要手动设置Content-Type!request会自动生成`multipart/form-data; boundary=xxx` }, function(error, response, body) { if (error) { console.error('请求失败:', error); return; } console.log('服务响应:', body); });
解决方案二:改用Axios发送请求(备选)
如果更倾向于使用Axios,需要借助form-data库来生成正确的请求头部:
const axios = require('axios'); const FormData = require('form-data'); const fs = require('fs'); const formData = new FormData(); formData.append('file', fs.createReadStream(reportFile)); axios.post(urlSend, formData, { headers: formData.getHeaders(), // 自动生成带边界的Content-Type头部 params: { // 这里可以直接传递arg1~arg5参数,Axios会自动拼接到URL上 arg1: 'your-value-1', arg2: 'your-value-2', arg3: 'your-value-3', arg4: 'your-value-4', arg5: 'custom-report.pdf' } }) .then(response => { console.log('服务响应:', response.data); }) .catch(error => { console.error('请求出错:', error); });
额外验证点
- 确认URL参数传递正确:WCF接口的
UriTemplate要求arg1~arg5作为URL参数传递,确保你的urlSend包含这些参数,或者在请求中通过params(Axios)/手动拼接(Request)传递。 - 对比请求头:可以用Charles或Fiddler抓包,对比Insomnia和NodeJS请求的Content-Type头部,确认NodeJS请求的头部包含
boundary标识。
内容的提问来源于stack exchange,提问作者CharlesXavier47
相关产品推荐
相关产品推荐

