Asp.net core 我的AspnetCore应用程序不通过信号器从.net core控制台应用程序接收发布

Asp.net core 我的AspnetCore应用程序不通过信号器从.net core控制台应用程序接收发布,asp.net-core,.net-core,signalr,Asp.net Core,.net Core,Signalr,我的AspnetCore应用程序不通过信号器从.net core控制台应用程序接收发布 我有一个包含信号集线器的aspnet core 2.1 web应用程序 我需要制作一个.NETCore2.1控制台应用程序,将信息发送到web系统上的中心 我在这里做了一个开发,但是当我运行我的控制台应用程序时,没有出现异常,但是我的web应用程序没有收到信息 看看我到目前为止做了什么 Aspnet核心2.1 public class Startup { public Startup(

我的AspnetCore应用程序不通过信号器从.net core控制台应用程序接收发布

我有一个包含信号集线器的aspnet core 2.1 web应用程序

我需要制作一个.NETCore2.1控制台应用程序,将信息发送到web系统上的中心

我在这里做了一个开发,但是当我运行我的控制台应用程序时,没有出现异常,但是我的web应用程序没有收到信息

看看我到目前为止做了什么

Aspnet核心2.1

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDistributedMemoryCache();
            services.AddSession();
            services.Configure<CookiePolicyOptions>(options =>
            {
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddSignalR();
            services.AddMvc(
                    config => {
                    var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
                    config.Filters.Add(new AuthorizeFilter(policy));
                }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            services.AddAuthentication(options =>
            {
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            }).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
                options =>
                {
                    options.ExpireTimeSpan = TimeSpan.FromDays(1);
                    options.LoginPath = "/Home/Login";
                    options.LogoutPath = "/Usuario/Logout";
                    options.SlidingExpiration = true;
                });
            //provedor postgresql
            services.AddEntityFrameworkNpgsql()
             .AddDbContext<MesContext>(options => 
             options.UseNpgsql(Configuration.GetConnectionString("MesContext")));

            services.AddScoped<SeedingService>();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, SeedingService seedingService)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }
            seedingService.Seed();
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseAuthentication();
            app.UseSession();
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
            
            app.UseSignalR(routes =>
            {
                routes.MapHub<MesHub>("/MesHub");
            });
        }
    }
枢纽

公共类MesHub:Hub
{
公共静态ConcurrentDictionary ConnectedUsers=新ConcurrentDictionary();
公共无效SendAsync(字符串消息)
{
//在所有客户端上调用addMessage方法
Clients.All.SendAsync(“teste”,true,message);
}
公共覆盖任务OnConnectedAsync()
{
字符串名称=Context.User.Identity.name;
AddToGroupAsync(Context.ConnectionId,name);
返回base.OnConnectedAsync();
}
}
控制台应用

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Teste Renan!");

            var url = "https://localhost:44323/meshub";

            var connection = new HubConnectionBuilder()
                .WithUrl($"{url}")
                .WithAutomaticReconnect() //I don't think this is totally required, but can't hurt either
                .Build();

            var t = connection.StartAsync();
            Console.WriteLine("conected!");
            //Wait for the connection to complete
            t.Wait();

            Console.WriteLine(connection.State);
            

            //connection.SendAsync("SendAsync", "renan");

            connection.InvokeAsync<string>("SendAsync", "HELLO World ").ContinueWith(task => {
                if (task.IsFaulted)
                {
                    Console.WriteLine("There was an error calling send: {0}",
                                      task.Exception.GetBaseException());
                }
                else
                {
                    Console.WriteLine(task.Result);
                }
            });
            Console.WriteLine("enviado!"); 
}
}
类程序
{
静态void Main(字符串[]参数)
{
控制台。WriteLine(“Teste Renan!”);
变量url=”https://localhost:44323/meshub";
var connection=new HubConnectionBuilder()
.WithUrl($“{url}”)
.WithAutomaticReconnect()//我不认为这完全是必需的,但也不会有什么坏处
.Build();
var t=connection.StartAsync();
Console.WriteLine(“conconnected!”);
//等待连接完成
t、 等待();
Console.WriteLine(connection.State);
//SendAsync(“SendAsync”、“renan”);
connection.InvokeAsync(“SendAsync”,“HELLO World”).ContinueWith(任务=>{
if(task.IsFaulted)
{
WriteLine(“调用send:{0}时出错”,
task.Exception.GetBaseException());
}
其他的
{
Console.WriteLine(task.Result);
}
});
Console.WriteLine(“enviado!”);
}
}
在控制台应用程序中,我添加了Microsoft.aspnetCore.SignalR.Client包

