Ошибка игрового движка the invokecoreasync

I created a Xamarin app with a chat and a API to store it’s data, every 3 minutes the mobile app makes a request to the api for the chat messages.

I decided to use SignalR as was suggested in the comments:

-Added it to my CongifureService as shown:

public void ConfigureServices(IServiceCollection services)
    {           
        services.AddDbContext<HostelContext>(opt =>
           opt.UseSqlServer(Configuration.GetConnectionString("HostelContext")));

        services.AddCors();
        services.AddControllers();

        services.AddAuthentication("BasicAuthentication")
            .AddScheme<AuthenticationSchemeOptions, BasicAuthenticationHandler>("BasicAuthentication", null);

        services.AddScoped<IUsersService, UsersService>();
        services.AddScoped<IConversationsService, ConversationsService>();
        services.AddScoped<IMessagesService, MessagesService>();

        // Register the Swagger generator, defining 1 or more Swagger documents
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "HostelApi", Version = "v1" });             
        });

        services.AddSignalR();
    }

-Added Endpoint to Configure as shown:

app.UseEndpoints(endpoints =>
        {                
            endpoints.MapControllers();
            endpoints.MapHub<ChatHub>("/chatHub");
        });

-Added Class to my api project in new folder called Hub

-This is the Hub class:

//[Authorize]    
public class ChatHub : Hub
{                
    public async Task SendMessage(Message message)
    {
        //await Clients.All.SendAsync("ReceiveMessage", message);
        await Clients.All.SendAsync("ReceiveMessage" + message.ConversationId, message);
        //await Clients.Users(destinationUserIdList).SendAsync("ReceiveMessage" + message.ConversationId, message);
    }
}

In my Xamarin app:

-Added Hub Service:

-This is the Hub Service Class:

class HubService : IHubService
{
    public HubConnection HubConnection { get; }
    public HubService()
    {
        HubConnection = new HubConnectionBuilder()
            .WithUrl($"https://10.0.2.2:5001/chatHub")
            .Build();
    }

    public async Task Connect()
    {
        await HubConnection.StartAsync().ConfigureAwait(false);
    }

    public async Task Disconnect()
    {
        await HubConnection.StopAsync().ConfigureAwait(false);
    }

    public async Task SendMessage(Message message)
    {            
        await HubConnection.InvokeAsync("SendMessage", message).ConfigureAwait(false);
    }
}

-Connect to Hub when app starts after login:

public MainPage()
    {
        InitializeComponent();                   

        MasterBehavior = MasterBehavior.Popover;

        //should be home page
        MenuPages.Add((int)MenuItemType.Home, (NavigationPage)Detail);

        HubService.Connect().ConfigureAwait(true);            
    }

-Close connection on log out

-When sending a message i call SendMessage method:

await HubService.SendMessage(message).ConfigureAwait(true);
            OutGoingText = string.Empty;
            Messages.Add(message);

The Problem now is when i send a message and gets to:

public async Task SendMessage(Message message)
    {            
        await HubConnection.InvokeAsync("SendMessage", message).ConfigureAwait(false);
    }

throws this:

System.InvalidOperationException: 'The 'InvokeCoreAsync' method cannot be called if the connection is not active'

Already tried with HubService.Connect().Wait() but app stays in a loop

Can anyone help me with this?? @Nick Kovalsky…

Best Regards

Describe the bug
When I stop debugging, an error message appears saying that something went wrong. It does not seem to cause any issues.

To Reproduce

  1. Connect my Web API ASP.Net Core 3.1 service to my Kubernetes Cluster via Bridge to Kubernetes
  2. Start debugging.
  3. Debug for a while
  4. Press the stop button.
  5. A few seconds after the stop button is pressed, an banner like this appears in Visual Studio:
    image
    (It says «Visual Studio ran into an unexpected problem, and may affect some project system functions.» An it has a «Open log file» button.)

When I open the log file, this is what is in it:

Click to Expand Log File Details

===================
7/9/2021 2:26:15 PM
Recoverable
System.AggregateException: One or more errors occurred. ---> StreamJsonRpc.RemoteInvocationException: Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. System.InvalidOperationException: The 'InvokeCoreAsync' method cannot be called if the connection is not active
at Microsoft.AspNetCore.SignalR.Client.HubConnection.ReconnectingConnectionState.WaitForActiveConnectionAsync(String methodName, String memberName, String filePath, Int32 lineNumber)
at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsyncCore(String methodName, Type returnType, Object[] args, CancellationToken cancellationToken)
at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsync(String methodName, Type returnType, Object[] args, CancellationToken cancellationToken)
at Microsoft.BridgeToKubernetes.Common.DevHostAgent.DevHostAgentExecutorClient.<>c__DisplayClass31_1.<b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Threading.Tasks.Task.<>c.b__139_1(Object state)
at System.Threading.QueueUserWorkItemCallback.<>c.<.cctor>b__6_0(QueueUserWorkItemCallback quwi)
at System.Threading.ExecutionContext.RunForThreadPoolUnsafe[TState](ExecutionContext executionContext, Action`1 callback, TState& state)
at System.Threading.QueueUserWorkItemCallback.Execute()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
System.InvalidOperationException: The 'InvokeCoreAsync' method cannot be called if the connection is not active
at Microsoft.AspNetCore.SignalR.Client.HubConnection.ReconnectingConnectionState.WaitForActiveConnectionAsync(String methodName, String memberName, String filePath, Int32 lineNumber)
at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsyncCore(String methodName, Type returnType, Object[] args, CancellationToken cancellationToken)
at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsync(String methodName, Type returnType, Object[] args, CancellationToken cancellationToken)
at Microsoft.BridgeToKubernetes.Common.DevHostAgent.DevHostAgentExecutorClient.<>c__DisplayClass31_1.<b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Threading.Tasks.Task.<>c.b__139_1(Object state)
at System.Threading.QueueUserWorkItemCallback.<>c.<.cctor>b__6_0(QueueUserWorkItemCallback quwi)
at System.Threading.ExecutionContext.RunForThreadPoolUnsafe[TState](ExecutionContext executionContext, Action`1 callback, TState& state)
at System.Threading.QueueUserWorkItemCallback.Execute()
at System.Threading.ThreadPoolWorkQueue.Dispatch()

