Сбой «Невозможно получить доступ к удаленному объекту» в SignalRC#

Место общения программистов C#
Ответить
Anonymous
 Сбой «Невозможно получить доступ к удаленному объекту» в SignalR

Сообщение Anonymous »

У меня есть тестовый хаб с таймером, который отправляет дату всем клиентам.

Как только клиент подключается, происходит сбой со следующей ошибкой: Невозможно получить доступ к удаленному объекту.

Вот ошибка:

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'MyHub'.
at Microsoft.AspNetCore.SignalR.Hub.CheckDisposed()
at Microsoft.AspNetCore.SignalR.Hub.get_Clients()


Вот код хаба:

public class MyHub : Hub
{
public MyHub()
{
Program.T = new Timer(TickTimer, null, 1000, 1000);
}

private void TickTimer(object State)
{
try
{
var Time = DateTime.UtcNow.ToString(CultureInfo.InvariantCulture);
Console.WriteLine(Time);

Clients.All.SendCoreAsync("update", new object[] { Time });
}
catch (Exception E)
{
Console.WriteLine(E);
throw;
}
}
}


Похоже, что объект Клиенты был удален, но я не понимаю, почему.


Изменить, вот дополнительная информация:

Концентраторы могут быть из разных сборок, поэтому они регистрируются динамически, в разделе настройки автозагрузки asp.

Каждый концентратор украшен атрибутом, идентифицирующим его и указывающим путь:

[AttributeUsage(AttributeTargets.Class)]
public class SignalRHub : Attribute
{
public readonly string Route;

public SignalRHubPath(string Route)
{
this.Route = Route;
}
}


А потом их находят и регистрируют так:

private static void RegisterHubs(IApplicationBuilder Application)
{
// find all SignalR hubs
var HubsList = ReflectionHelper.FindType();
Logging.Info($"Found {HubsList.Count} hubs");

// get a link to the mapper method of the hubroutebuilder.
var MapperMethodInfo = typeof(HubRouteBuilder).GetMethod("MapHub", new[] { typeof(PathString) }, null);

// register them
foreach (var H in HubsList)
{
// get the route attribute
var Route = string.Empty;
var Attributes = Attribute.GetCustomAttributes(H);
foreach (var Attribute in Attributes)
{
if (Attribute is SignalRHubPath A) { Route = A.Route; break; }
}

// register the hub
if (string.IsNullOrEmpty(Route))
{
Logging.Warn($"[Hub] {H.Name} does not have a path, skipping");
}
else
{
Logging.Info($"[Hub] Registering {H.Name} with path {Route}");
// Application.UseSignalR(_ => _.MapHub("/" + Route));
// use the mapper method call instead so we can pass the hub type
var Path = new PathString("/" + Route);
Application.UseSignalR(R => MapperMethodInfo.MakeGenericMethod(H).Invoke(R, new object [] { Path }));
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/557 ... in-signalr
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»