使用C# HttpClient向.NET Core Web API传输byte[]失败求助
问题分析与解决建议
开发环境正常但部署后API无法接收byte[],核心原因是**.NET Core模型绑定对application/octet-stream类型的二进制数据处理逻辑,在部署环境下(如IIS)存在兼容性问题**,加上客户端重复设置请求头导致潜在冲突。以下是具体调整方案:
一、修改API端接收逻辑(核心修复)
放弃使用[FromBody]byte[]的模型绑定方式,直接读取请求体流——[FromBody]主要针对JSON/XML等结构化序列化数据,对二进制流的支持有限。调整后的API代码:
[Route("UploadFiles")] [HttpPost] public async Task<ActionResult> PostDataHello(string filePath) { try { // 读取请求体二进制流 using var memoryStream = new MemoryStream(); await Request.Body.CopyToAsync(memoryStream); byte[] rawData = memoryStream.ToArray(); // 校验是否接收到有效数据 if (rawData.Length == 0) { return BadRequest("未接收到二进制数据"); } System.IO.File.WriteAllBytes(@"C:\WordAutomation\home.zip", rawData); return Ok(); } catch (Exception ex) { return StatusCode(500, $"错误信息: {ex.Message}"); } }
二、优化客户端请求代码
移除全局请求头中的Content-Type设置,避免与ByteArrayContent自身的Content-Type冲突:
HttpClientHandler clientHandler = new HttpClientHandler(); clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; }; clientHandler.UseDefaultCredentials = true; // 建议复用HttpClient(避免频繁创建销毁) HttpClient client2 = new HttpClient(clientHandler); client2.DefaultRequestHeaders.Clear(); client2.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "application/octet-stream"); client2.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); // 仅通过ByteArrayContent设置Content-Type,无需全局重复设置 var content = new ByteArrayContent(fileData); content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); var response = client2.PostAsync("https://mywebsite.com/api/FileHandlingAPI/UploadFiles?filePath=abc", content).Result;
三、部署环境额外配置检查
- IIS请求大小限制:若传输的二进制数据较大,需修改站点的
web.config,提升允许的请求长度:
<system.webServer> <security> <requestFiltering> <!-- 设置为1GB,可根据实际需求调整 --> <requestLimits maxAllowedContentLength="1073741824" /> </requestFiltering> </security> </system.webServer>
应用池权限:确保服务器上
C:\WordAutomation\目录的写入权限已授予API应用池的身份(如IIS AppPool\你的应用池名称)。.NET Core请求配置:在API的
Program.cs中添加请求大小限制配置(针对大文件场景):
builder.Services.Configure<Microsoft.AspNetCore.Http.Features.FormOptions>(options => { options.MultipartBodyLengthLimit = 1073741824; // 1GB });
内容的提问来源于stack exchange,提问作者Ra_g
相关产品推荐
相关产品推荐