at StreamJsonRpc.JsonRpc.d__1391.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.VisualStudio.Kubernetes.Debugging.Core.Services.ConnectionManager.ConnectionManagerService.<DisconnectCoreAsync>d__28.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.VisualStudio.Kubernetes.Debugging.Core.Services.ConnectionManager.ConnectionManagerService.<>c__DisplayClass27_0.<<GetDisconnectCallback>b__2>d.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Microsoft.VisualStudio.Kubernetes.Debugging.Core.Services.ConnectionManager.ConnectionManagerService.<>c__DisplayClass27_0.<<GetDisconnectCallback>b__2>d.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.VisualStudio.Kubernetes.Debugging.Core.Services.ServiceHub.ConnectServiceBrokerClient.<ExecuteWithServiceAsync>d__3.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Microsoft.VisualStudio.ProjectSystem.CommonProjectSystemTools.Rethrow(Exception ex) at Microsoft.VisualStudio.ProjectSystem.ProjectErrorReporting.<>c__DisplayClass6_0.<SubmitErrorReport>b__0() at Microsoft.VisualStudio.ProjectSystem.ExceptionFilter.<>c__DisplayClass2_0.<Guard>g__Action|0() at GuardMethodClass.GuardMethod(Func1 , Func2 , Func2 )
--- End of inner exception stack trace ---
---> (Inner Exception #0) StreamJsonRpc.RemoteInvocationException: Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. System.InvalidOperationException: The 'InvokeCoreAsync' method cannot be called if the connection is not active
at Microsoft.AspNetCore.SignalR.Client.HubConnection.ReconnectingConnectionState.WaitForActiveConnectionAsync(String methodName, String memberName, String filePath, Int32 lineNumber)
at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsyncCore(String methodName, Type returnType, Object[] args, CancellationToken cancellationToken)
at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsync(String methodName, Type returnType, Object[] args, CancellationToken cancellationToken)
at Microsoft.BridgeToKubernetes.Common.DevHostAgent.DevHostAgentExecutorClient.<>c__DisplayClass31_1.<b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Threading.Tasks.Task.<>c.b__139_1(Object state)
at System.Threading.QueueUserWorkItemCallback.<>c.<.cctor>b__6_0(QueueUserWorkItemCallback quwi)
at System.Threading.ExecutionContext.RunForThreadPoolUnsafe[TState](ExecutionContext executionContext, Action1 callback, TState& state) at System.Threading.QueueUserWorkItemCallback.Execute() at System.Threading.ThreadPoolWorkQueue.Dispatch() System.InvalidOperationException: The 'InvokeCoreAsync' method cannot be called if the connection is not active at Microsoft.AspNetCore.SignalR.Client.HubConnection.ReconnectingConnectionState.WaitForActiveConnectionAsync(String methodName, String memberName, String filePath, Int32 lineNumber) at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsyncCore(String methodName, Type returnType, Object[] args, CancellationToken cancellationToken) at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsync(String methodName, Type returnType, Object[] args, CancellationToken cancellationToken) at Microsoft.BridgeToKubernetes.Common.DevHostAgent.DevHostAgentExecutorClient.<>c__DisplayClass31_1.<<ReversePortForwardStartAsync>b__0>d.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__139_1(Object state) at System.Threading.QueueUserWorkItemCallback.<>c.<.cctor>b__6_0(QueueUserWorkItemCallback quwi) at System.Threading.ExecutionContext.RunForThreadPoolUnsafe[TState](ExecutionContext executionContext, Action1 callback, TState& state)
at System.Threading.QueueUserWorkItemCallback.Execute()
at System.Threading.ThreadPoolWorkQueue.Dispatch()

at StreamJsonRpc.JsonRpc.d__1391.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.VisualStudio.Kubernetes.Debugging.Core.Services.ConnectionManager.ConnectionManagerService.<DisconnectCoreAsync>d__28.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.VisualStudio.Kubernetes.Debugging.Core.Services.ConnectionManager.ConnectionManagerService.<>c__DisplayClass27_0.<<GetDisconnectCallback>b__2>d.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Microsoft.VisualStudio.Kubernetes.Debugging.Core.Services.ConnectionManager.ConnectionManagerService.<>c__DisplayClass27_0.<<GetDisconnectCallback>b__2>d.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.VisualStudio.Kubernetes.Debugging.Core.Services.ServiceHub.ConnectServiceBrokerClient.<ExecuteWithServiceAsync>d__3.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Microsoft.VisualStudio.ProjectSystem.CommonProjectSystemTools.Rethrow(Exception ex) at Microsoft.VisualStudio.ProjectSystem.ProjectErrorReporting.<>c__DisplayClass6_0.<SubmitErrorReport>b__0() at Microsoft.VisualStudio.ProjectSystem.ExceptionFilter.<>c__DisplayClass2_0.<Guard>g__Action|0() at GuardMethodClass.GuardMethod(Func1 , Func2 , Func2 )
RPC server exception:
Microsoft.VisualStudio.Kubernetes.Debugging.RpcContracts.DscException: Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. Unhandled exception. System.InvalidOperationException: The 'InvokeCoreAsync' method cannot be called if the connection is not active
at Microsoft.AspNetCore.SignalR.Client.HubConnection.ReconnectingConnectionState.WaitForActiveConnectionAsync(String methodName, String memberName, String filePath, Int32 lineNumber)
at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsyncCore(String methodName, Type returnType, Object[] args, CancellationToken cancellationToken)
at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsync(String methodName, Type returnType, Object[] args, CancellationToken cancellationToken)
at Microsoft.BridgeToKubernetes.Common.DevHostAgent.DevHostAgentExecutorClient.<>c__DisplayClass31_1.<b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Threading.Tasks.Task.<>c.b__139_1(Object state)
at System.Threading.QueueUserWorkItemCallback.<>c.<.cctor>b__6_0(QueueUserWorkItemCallback quwi)
at System.Threading.ExecutionContext.RunForThreadPoolUnsafe[TState](ExecutionContext executionContext, Action1 callback, TState& state) at System.Threading.QueueUserWorkItemCallback.Execute() at System.Threading.ThreadPoolWorkQueue.Dispatch() System.InvalidOperationException: The 'InvokeCoreAsync' method cannot be called if the connection is not active at Microsoft.AspNetCore.SignalR.Client.HubConnection.ReconnectingConnectionState.WaitForActiveConnectionAsync(String methodName, String memberName, String filePath, Int32 lineNumber) at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsyncCore(String methodName, Type returnType, Object[] args, CancellationToken cancellationToken) at Microsoft.AspNetCore.SignalR.Client.HubConnection.InvokeCoreAsync(String methodName, Type returnType, Object[] args, CancellationToken cancellationToken) at Microsoft.BridgeToKubernetes.Common.DevHostAgent.DevHostAgentExecutorClient.<>c__DisplayClass31_1.<<ReversePortForwardStartAsync>b__0>d.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__139_1(Object state) at System.Threading.QueueUserWorkItemCallback.<>c.<.cctor>b__6_0(QueueUserWorkItemCallback quwi) at System.Threading.ExecutionContext.RunForThreadPoolUnsafe[TState](ExecutionContext executionContext, Action1 callback, TState& state)
at System.Threading.QueueUserWorkItemCallback.Execute()
at System.Threading.ThreadPoolWorkQueue.Dispatch()

 at Microsoft.VisualStudio.Kubernetes.Debugging.ServiceHub.DscClient.<InvokeSilentAsync>d__16.MoveNext() 

--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.VisualStudio.Kubernetes.Debugging.ServiceHub.DscClient.d__18.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.VisualStudio.Kubernetes.Debugging.ServiceHub.Connect.ConnectService.<>c__DisplayClass11_0.<b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.VisualStudio.Kubernetes.Debugging.RpcContracts.Telemetry.KubeConnectScopeBase1.<ExecuteWithErrorHandlingAsync>d__26.MoveNext() --- End of stack trace from previous location where exception was thrown --- at Microsoft.VisualStudio.Kubernetes.Debugging.RpcContracts.Telemetry.KubeConnectScopeBase1.d__26.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.VisualStudio.Kubernetes.Debugging.ServiceHub.Connect.ConnectService.d__11.MoveNext()
<---

===================

Expected behavior
This does not seem to cause any issues, so the only expected behavior is that the error banner would not show.

Logs
Logs had my company info in them. I would be happy to provide logs privately if desired.

Environment Details
Client used: Visual Studio
Visual Studio version: Version 16.9.2
Client’s version: Windows 10 Version — 10.0.19042 Build 19042
Operating System: Windows 10 Version — 10.0.19042 Build 19042

Additional context
I am not sure if it is related, but I have noticed that have have to wait about a minute or so before I can successfully startup a Bridge to Kubernetes debug session again.

Я создал приложение Xamarin с чатом и API для хранения его данных, каждые 3 минуты мобильное приложение отправляет запрос к API для сообщений чата.

Я решил использовать SignalR, как было предложено в комментариях:

-Добавил его в мой CongifureService, как показано:

public void ConfigureServices(IServiceCollection services)
    {           
        services.AddDbContext<HostelContext>(opt =>
           opt.UseSqlServer(Configuration.GetConnectionString("HostelContext")));

        services.AddCors();
        services.AddControllers();

        services.AddAuthentication("BasicAuthentication")
            .AddScheme<AuthenticationSchemeOptions, BasicAuthenticationHandler>("BasicAuthentication", null);

        services.AddScoped<IUsersService, UsersService>();
        services.AddScoped<IConversationsService, ConversationsService>();
        services.AddScoped<IMessagesService, MessagesService>();

        // Register the Swagger generator, defining 1 or more Swagger documents
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "HostelApi", Version = "v1" });             
        });

        services.AddSignalR();
    }

