Я установил Ninject для работы с SignalR (размещенным на IIS), как описано в ответе на этот вопрос: SignalR 2 Dependency Injection with Ninject.Инъекция HttpContextBase с Ninject 3 и SignalR 2.0
Это работает в большинстве случаев, за исключением случаев, когда клиент отключается от концентратора. HttpContext.Current
переменная null
и, таким образом, Ninject не может вводить значение и выдает исключение.
Я прочитал эту проблему и выяснил, что большинство людей рекомендует, чтобы текущий HttpContext
был получен из IRequest.GetHttpContext()
(доступный из контекста концентраторов). К сожалению, это не помогает при попытке вставить значение (я мог бы передать контекст из концентратора, но это может привести к поражению цели инъекции зависимостей).
пример кода (некоторые части удалены для краткости):
public class TestHub : Hub
{
public TestHub(ITestService testService)
{
TestService = testService;
}
// When the disconnection request is issued, a ArgumentNullException
// for the HttpContext construction is thrown
public override Task OnDisconnected(bool stopCalled)
{
TestService.DoSomething();
}
}
public class TestService : ITestService
{
public TestService(HttpContextBase httpContext)
{
HttpContext = httpContext;
}
public void DoSomething()
{
// Service uses some data from the httpContext
TestLogger.Log(HttpContext.User.Identity.Name);
}
}
Есть ли способ, чтобы ввести HttpContextBase
в сферу услуг, которые в свою очередь, закачиваемой в SignalR концентраторы без доступа HttpContext.Current
?
как вы получить доступ к контексту концентраторы? – BatteryBackupUnit
Я получаю доступ к контексту хабов через свойство 'Context' (типа' HubCallerContext'), находящееся в базовом классе 'Hub'. Затем это свойство предоставляет доступ к контексту http через «Context.Request.GetHttpContext()». – betelgewse