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

如何在Azure Function C#中增大SignalR允许的最大文件大小

解决SignalR大文件传输失败的方案

针对你遇到的大文件传输失败、小文件正常的问题,可尝试以下几个方向排查解决:

1. 同步客户端与服务器的消息大小配置

服务器端调整了接收消息大小后,客户端必须对应配置,否则仍会触发限制:

.NET客户端示例

var connection = new HubConnectionBuilder()
    .WithUrl("你的Hub地址", options =>
    {
        // 设置HttpClient的响应缓存大小
        options.HttpMessageHandlerFactory = handler =>
        {
            if (handler is HttpClientHandler clientHandler)
                clientHandler.MaxResponseContentBufferSize = 1024 * 1024 * 50; // 50MB,按需调整
            return handler;
        };
        // 设置SignalR客户端最大接收消息大小
        options.MaximumReceiveMessageSize = 1024 * 1024 * 50;
    })
    .Build();

2. 调整服务器端WebSocket全局限制

如果使用IIS托管,需要在web.config中增加WebSocket的缓冲区限制:

<system.webServer>
    <webSocket enabled="true" receiveBufferLimit="10485760" /> <!-- 10MB,根据文件大小调整 -->
</system.webServer>

3. 解除ASP.NET Core请求大小限制

ASP.NET Core默认有请求大小限制,需在管道中配置:

// Program.cs中添加
app.Use(async (context, next) =>
{
    var sizeFeature = context.Features.Get<IHttpMaxRequestBodySizeFeature>();
    if (sizeFeature != null)
    {
        sizeFeature.MaxRequestBodySize = null; // 无限制,或设置具体值如1024*1024*50
    }
    await next();
});

也可直接在Hub类上添加特性:

[RequestSizeLimit(1024 * 1024 * 50)] // 允许50MB请求
public class FileTransferHub : Hub
{
    // Hub方法实现
}

4. 改用分块传输方案

SignalR并非为大文件传输设计,最可靠的方式是将大文件拆分为小块(如1MB/块),分批次传输后再拼接:

服务器端Hub方法

public async Task UploadFileChunk(string fileName, int chunkIndex, byte[] chunkData, int totalChunks)
{
    // 临时保存分块,例如写入临时目录
    var tempPath = Path.Combine(Path.GetTempPath(), fileName, $"{chunkIndex}.chunk");
    Directory.CreateDirectory(Path.GetDirectoryName(tempPath));
    await File.WriteAllBytesAsync(tempPath, chunkData);

    // 检查是否所有分块已上传,若完成则合并文件
    if (chunkIndex == totalChunks - 1)
    {
        var finalPath = Path.Combine("你的存储目录", fileName);
        using (var finalStream = new FileStream(finalPath, FileMode.Create))
        {
            for (int i = 0; i < totalChunks; i++)
            {
                var chunkPath = Path.Combine(Path.GetTempPath(), fileName, $"{i}.chunk");
                using (var chunkStream = new FileStream(chunkPath, FileMode.Open))
                {
                    await chunkStream.CopyToAsync(finalStream);
                }
                File.Delete(chunkPath);
            }
        }
        Directory.Delete(Path.Combine(Path.GetTempPath(), fileName));
    }
}

客户端传输逻辑

using (var fileStream = new FileStream("待上传的大文件路径", FileMode.Open))
{
    var chunkSize = 1024 * 1024; // 1MB每块
    var buffer = new byte[chunkSize];
    int bytesRead;
    int chunkIndex = 0;
    var totalChunks = (int)Math.Ceiling((double)fileStream.Length / chunkSize);

    while ((bytesRead = await fileStream.ReadAsync(buffer, 0, chunkSize)) > 0)
    {
        var chunkData = new byte[bytesRead];
        Array.Copy(buffer, chunkData, bytesRead);
        await connection.InvokeAsync("UploadFileChunk", "目标文件名", chunkIndex, chunkData, totalChunks);
        chunkIndex++;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:25:07