-Добавлена ​​конечная точка для настройки, как показано на рисунке:

app.UseEndpoints(endpoints =>
        {                
            endpoints.MapControllers();
            endpoints.MapHub<ChatHub>("/chatHub");
        });

-Добавлен класс в мой проект API в новой папке под названием Hub.

-Это класс концентратора:

//[Authorize]    
public class ChatHub : Hub
{                
    public async Task SendMessage(Message message)
    {
        //await Clients.All.SendAsync("ReceiveMessage", message);
        await Clients.All.SendAsync("ReceiveMessage" + message.ConversationId, message);
        //await Clients.Users(destinationUserIdList).SendAsync("ReceiveMessage" + message.ConversationId, message);
    }
}

В моем приложении Xamarin:

-Добавлен сервис-концентратор:

-Это класс обслуживания концентратора:

class HubService : IHubService
{
    public HubConnection HubConnection { get; }
    public HubService()
    {
        HubConnection = new HubConnectionBuilder()
            .WithUrl($"https://10.0.2.2:5001/chatHub")
            .Build();
    }

    public async Task Connect()
    {
        await HubConnection.StartAsync().ConfigureAwait(false);
    }

    public async Task Disconnect()
    {
        await HubConnection.StopAsync().ConfigureAwait(false);
    }

    public async Task SendMessage(Message message)
    {            
        await HubConnection.InvokeAsync("SendMessage", message).ConfigureAwait(false);
    }
}

-Подключиться к концентратору, когда приложение запускается после входа в систему:

public MainPage()
    {
        InitializeComponent();                   

        MasterBehavior = MasterBehavior.Popover;

        //should be home page
        MenuPages.Add((int)MenuItemType.Home, (NavigationPage)Detail);

        HubService.Connect().ConfigureAwait(true);            
    }

-Закрыть соединение при выходе

-При отправке сообщения я вызываю метод SendMessage:

await HubService.SendMessage(message).ConfigureAwait(true);
            OutGoingText = string.Empty;
            Messages.Add(message);

Проблема сейчас в том, когда я отправляю сообщение и получаю:

public async Task SendMessage(Message message)
    {            
        await HubConnection.InvokeAsync("SendMessage", message).ConfigureAwait(false);
    }

бросает это:

System.InvalidOperationException: 'The 'InvokeCoreAsync' method cannot be called if the connection is not active'

Уже пробовал с HubService.Connect().Wait(), но приложение остается в цикле

Кто-нибудь может мне с этим помочь?? @Ник Ковальский…

С уважением

Я создал приложение Xamarin с чатом и API для хранения его данных, каждые 3 минуты мобильное приложение делает запрос к api для сообщений чата.

Я решил использовать SignalR, как было предложено в комментариях:

-Добавил его в мой CongifureService, как показано:

public void ConfigureServices(IServiceCollection services)
    {           
        services.AddDbContext<HostelContext>(opt =>
           opt.UseSqlServer(Configuration.GetConnectionString("HostelContext")));

        services.AddCors();
        services.AddControllers();

        services.AddAuthentication("BasicAuthentication")
            .AddScheme<AuthenticationSchemeOptions, BasicAuthenticationHandler>("BasicAuthentication", null);

        services.AddScoped<IUsersService, UsersService>();
        services.AddScoped<IConversationsService, ConversationsService>();
        services.AddScoped<IMessagesService, MessagesService>();

        // Register the Swagger generator, defining 1 or more Swagger documents
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "HostelApi", Version = "v1" });             
        });

        services.AddSignalR();
    }

-Добавлена ​​конечная точка для настройки, как показано:

app.UseEndpoints(endpoints =>
        {                
            endpoints.MapControllers();
            endpoints.MapHub<ChatHub>("/chatHub");
        });

