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

使用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;

三、部署环境额外配置检查

  1. IIS请求大小限制:若传输的二进制数据较大,需修改站点的web.config,提升允许的请求长度:
<system.webServer>
  <security>
    <requestFiltering>
      <!-- 设置为1GB,可根据实际需求调整 -->
      <requestLimits maxAllowedContentLength="1073741824" />
    </requestFiltering>
  </security>
</system.webServer>
  1. 应用池权限:确保服务器上C:\WordAutomation\目录的写入权限已授予API应用池的身份(如IIS AppPool\你的应用池名称)。

  2. .NET Core请求配置:在API的Program.cs中添加请求大小限制配置(针对大文件场景):

builder.Services.Configure<Microsoft.AspNetCore.Http.Features.FormOptions>(options =>
{
    options.MultipartBodyLengthLimit = 1073741824; // 1GB
});

内容的提问来源于stack exchange,提问作者Ra_g

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:55:21