使用HttpClient.GetStreamAsync加载StreamContent报错,File.OpenRead正常
直接通过HttpClient.GetStreamAsync生成StreamContent上传PDF时出现连接关闭错误
我需要在两个Web服务之间传输PDF文件。最初通过await httpClient.GetStreamAsync(varPdfUrl)将文件下载到本地存储,再用File.OpenRead()读取流上传到目标服务(这部分代码已注释),但尝试直接用await httpClient.GetStreamAsync(varPdfUrl)生成StreamContent时,出现以下错误:
错误信息:
System.Net.Http.HttpRequestException: 复制内容到流时出错。
---> System.IO.IOException: 无法将数据写入传输连接:远程主机强迫关闭了一个现有的连接。
原始代码
var httpClient = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, uploadResponse.url); var content = new MultipartFormDataContent(); // 填充MultipartFormDataContent content.Add(new StringContent(uploadResponse.fields.key), "key"); content.Add(new StringContent(uploadResponse.fields.ContentType), "Content-Type"); // 添加文件流 string fileName = drawingTemp.ProjectNumber + "-" + drawingTemp.Title + ".pdf"; //string localPath = @"C:\... \CMP\Drawing Downloads\"; //var fileSteamLocalFile = new StreamContent(File.OpenRead(localPath + fileName)); //content.Add(fileSteamLocalFile, "file", fileName); var fileSteam = new StreamContent(await httpClient.GetStreamAsync(drawingTemp.PdfUrl)); content.Add(fileSteam, "file", fileName ); content.Add(new StringContent(uploadResponse.uuid), "uuid"); try { //上传文件到AWS request.Content = content; var responseUploadFileMsg = await httpClient.SendAsync(request); }
临时解决方案
目前通过将文件先写入项目文件夹wwwroot/Files,再用File.OpenRead()读取生成StreamContent的方式成功上传,但仍想了解直接用HttpClient.GetStreamAsync()生成StreamContent报错的原因。
对应代码:
var httpClient = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, uploadResponse.url); var content = new MultipartFormDataContent(); // 添加文件流 string fileName = drawingTemp.ProjectNumber + "-" + drawingTemp.Title + ".pdf"; Stream fileSteam = await httpClient.GetStreamAsync(drawingTemp.PdfUrl); // 将流转换为文件并临时保存到wwwroot/Files string writeFullPath = @"wwwroot\Files\" + fileName; if (!File.Exists(writeFullPath)) { using var fileLocalPath = File.Create(writeFullPath); { fileSteam.CopyTo(fileLocalPath); fileSteam.Dispose(); } } string readFullPath = Environment.CurrentDirectory + @"\wwwroot\Files\" + fileName; // 将文件流添加到内容中 var fileSteamLocalFile = new StreamContent(File.OpenRead(readFullPath)); content.Add(fileSteamLocalFile, "file", fileName); content.Add(new StringContent(uploadResponse.uuid), "uuid"); try { //上传文件到AWS request.Content = content; var responseUploadFileMsg = await httpClient.SendAsync(request); fileSteamLocalFile.Dispose(); // 删除临时文件 if (File.Exists(readFullPath)) { File.Delete(readFullPath); } }
内容的提问来源于stack exchange,提问作者Todd T
相关产品推荐
相关产品推荐