-Добавлен класс в мой проект api в новой папке под названием Hub.

-Это класс Hub:

//[Authorize]    
public class ChatHub : Hub
{                
    public async Task SendMessage(Message message)
    {
        //await Clients.All.SendAsync("ReceiveMessage", message);
        await Clients.All.SendAsync("ReceiveMessage" + message.ConversationId, message);
        //await Clients.Users(destinationUserIdList).SendAsync("ReceiveMessage" + message.ConversationId, message);
    }
}

В моем приложении Xamarin:

-Добавлен Hub Service:

-Это класс обслуживания концентратора:

class HubService : IHubService
{
    public HubConnection HubConnection { get; }
    public HubService()
    {
        HubConnection = new HubConnectionBuilder()
            .WithUrl($"https://10.0.2.2:5001/chatHub")
            .Build();
    }

    public async Task Connect()
    {
        await HubConnection.StartAsync().ConfigureAwait(false);
    }

    public async Task Disconnect()
    {
        await HubConnection.StopAsync().ConfigureAwait(false);
    }

    public async Task SendMessage(Message message)
    {            
        await HubConnection.InvokeAsync("SendMessage", message).ConfigureAwait(false);
    }
}

-Подключиться к концентратору, когда приложение запускается после входа в систему:

public MainPage()
    {
        InitializeComponent();                   

        MasterBehavior = MasterBehavior.Popover;

        //should be home page
        MenuPages.Add((int)MenuItemType.Home, (NavigationPage)Detail);

        HubService.Connect().ConfigureAwait(true);            
    }

-Закрыть соединение при выходе

-При отправке сообщения я вызываю метод SendMessage:

await HubService.SendMessage(message).ConfigureAwait(true);
            OutGoingText = string.Empty;
            Messages.Add(message);

Проблема теперь в том, что я отправляю сообщение и попадаю в:

public async Task SendMessage(Message message)
    {            
        await HubConnection.InvokeAsync("SendMessage", message).ConfigureAwait(false);
    }

Бросает это:

System.InvalidOperationException: 'The 'InvokeCoreAsync' method cannot be called if the connection is not active'

Уже пробовал с HubService.Connect (). Wait (), но приложение остается в цикле

Кто-нибудь может мне с этим помочь?? @ Ник Ковальский …

С наилучшими пожеланиями

Я выясняю проблему!

Проблема заключалась в вызове «HubService.Connect (). ConfigureAwait (true);» который является асинхронным методом внутри конструктора, поэтому у него не может быть await.

public MainPage()
    {
        InitializeComponent();                   

        MasterBehavior = MasterBehavior.Popover;

        //should be home page
        MenuPages.Add((int)MenuItemType.Home, (NavigationPage)Detail);

        HubService.Connect().ConfigureAwait(true);            
    }

Решено переместить вызов «HubService.Connect (). ConfigureAwait (true);» в App.xaml.cs и поместите его в метод OnStart ():

protected override async void OnStart()
{
await HubService.Connect().ConfigureAwait(true);
}

Спасибо всем ребята!


0

MarchalPT
22 Мар 2020 в 03:27

Unreal Engine — популярный игровой движок, который разработчики используют для создания и разработки игр. Как пакет, он имеет одни из лучших интегрированных инструментов. Unreal Engine — один из лучших современных игровых движков, но он не идеален. У него есть свои проблемы, которые иногда превращаются в проблемы для игр, зависящих от его компонентов.

Фактически, в этом руководстве мы намерены изучить проблему сбоя Unreal Engine, которая, кажется, поражает большое количество популярных игр. Люди просто не могут получать удовольствие от своих игр. Судя по отчетам, которые мы видели, пользователи жаловались, что их игра зависла, перестала работать или перестала отвечать, потому что что-то пошло не так с Unreal Engine.

Unreal Engine, вероятно, дает сбой, потому что его процессы продолжают достигать состояния или условия, при котором они не могут продолжать работать или выполнять задачи. Проблема может заключаться в ошибках или несоответствиях в программе; проблема может быть связана с конфликтами с участием других приложений или вмешательством сторонних утилит. Что ж, мы только что обозначили наиболее вероятные или распространенные причины сбоев Unreal Engine на компьютерах с Windows 10.

Как исправить ошибку Unreal Engine в Windows 10

Теперь мы опишем процедуры и обходные пути, которые доказали свою эффективность в том, чтобы заставить Unreal Engine прекратить сбои (или сбои реже) на ПК с Windows 10. Мы рекомендуем вам начать с первого исправления в списке. Если первая процедура не дает достаточных результатов, вы можете перейти к следующему решению и продолжить выполнение остальных в том же порядке, пока проблема в вашем случае не будет решена.

  1. Обновление Unreal Engine 4:

Ранее мы установили ошибки как одну из причин, из-за которых Unreal Engine вылетает на компьютерах. Что ж, процедура здесь направлена ​​на то, чтобы исправить ситуацию в этом направлении — если наше предположение верно. Разработчики Unreal Engine, вероятно, знали о сбоях, беспокоящих пользователей, поэтому они, вероятно, проделали некоторую работу для решения проблемы.

Поэтому, обновляя Unreal Engine, вы предоставите программе исправления и патчи для ошибок, которые могут быть причиной сбоев — и это хороший результат. Проверить и установить обновления для Unreal Engine относительно легко, поэтому сначала нужно было выполнить эту процедуру.

Сделай это:

  • Откройте программу запуска Epic Games, дважды щелкнув ярлык приложения (который, вероятно, находится на экране рабочего стола).
  • Как только появится окно запуска Epic Games, вам нужно посмотреть в верхний левый угол окна и затем нажать на Unreal Engine.
  • Теперь вы должны посмотреть на панель на правой границе окна и затем щелкнуть по Библиотеке (чтобы перейти на эту вкладку).
  • Посмотрите список в верхней части окна. Поищите там версии движка.
  • Щелкните маленькую стрелку вниз (чтобы запустить ручную проверку обновлений).

Программа запуска Epic Games теперь будет использовать ваш Интернет, чтобы связаться с соответствующими серверами, чтобы узнать, есть ли что-то новое, чего не хватает вашему компьютеру.

  • Если приложение обнаружит новую версию движка, вам нужно будет выбрать ее и затем нажать «Установить».

Программа запуска Epic Games теперь будет работать для установки нового материала.

  • После завершения операций по установке нового движка необходимо перезапустить программу запуска Epic Games.

В идеале вам следует перезагрузить компьютер (для достижения наилучших результатов).

  • Протестируйте игру или приложение, в котором вы столкнулись с ошибкой Unreal Engine, чтобы увидеть, как все пойдет на этот раз.
  1. Проверить установку двигателя:

