Как получить доступ к IUrlHelper из SignalR Hub?

Как правильно получить доступ к IUrlHelper из моего класса SignalR Hub (ASP.Net Core 2.1)?

Я пытаюсь динамически генерировать ссылки на различные действия внутри класса Hub.


person Mohammed Noureldin    schedule 18.06.2018    source источник


Ответы (1)


Тебе нельзя. UrlHelper требуется экземпляр ActionContext для создания URL-адресов, который существует только в контексте запроса. Концентратор SignalR существует вне конвейера запросов. Вместо этого вы должны передать URL-адрес в соответствующий метод концентратора из того места, где UrlHelper действительно существует, например, действие контроллера, вместо того, чтобы полагаться на концентратор для его создания.

person Chris Pratt    schedule 18.06.2018
comment
Но мои ссылки генерируются в зависимости от сообщений SignalR, я видел разные ответы там, где это было возможно до .Net Core 2.0, но с 2.1 он, похоже, больше не работает. - person Mohammed Noureldin; 18.06.2018
comment
Я не думаю, что это возможно когда-либо, поскольку концентратор никогда не был частью конвейера запросов. - person Chris Pratt; 18.06.2018
comment
Это пример того, что я нашел. Что вы думаете по этому поводу? stackoverflow.com/questions/37322076/. Это не обязательно случай SignalR, но они вводят IUrlHelper и ActionContext (что не работает для меня, поскольку ActionContext имеет значение null) - person Mohammed Noureldin; 18.06.2018
comment
Поскольку в этом случае предполагается, что вы используете пример класса службы в конвейере запросов, где ActionContext фактически существует. Если вы попытаетесь использовать этот класс обслуживания в чем-то вроде обычного консольного приложения, это тоже не удастся. ActionContext в вашем хабе имеет значение null, потому что, опять же, хаб не является частью конвейера запросов. - person Chris Pratt; 18.06.2018
comment
Хорошо, я понимаю, спасибо. Не могли бы вы показать простой код вашего последнего предложения? Вместо этого вы должны передать URL-адрес в соответствующий метод концентратора из того места, где существует UrlHelper, например, действие контроллера, вместо того, чтобы полагаться на концентратор для его создания. Потому что у меня не могло быть хорошего воображения о том, как это можно сделать. - person Mohammed Noureldin; 18.06.2018
comment
Могу подтвердить, что это не работает в ASP.NET Core 2.1. Похоже, что существовал обходной путь для старого ASP.NET Core 4.x с каким-то ложным контекстом. Кажется, не работает в .NET Core, поскольку используемые классы, такие как HttpRequest или HttpContext, абстрактны. Нет ли подобного в .NET Core 2.1? - person Lion; 18.08.2019