Signalr在aspnet核心web系统中运行良好,因为它不从外部接收信息


我忘了什么?我做错了什么?

我定义了相同的hub方法,并进行了一个测试,从控制台客户端调用它,该方法按预期工作

此外,我用我的信号器控制台客户端应用程序测试了它,它也工作得很好。如果可能,您可以测试它并检查它是否适合您

static void Main(字符串[]args)
{
Console.WriteLine(“客户端应用程序启动…”);
程序p=新程序();
p、 Myfunc().Wait();
Console.ReadLine();
}
公共异步任务Myfunc()
{
HubConnection=新的HubConnectionBuilder()
.WithUrl(“https://localhost:44323/meshub") 
.Build();
connection.Closed+=异步(错误)=>
{
等待任务。延迟(新随机()。下一个(0,5)*1000);
等待连接。StartAsync();
};
等待连接。StartAsync();
尝试
{
等待连接;
//等待连接。调用Easync(“发送消息”、“控制台应用程序”、“测试mes”);
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
}
测试结果

更新:

在我的集线器中,我有一个OnConnectedAsync方法,其中通知组的名称

您可以尝试如下更新
OnConnectedAsync
方法,然后检查您的SignalR console客户端应用程序是否可以连接到hub并与web客户端良好通信

public override async Task OnConnectedAsync()
{
    string name = Context.User.Identity.Name;

    if (name != null)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, name);
    }

    await base.OnConnectedAsync();
}

我定义了同一个hub方法,并做了一个测试,从控制台客户端调用它,该客户端按预期工作

此外,我用我的信号器控制台客户端应用程序测试了它,它也工作得很好。如果可能,您可以测试它并检查它是否适合您

static void Main(字符串[]args)
{
Console.WriteLine(“客户端应用程序启动…”);
程序p=新程序();
p、 Myfunc().Wait();
Console.ReadLine();
}
公共异步任务Myfunc()
{
HubConnection=新的HubConnectionBuilder()
.WithUrl(“https://localhost:44323/meshub") 
.Build();
connection.Closed+=异步(错误)=>
{
等待任务。延迟(新随机()。下一个(0,5)*1000);
等待连接。StartAsync();
};
等待连接。StartAsync();
尝试
{
等待连接;
//等待连接。调用Easync(“发送消息”、“控制台应用程序”、“测试mes”);
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
}
测试结果

更新:

在我的集线器中,我有一个OnConnectedAsync方法,其中通知组的名称

您可以尝试如下更新
OnConnectedAsync
方法,然后检查您的SignalR console客户端应用程序是否可以连接到hub并与web客户端良好通信

public override async Task OnConnectedAsync()
{
    string name = Context.User.Identity.Name;

    if (name != null)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, name);
    }

    await base.OnConnectedAsync();
}

如果调试集线器方法,当您从控制台客户端应用程序调用它时,它是否会命中预期的方法?不是。到目前为止,我已经找到了导致问题的原因,在我的集线器中,我有一个通知组名称的OnConnectedAsync方法,因为没有应用程序控制台,我没有设置组,因此它没有连接。
在我的集线器中,我有一个通知组名称的OnConnectedAsync方法
Hi@Renan,请检查我的新更新。如果调试集线器方法,当您从控制台客户端应用程序调用它时,它是否达到预期的方法?不是。到目前为止,我已经找到了导致问题的原因,在我的集线器中,我有一个OnConnectedAsync
public override async Task OnConnectedAsync()
{
    string name = Context.User.Identity.Name;

    if (name != null)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, name);
    }

    await base.OnConnectedAsync();
}