Здесь мы рассматриваем возможность того, что Unreal Engine дает сбой на вашем компьютере из-за повреждения файлов. Также велика вероятность того, что сбои связаны с изменением или удалением некоторых важных компонентов. С этой целью мы хотим, чтобы вы использовали функцию «проверка файлов», чтобы исправить ситуацию.

Unreal Engine существует как компонент внутри Epic Games Launcher, что означает, что вы должны использовать функцию проверки на последнем, чтобы проверить наличие проблем в файлах Unreal Engine. Если будут обнаружены несоответствия или несоответствия, плохие данные будут заменены исправными копиями (содержащими необходимые данные).

В любом случае, это инструкции, которым вы должны следовать, чтобы проверить установку:

  • Во-первых, вам нужно открыть программу запуска Epic Games. Вы всегда можете сделать это, дважды щелкнув ярлык приложения (который должен быть на рабочем столе).
  • Как только появится окно программы, вы должны посмотреть в верхний левый угол и затем нажать «Библиотека».

Вы будете перенаправлены на вкладку «Библиотека».

  • Посмотрите на панель справа и нажмите маленькую стрелку вниз (чтобы развернуть раскрывающееся меню или просмотреть список параметров).
  • Щелкните Подтвердить.

Теперь программа запуска Epic Games инициализирует процессы, необходимые для операции проверки.

  • Ты должен быть терпеливым. Подождите, пока сканирование завершится.
  • После того, как проверка будет завершена, вам нужно нажать на опцию «Запуск» (которая теперь должна быть видна).
  • Запустите игру или приложение, с которыми вы столкнулись из-за сбоев Unreal Engine, и посмотрите, стало ли что-то лучше.
  1. Измените видеокарту по умолчанию:

Данная процедура предназначена для конкретного случая проблемы. Если вы видите, что Unreal Engine завершает работу из-за предупреждения или уведомления о потере устройства D3D во время вашей борьбы с Unreal Engine, то исправления здесь, вероятно, будет достаточно для решения ваших проблем. Если наши предположения верны, то проблема в вашем случае заключается в том, что ваш компьютер использует слабую видеокарту для выполнения операций.

Если на вашем компьютере есть дискретная или выделенная видеокарта, тогда у него есть два графических процессора на выбор, когда ему нужно запускать приложения или игры. Дискретный графический процессор обычно является более мощным устройством, поэтому вашей системе всегда лучше использовать его для игр и других приложений, требующих графики.

Здесь мы хотим, чтобы вы проинструктировали (или заставили) ваш компьютер использовать выделенную видеокарту. Мы предполагаем, что у вас дискретная видеокарта от NVIDIA, поэтому описание процедуры здесь основано на этом.

Выполните следующие шаги:

  • Перейдите к экрану меню «Пуск» Windows, нажав кнопку с логотипом Windows на клавиатуре компьютера (или вы можете щелкнуть значок Windows в нижнем левом углу дисплея для того же результата).
  • Введите Панель управления NVIDIA в текстовое поле (которое появляется в момент начала ввода), чтобы выполнить задачу поиска, используя эти ключевые слова в качестве запроса.
  • Предполагая, что панель управления NVIDIA (приложение) теперь стала основной записью в возвращаемом списке результатов, вам нужно щелкнуть по ней (чтобы открыть).
  • Когда появится окно Панели управления NVIDIA, вам нужно будет нажать на Управление настройками 3D.
  • Предполагая, что вы находитесь на вкладке «Глобальные настройки», вам необходимо щелкнуть раскрывающееся меню «Предпочитаемый графический процессор» (чтобы увидеть доступные параметры).
  • Выберите высокопроизводительный процессор NVIDIA.
  • Теперь вы должны нажать кнопку «Применить». Также нажмите кнопку ОК — если этот шаг применим.
  • Закройте приложение NVIDIA Control Panel и другие приложения.
  • Перезагрузите компьютер.
  • Запустите игру или приложение, в котором возникает сбой Unreal Engine, чтобы узнать, как долго оно будет работать.
  1. Внесите некоторые изменения в свой реестр:

На некоторых компьютерах было доказано, что сбои Unreal Engine связаны с настройками TDR. На этих машинах пользователям удалось улучшить результаты стабильности Unreal Engine, изменив конфигурацию TDR. На вашем компьютере может быть то же самое; вы тоже можете изменить что-нибудь, чтобы Unreal Engine оставался работоспособным столько, сколько необходимо.

TDR — что означает обнаружение и восстановление тайм-аута — это функция, которая проверяет, работает ли ваша видеокарта должным образом. Когда эта функция обнаруживает, что видеокарта неисправна или из-за неполадок, она выполняет сброс своих компонентов. Мы хотим, чтобы вы отключили эту функцию, чтобы ваш компьютер предоставлял своему графическому процессору все время, необходимое для восстановления (ради Unreal Engine), прежде чем использовать его полностью.

Однако, прежде чем приступить к выполнению этой задачи, мы должны предупредить вас о связанных с этим рисках. Вы собираетесь внести изменения в записи в реестре компьютера, который является чрезвычайно важным компонентом Windows. Если вы сделаете ошибки, у вас может возникнуть больше проблем, чем у вас сейчас. С этой целью рекомендуется соблюдать меры предосторожности.

Возможно, вы захотите создать резервную копию своего реестра. У вас не будет лучшего шанса сделать резервную копию, чем сейчас. Вы сможете легко решить все проблемы с помощью резервной копии — если что-то пойдет не так.

В любом случае, для создания резервной копии реестра необходимо выполнить следующие действия:

  • Используйте кнопку с логотипом Windows + сочетание клавиш с буквой R, чтобы быстро запустить приложение «Выполнить».
  • Как только появится небольшое диалоговое окно или окно «Выполнить», вы должны заполнить пустое текстовое поле с помощью Regedit .
  • Чтобы запустить код, нажмите кнопку Enter на клавиатуре вашего компьютера (или нажмите кнопку OK в окне «Выполнить» для того же результата).

Откроется окно редактора реестра.

  • Посмотрите в верхний левый угол окна, нажмите «Файл» и затем выберите «Экспорт» (из отображаемого списка параметров).

Откроется окно «Экспорт файла реестра».

  • В поле «Имя файла» укажите желаемое имя для резервной копии. Вы можете , например, использовать RegBackup .
  • Вы также должны указать предпочитаемое место хранения резервной копии. Перемещайтесь по соответствующим каталогам, чтобы попасть в нужную папку.

