Как получить полный стек исключения, возникающего в веб-приложении, работающем иным образом, во время настройки соединения 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, так что, вероятно, это происходит слишком поздно, чтобы быть ошибочным при установке клиента.