Получение стека ошибок запуска соединения SignalR - PullRequest
5 голосов
/ 04 марта 2020

Как получить полный стек исключения, возникающего в веб-приложении, работающем иным образом, во время настройки соединения SignalR?

Фон

Я являюсь частью команды, обслуживающей веб-приложение с C# клиентами, которые используют чрезвычайно базовую c установку SignalR (версия 2.2) для эффективной доставки pu sh уведомлений о прогрессе во время длительных процессов сервера. Например, из коробки

app.MapSignalR();
HubConnection connection = new HubConnection(_applicationConfiguration.ApiBaseUri + "/signalr");
await connection.Start();

basi c. Некоторые из наших клиентов работают на удаленных службах и периодически сталкиваются с проблемой, при которой другие функции веб-приложения работают нормально, но код клиента, который вызывает connection.Start(), возвращает внутреннюю ошибку сервера 500 без дополнительной информации. Они могут решить эту проблему, обновив удаленное соединение, но это далеко не идеально, поэтому я пытаюсь получить некоторую информацию о том, где в процессе настройки соединения происходит эта ошибка.

Проблема

Следуя информации о настройке обработки ошибок для SignalR на MSDN , я попытался смоделировать проблему, вставив следующий модуль конвейера в GlobalHost.HubPipeline:

public class HubErrorHandlingModule : HubPipelineModule
  {
    public override Func<IHub, Task> BuildConnect(Func<IHub, Task> connect)
    {
      throw new InvalidOperationException("Testing Connection Exceptions");
    }

    protected override void OnIncomingError(ExceptionContext exceptionContext, 
      IHubIncomingInvokerContext invokerContext)
    {
      // some logging happens here
      base.OnIncomingError(exceptionContext, invokerContext);
    }
  }

и Это работает, так как я вижу, что исключение выдается в коде конвейера, и мой тестовый клиент C# также видит внутреннюю ошибку сервера 500 без дополнительной информации.

Но это также отчасти не работает, так как я опустил точки останова, а код OnIncomingError никогда не срабатывает. Это имеет смысл, так как это не код в любом методе Hub, который вызывает исключение, но я не знаю, где происходит это исключение; это может быть где угодно во время вызова клиента на connection.Start.

Я также пытался передать альтернативный HubConfiguration с EnableDetailedErrors = true, но это, кажется, ничего не улучшает.

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

Что я пробовал и почему это не работает

app.MapSignalR(new HubConfiguration { EnableDetailedErrors = true });

Я думаю, что это должно показать подробные ошибки при обработке Hub, а не при установлении соединения? Предположительно, он предназначен для отправки сообщения, помеченного как ошибка, которая может быть отслежена соединением, даже если оно никогда не всплывало ни у какого потребителя. К сожалению ...

var writer = new StreamWriter("C:\\Logs\\ClientLog.txt");
writer.AutoFlush = true;
connection.TraceLevel = TraceLevels.All;
connection.TraceWriter = writer;

Это отслеживает успешную связь с бэкэндом SignalR, как только я убираю преднамеренную ошибку конвейера. Но когда я настраиваю его обратно, все, что я вижу, это неудачная попытка установить sh соединение и 500 внутренняя ошибка сервера. Нет трассировки.

<system.diagnostics>
  <sharedListeners ... >
  <switches ...>
  <sources ...>
  <trace autoflush="true" />
</system.diagnostics>

Настройте и после подробности трассировки MSDN и этого комментария на GitHub . Ни один набор деталей не работает. Когда я пытаюсь переместить исключение конвейера в другие события конвейера, иногда я вижу, как трассировка стека отображается в источнике SignalR.HubDispatcher, упомянутом только в деталях GitHub, но это происходит, когда я выкидываю исключение после того, как соединение установлено и то, что приходит на клиентскую сторону, - это другая ошибка, чем просто внутренняя ошибка сервера 500, так что, вероятно, это происходит слишком поздно, чтобы быть ошибочным при установке клиента.

Ответы [ 2 ]

1 голос
/ 12 марта 2020

В моем случае я должен поместить SignalR.cs в мой root путь .

enter image description here

Затем в представление, которое я включаю в сценарий:

<script src="~/signalr/hubs"></script>

Вот как выглядит мой SignalR.cs:

public class NotificationHub : Hub
{
    public void SendUpdateNotification(string message)
    {
        // message = "show" / "hide"
        if (message.Equals("show"))
            Config._MaintenanceMode = true;
        else
            Config._MaintenanceMode = false;

        // Call the broadcastUpdate method to update clients.
        Clients.All.broadcastUpdate(message);
    }
}
0 голосов
/ 07 марта 2020

Для обработки ошибок, возникающих в SignalR, вы можете добавить обработчик для события ошибки в объекте соединения

connection.Error += ex => Console.WriteLine("SignalR error: {0}", ex.StackTrace);

Для обработки ошибок из вызовов методов оберните код в блоке try-catch.

HubConnection connection = new HubConnection(_applicationConfiguration.ApiBaseUri + "/signalr");
try
{   
    await connection.Start(); 
}
catch (Exception ex)
{
    Console.WriteLine("Error " + ex);
}

Чтобы включить подробные сообщения об ошибках в целях устранения неполадок,

var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableDetailedErrors = true;
App.MapSignalR(hubConfiguration);

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

Console.WriteLine("Exception " + exceptionContext.Error.Message);
base.OnIncomingError(exceptionContext, invokerContext);

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

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        GlobalHost.HubPipeline.AddModule(new HubErrorHandlingModule());

        app.MapSignalR();
    }
}

Ссылки:

SignalR Уведомлять пользователя о разъединениях
SingalR Как обрабатывать ошибки
Внутренняя ошибка сервера SignalR 500

...