В идеале вы должны сохранить файл на внешнем диске (например, на USB-накопителе). Если вы должны сохранить его на своем компьютере, вы можете выбрать Рабочий стол.

  • Предполагая, что вы закончили с параметрами в окне «Экспорт файла реестра», вы должны нажать кнопку «Сохранить» (чтобы закончить).

Теперь ваш компьютер будет создавать резервную копию и хранить ее в указанном каталоге.

Между тем, вот инструкции, которым вы должны следовать, чтобы внести необходимые изменения в реестр, чтобы исправить сбои Unreal Engine:

  • Здесь вам нужно вернуться в окно редактора реестра или снова запустить приложение (если вы его закрыли).

Вы можете прокрутить немного вверх, чтобы увидеть инструкции по открытию редактора реестра (если вам нужно).

  • На этот раз вы должны щелкнуть Компьютер (в верхнем левом углу окна), чтобы увидеть его содержимое, а затем перейти по каталогам по этому пути, чтобы добраться до пункта назначения:

HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Control GraphicsDrivers

  • Теперь на панели рядом с правой границей окна внутри GraphicsDrivers вам нужно щелкнуть правой кнопкой мыши в любом месте, свободном от объектов.
  • В отображаемом списке опций вы должны щелкнуть по New (чтобы увидеть другой список), а затем выбрать QWORD (64-bit) Value.
  • Вы должны использовать TdrLevel в качестве имени нового значения. Теперь нажмите кнопку ОК.

Windows теперь будет работать над созданием ценности.

  • Дважды щелкните вновь созданное значение TdrLevel.

Откроется окно «Изменить значение QWORD (64-разрядное) для TdrLevel».

  • Заполните поле Value data значением 0 и затем нажмите кнопку OK, чтобы сохранить изменения, которые вы только что сделали.

Ваша работа с реестром завершена.

  • Закройте приложение «Редактор реестра» и другие программы.
  • Перезагрузите компьютер.
  • Запустите несколько тестов проблемной игры или программы, чтобы убедиться, что Unreal Engine больше не дает сбоев, как раньше.
  1. Переустановите драйвер видеокарты; обновите ваши драйверы:

Драйвер видеокарты — это программа, которая управляет взаимодействием между графическим процессором (аппаратным компонентом) и приложениями или самой Windows (программной частью). Следовательно, драйвер вашей видеокарты играет важную роль в операциях отображения изображений и видео, которые составляют основу графических процессов.

Есть большая вероятность, что сбои Unreal Engine связаны с графическими недостатками или несоответствиями, которые затем могут быть связаны с драйвером видеокарты. Если мы рассмотрим эту возможность, то мы можем экстраполировать, что видеокарта находится в плохом состоянии. Вероятно, драйвер сломан, неисправен или поврежден. С этой целью мы хотим, чтобы вы переустановили драйвер, чтобы устранить проблемы с ним.

Когда вы переустанавливаете драйвер, задействованные процессы (которые составляют операции удаления и установки), как правило, вызывают изменения в настройках и составе драйвера. Результирующих изменений может быть достаточно, чтобы вернуть драйвер в нормальное состояние, поэтому вы должны рискнуть. В конце концов, процедура совершенно безвредна.

В любом случае, вот шаги, которые вы должны выполнить, чтобы переустановить драйвер видеокарты:

  • Во-первых, вам нужно щелкнуть правой кнопкой мыши значок Windows в нижнем левом углу дисплея вашего компьютера, чтобы увидеть приложения и параметры меню опытного пользователя.
  • Из отображаемого списка необходимо выбрать Диспетчер устройств (для запуска этого приложения).
  • Предполагая, что окно диспетчера устройств открыто, вы должны просмотреть в нем список и найти адаптеры дисплея.
  • Щелкните значок расширения рядом с Display Adapters, чтобы открыть его содержимое.
  • Найдите в списке свое выделенное устройство с графическим процессором, щелкните его правой кнопкой мыши, чтобы увидеть доступные параметры, а затем выберите «Удалить драйвер».
  • Мы проинструктировали вас найти свое выделенное устройство с графическим процессором, поскольку на вашем компьютере, вероятно, работают игры и другие приложения, требующие обработки графики, с использованием выделенного графического процессора. Ваш компьютер оснащен двумя графическими блоками (выделенным графическим процессором и встроенным графическим процессором), но выделенный графический процессор является более мощной или способной картой.
  • Поэтому для достижения наилучших результатов или результатов ваш компьютер (как и большинство машин) запрограммирован на выполнение сложных или интенсивных графических операций с помощью выделенного графического процессора. И по этим причинам драйвер для выделенного графического процессора — это тот, который вы должны переустановить, чтобы исправить сбои Unreal Engine.
  • Однако, если вы уверены, что на вашем компьютере запускаются игры и приложения, использующие встроенную карту, вам нужно вместо этого щелкнуть правой кнопкой мыши встроенную карту, чтобы увидеть доступные параметры, а затем выбрать «Удалить». Затем вам нужно будет продолжить операцию удаления по этому пути (следуйте инструкциям ниже).
  • Нажмите кнопку «Удалить», чтобы подтвердить операцию — если Windows отобразит запрос или диалоговое окно, чтобы получить подтверждение операции удаления для драйвера видеокарты.

Теперь ваш компьютер должен работать, чтобы удалить драйвер.

  • После того, как все будет сделано, вам нужно закрыть приложение диспетчера устройств (и другие приложения), а затем перезагрузить компьютер.
  • Подождите, пока Windows загрузится и успокоится (пока вы ничего не делаете).

Теперь ваша система, скорее всего, поймет, что драйвер для важного компонента отсутствует, поэтому она будет работать, чтобы получить и установить необходимое программное обеспечение (без вашей помощи).

  • На этом этапе, если на вашем компьютере установлен необходимый драйвер, мы рекомендуем перезагрузить компьютер, чтобы завершить работу.
  • Запустите игру или приложение, пострадавшие от сбоев Unreal Engine, чтобы узнать, как долго они будут работать.

Если операция переустановки не помогла решить проблему в вашем случае — или если вы не смогли заставить Windows переустановить драйвер видеокарты по какой-либо причине — тогда вам необходимо обновить драйвер. Чтобы сделать это быстро, вам необходимо установить Auslogics Driver Updater. Эта программа поможет вам выполнять все задачи по обновлению драйверов максимально эффективно, поэтому вам не придется возиться со многими сложными и утомительными операциями.

Рекомендуемое приложение работает следующим образом: оно сначала инициирует сканирование верхнего уровня для определения плохих драйверов (поврежденных, старых или устаревших, сломанных и неисправных драйверов) на вашем компьютере; после этапа идентификации он перейдет к поиску и загрузке новых стабильных драйверов (версии, рекомендованные производителем), которые затем установит в качестве замены плохого программного обеспечения.

