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

如何解决.NET6 SignalR Azure函数迁移至.NET8隔离进程的适配问题?

.NET8隔离进程Azure Functions SignalR迁移:自定义UserId的Negotiate实现

在从.NET6进程内模型迁移到.NET8隔离进程模型时,原有的IBinder绑定SignalRConnectionInfo的方式不再适用,且如果你的用户ID(比如email)无法通过默认的绑定表达式(如{headers.x-ms-client-principal-id})获取,可通过以下方式解决:

解决方案:手动生成SignalR连接信息

通过注入ISignalRServiceClient,手动调用SignalR服务API生成包含自定义UserId的连接信息,完全控制用户标识的来源。

步骤1:安装依赖包

确保项目引用隔离进程专用的SignalR扩展包:

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.SignalRService

步骤2:修改Negotiate函数实现

注入ISignalRServiceClient到函数类,在验证令牌并提取email后,手动生成连接信息:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Mvc;

public class SignalRFunctions
{
    private readonly ITokenValidation _validation;
    private readonly ISignalRServiceClient _signalRClient;
    private readonly ILogger<SignalRFunctions> _logger;

    // 通过构造函数注入依赖
    public SignalRFunctions(ITokenValidation validation, ISignalRServiceClient signalRClient, ILogger<SignalRFunctions> logger)
    {
        _validation = validation;
        _signalRClient = signalRClient;
        _logger = logger;
    }

    [Function("negotiate")]    
    public async Task<IActionResult> Negotiate(
        [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req
    )
    {
        // 保留原有令牌验证与邮箱提取逻辑
        AuthenticationResult result = await _validation.ValidateTokenAsync(req);
        string? email = req.TryGetEmail(_logger);

        if (result.IsInvalid() || string.IsNullOrEmpty(email))
        {
            return new UnauthorizedResult();
        }

        // 手动生成带自定义UserId的SignalR连接信息
        var connectionInfo = await _signalRClient.GetConnectionInfoAsync(
            hubName: HikyakuConstants.DefaultHubName,
            userId: email
        );

        return new OkObjectResult(connectionInfo);
    }
}

关键说明

  • 隔离进程模型中,ISignalRServiceClient是官方推荐的IBinder替代方案,支持完全自定义连接信息生成逻辑。
  • 确保函数应用配置中已正确设置AzureSignalRConnectionString,指向你的Azure SignalR服务实例。
  • 若你仍在使用兼容层的HttpRequest而非HttpRequestData,可调整请求内容提取逻辑以匹配现有代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:07:37