SignalR.Orleans在app.UseSignalR中导致错误

问题描述 投票:2回答:1

我正在尝试使用这个库https://github.com/OrleansContrib/SignalR.Orleans将SignalR与MS Orleans背板一起使用 当我将.AddOrleans()添加到AddSignalR()时,就像自述文件中的指令一样,但它会在Configure中的UseSignalR()代码中导致此错误:

尝试激活'SignalR.Orleans.DefaultClusterClientProvider'时,无法解析类型'Orleans.IClusterClient'的服务。

ConfigureServices:

public void ConfigureServices(IServiceCollection services)
    {            
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        services.AddSignalR().AddOrleans();
    }

配置:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }
        app.UseAuthentication();
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseSignalR(routes =>
        {
            routes.MapHub<Hubs.MainHub>("/main");
        });// this code work if I remove AddOrleans in ConfigureServices
        app.UseMvc();
    }

在检查库代码时,AddOrleans函数代码是这样的:

public static ISignalRBuilder AddOrleans(this ISignalRBuilder builder, IClusterClientProvider clientProvider = null)
    {
        if (clientProvider != null)
            builder.Services.AddSingleton(clientProvider);
        else
            builder.Services.TryAddSingleton<IClusterClientProvider, DefaultClusterClientProvider>();

        builder.Services.AddSingleton(typeof(HubLifetimeManager<>), typeof(OrleansHubLifetimeManager<>));
        return builder;
    }

我仍然不知道为什么它不起作用,因为依赖注入对我来说有点新鲜。

signalr orleans
1个回答
0
投票

DefaultClusterClientProvider构造函数需要一个IClusterClient实例。您收到的例外情况表明IClusterClient实例未在DI容器中注册。

您发布的示例代码似乎不会实例化群集客户端。您可能需要添加如下内容:

public void ConfigureServices(IServiceCollection services)
{            
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddSignalR().AddOrleans();

    var client = new ClientBuilder()
        ... // other client configuration options here
        .UseSignalR()
        .Build();
    services.AddSingleton<IClusterClient>(client);
}

除了其他对象(如ASP.NET核心控制器)之外,单例注册应使集群客户端可用于DefaultClusterClientProvider构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.