Фактически, с этим приложением ваш компьютер может запускать новые драйверы почти для всех своих компонентов (а не только для видеокарты). Если сбои Unreal Engine связаны с проблемами, влияющими на другие драйверы, проблема будет решена. Ну, так, поскольку все проблемы с драйверами решаются, ничего не упускается — и это хорошо.

После того, как процесс установки всех новых драйверов завершится, вам необходимо перезагрузить компьютер, чтобы завершить работу. Windows требуется перезагрузка, чтобы ваша система учла все произошедшие изменения. Только после перезапуска вы должны запустить игру или приложение, в котором возникли сбои Unreal Engine, чтобы проверить и подтвердить, что теперь все стало значительно лучше, чем раньше.

Другие способы устранения сбоев Unreal Engine в Windows 10

Если вы все еще боретесь с проблемой «Произошел сбой Unreal Engine», когда вы играете в игры или запускаете зависимые приложения, вам необходимо попытаться исправить и обходные пути из нашего окончательного списка решений проблемы.

  1. Отключить все настройки разгона; избавьтесь от всех приложений для разгона:

Если вы настроили свой компьютер на разгон определенных компонентов (например, вашего процессора), чтобы получить больше энергии от вашей машины, то вам нужно остановиться сейчас, потому что недостатки, очевидно, перевешивают выгоды. Если вы не можете заставить свои игры или приложения работать и работать, значит, улучшения производительности вам не нужны. Избавьтесь от всего, что нужно для разгона, и дайте вашим программам шанс на лучшую стабильность.

  1. Отключите антивирус; удалите приложение безопасности:

В некоторых отчетах указывается, что некоторые антивирусные бренды перегибают палку, вмешиваясь в процессы или операции, к которым они не имеют никакого отношения, чтобы вызвать проблемы у пользователей, поэтому вы можете изучить это событие в вашем случае. Возможно, ваш антивирус или защитное приложение делает то же самое. Если наше предположение верно, то Unreal Engine перестанет давать сбой после того, как вы отключите или удалите антивирус (или аналогичное приложение безопасности).

  1. Настройте свой компьютер на использование только выделенной графической карты для запуска игр и других графических приложений.
  1. Чистая переустановка всех приложений, участвующих в событиях сбоя.

У меня 2.5.4. Ща посмотрю. А что с игроком делать? Я все как у тебЯ сделал. И ту модель загрузил. И сразу ошибка. Надо где то указать объект игрока. Где?

Добавлено (16.01.2011, 17:51)
———————————————
Можешь адрес дать библиотеки скриптов? В исходниках нет его

Добавлено (16.01.2011, 18:19)
———————————————
Поставил галочку. Теперь ошибка при запуске игры: error: script file name not specified for scripted controller — и тут путь к файлу игрока

Добавлено (16.01.2011, 18:21)
———————————————
Загрузил контролер игрока, теперь ошибка с колайдами

Добавлено (16.01.2011, 18:21)
———————————————
Загрузил контролер игрока, теперь ошибка с колайдами

Добавлено (16.01.2011, 18:49)
———————————————
Я загрузил скрипт. Он теперь в проекте есть, но как его присвоить? И как создать землю?

Добавлено (17.01.2011, 12:11)
———————————————
как камере скрипт присвоить???


пол года учил GML. GameMaker отказывается теперь работать на моем компе…
Здравствуй Construct!

Ok @berhir , I have set BlazorSignalR.Server as a startup project and ran as Project.

When I go to let say Counter page I see this in the console log:

 Microsoft.AspNetCore.SignalR.HubConnectionHandler[1]
      Error when dispatching 'OnConnectedAsync' on hub.
      System.InvalidOperationException: Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while attempting to activate 'BlazorSignalR.Server.Hubs.MainHub'.
         at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
         at lambda_method43(Closure , IServiceProvider , Object[] )
         at Microsoft.AspNetCore.SignalR.Internal.DefaultHubActivator`1.Create()
         at Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher`1.OnConnectedAsync(HubConnectionContext connection)
         at Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher`1.OnConnectedAsync(HubConnectionContext connection)
         at Microsoft.AspNetCore.SignalR.HubConnectionHandler`1.RunHubAsync(HubConnectionContext connection)

And when I click Click me button I see The 'InvokeCoreAsync' method cannot be called if the connection is not active in the browser dev console:
RIQBgUT40I

Any thoughts?

Ok @berhir , I have set BlazorSignalR.Server as a startup project and ran as Project.

When I go to let say Counter page I see this in the console log:

 Microsoft.AspNetCore.SignalR.HubConnectionHandler[1]
      Error when dispatching 'OnConnectedAsync' on hub.
      System.InvalidOperationException: Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while attempting to activate 'BlazorSignalR.Server.Hubs.MainHub'.
         at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
         at lambda_method43(Closure , IServiceProvider , Object[] )
         at Microsoft.AspNetCore.SignalR.Internal.DefaultHubActivator`1.Create()
         at Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher`1.OnConnectedAsync(HubConnectionContext connection)
         at Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher`1.OnConnectedAsync(HubConnectionContext connection)
         at Microsoft.AspNetCore.SignalR.HubConnectionHandler`1.RunHubAsync(HubConnectionContext connection)

And when I click Click me button I see The 'InvokeCoreAsync' method cannot be called if the connection is not active in the browser dev console:
RIQBgUT40I

Any thoughts?

I’ve searched numerous other questions related to SignalR connections on StackOverflow, but none of them seem to apply to my specific case.

I have an application that uses a SignalR hub. A client can connect to the hub using 2 methods:

  1. Via a .NET Core API that uses an underlying client to connect to the hub
  2. Connecting directly to the URL of the hub

The issue I’m having is with connection using the .NET Core API (method 1). When the server-side application has been running for a significant amount of time (maybe 2 weeks), the SignalR connection that the API uses fails. Direct connection to the SignalR hub (method 2) continues to work.

Here’s how connection works via the API:

.NET Core Web API

[Route("~/api/heartbeat")]
[HttpPost]
public async Task SendHeartbeat(nodeId) {
    await SignalRClient.SendHeartbeat(nodeId);
    ...
}

SignalRClient

public static class SignalRClient
{

    private static HubConnection _hubConnection;

    /// <summary>
    /// Static SignalRHub client - to ensure that a single connection to the SignalRHub is re-used,
    /// and to prevent excessive connections that cause SignalR to fail
    /// </summary>
    static SignalRClient()
    {
        string signalRHubUrl = "...someUrl";

        _hubConnection = new HubConnectionBuilder()
        .WithUrl(signalRHubUrl)
        .Build();

        _hubConnection.Closed += async (error) =>
        {
            Log.Error("SignalR hub connection was closed - reconnecting. Error message - " + error.Message);

            await Task.Delay(new Random().Next(0, 5) * 1000);
            try
            {
                Log.Error("About to reconnect");
                await _hubConnection.StartAsync();
                Log.Error("Reconnect now requested");
            }
            catch (Exception ex)
            {
                Log.Error("Failed to restart connection to SignalR hub, following a disconnection: " + ex.Message);
            }
        };

        InitializeConnection();
    }

    private static async void InitializeConnection()
    {
        try
        {
            Log.Information("Checking hub connection status");
            if (_hubConnection.State == HubConnectionState.Disconnected)
            {
                Log.Information($"Starting SignalRClient using signalRHubUrl");
                await _hubConnection.StartAsync();
                Log.Information("SignalRClient started successfully");
            }
        }
        catch (Exception ex)
        {
            Log.Error("Failed to start connection to SignalRClient : " + ex.Message + ", " + ex.InnerException.Message);
        }
    }

    public static async Task SendHeartbeat(string nodeId)
    {
        try
        {
            Log.Information("Attempting to send heartbeat to SignalRHub");
            await _hubConnection.InvokeAsync("SendNodeHeartbeatToMonitors", nodeId);
        }
        catch (Exception ex)
        {
            Log.Error($"Error when sending heartbeat to SignalRClient  for NodeId: {nodeId}. Error: {ex.Message}");
        }
    }

After uptime of about 2 weeks, the connection fails and doesn’t recover, I can see an error in the log:

Error when sending transaction to SignalRClient from /api/heartbeat: The 'InvokeCoreAsync' method cannot be called if the connection is not active

I don’t understand how this is happening, as I’m using the _hubConnection.Closed method in the SignalRClient to handle the case when a connection is closed, which then executes await _hubConnection.StartAsync(); to restart the connection, as shown in the code above.

The connection is regularly being closed for some reason (every 30mins), but it usually recovers the connection, and I see the following error in the log:

SignalR hub connection was closed - reconnecting. Error message - The remote party closed the WebSocket connection without completing the close handshake.

This shows that the code is successfully entering the _hubConnection.Closed method (as this is where I log that message), so it appear that the connection is usually restarted successfully.

So, why does the connection sometimes fail completely but then fail to be restarted? I’m wondering if I’m connecting to the SignalR hub in a sensible way (in particularly, I’m wondering if using a static class for the SignalRClient is a good pattern). And I’m wondering if my actual problem is all of those The remote party closed the WebSocket connection without completing the close handshake. errors? If that’s the case, what could be causing those?

Any suggestions that point me in the right direction are greatly appreciated.

Я создал приложение Xamarin с чатом и API для хранения его данных, каждые 3 минуты мобильное приложение отправляет запрос к API для сообщений чата.

Я решил использовать SignalR, как было предложено в комментариях:

-Добавил его в мой CongifureService, как показано:

public void ConfigureServices(IServiceCollection services)
    {           
        services.AddDbContext<HostelContext>(opt =>
           opt.UseSqlServer(Configuration.GetConnectionString("HostelContext")));

        services.AddCors();
        services.AddControllers();

        services.AddAuthentication("BasicAuthentication")
            .AddScheme<AuthenticationSchemeOptions, BasicAuthenticationHandler>("BasicAuthentication", null);

        services.AddScoped<IUsersService, UsersService>();
        services.AddScoped<IConversationsService, ConversationsService>();
        services.AddScoped<IMessagesService, MessagesService>();

        // Register the Swagger generator, defining 1 or more Swagger documents
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "HostelApi", Version = "v1" });             
        });

        services.AddSignalR();
    }

-Добавлена ​​конечная точка для настройки, как показано на рисунке:

app.UseEndpoints(endpoints =>
        {                
            endpoints.MapControllers();
            endpoints.MapHub<ChatHub>("/chatHub");
        });

-Добавлен класс в мой проект API в новой папке под названием Hub.

-Это класс концентратора:

//[Authorize]    
public class ChatHub : Hub
{                
    public async Task SendMessage(Message message)
    {
        //await Clients.All.SendAsync("ReceiveMessage", message);
        await Clients.All.SendAsync("ReceiveMessage" + message.ConversationId, message);
        //await Clients.Users(destinationUserIdList).SendAsync("ReceiveMessage" + message.ConversationId, message);
    }
}

В моем приложении Xamarin:

-Добавлен сервис-концентратор:

-Это класс обслуживания концентратора:

class HubService : IHubService
{
    public HubConnection HubConnection { get; }
    public HubService()
    {
        HubConnection = new HubConnectionBuilder()
            .WithUrl($"https://10.0.2.2:5001/chatHub")
            .Build();
    }

    public async Task Connect()
    {
        await HubConnection.StartAsync().ConfigureAwait(false);
    }

    public async Task Disconnect()
    {
        await HubConnection.StopAsync().ConfigureAwait(false);
    }

    public async Task SendMessage(Message message)
    {            
        await HubConnection.InvokeAsync("SendMessage", message).ConfigureAwait(false);
    }
}

-Подключиться к концентратору, когда приложение запускается после входа в систему:

public MainPage()
    {
        InitializeComponent();                   

        MasterBehavior = MasterBehavior.Popover;

        //should be home page
        MenuPages.Add((int)MenuItemType.Home, (NavigationPage)Detail);

        HubService.Connect().ConfigureAwait(true);            
    }

-Закрыть соединение при выходе

-При отправке сообщения я вызываю метод SendMessage:

await HubService.SendMessage(message).ConfigureAwait(true);
            OutGoingText = string.Empty;
            Messages.Add(message);

Проблема сейчас в том, когда я отправляю сообщение и получаю:

public async Task SendMessage(Message message)
    {            
        await HubConnection.InvokeAsync("SendMessage", message).ConfigureAwait(false);
    }

бросает это:

System.InvalidOperationException: 'The 'InvokeCoreAsync' method cannot be called if the connection is not active'

Уже пробовал с HubService.Connect().Wait(), но приложение остается в цикле

Кто-нибудь может мне с этим помочь?? @Ник Ковальский…

С уважением

  • Ошибка иви error video data loading
  • Ошибка зрения 5 букв сканворд
  • Ошибка значения cursor hand не является значением cursor hand
  • Ошибка ивеко стралис евс
  • Ошибка значение цены не задано