Для меня это было результатом того, что мой концентратор SignalR потребовал параметр внедрения зависимости.Ошибка становится довольно хорошо скрытой, даже если для ShowDetailedErrors установлено значение true, она была скрыта, кроме как в журналах сервера Azure.
Полученная ошибка выглядит примерно так:
System.MissingMethodException:
at System.RuntimeTypeHandle.CreateInstance (mscorlib, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.RuntimeType.CreateInstanceSlow (mscorlib, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.RuntimeType.CreateInstanceDefaultCtor (mscorlib, Version=4.0.0.0,
at Microsoft.AspNet.SignalR.Hubs.DefaultHubActivator.Create
(Microsoft.AspNet.SignalR.Core, Version=2.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
Как вы можете видеть, я использовал DefaultHubActivator, который не знает, как управлять параметрами инжектора.Итак, я следовал этому хорошему совету, который научил меня, как делать инъекцию с использованием Unity.
Основы в том, что вам нужно написать свой собственный активатор-концентратор, но вы можете наследовать от стандартного ипросто расширьте его, чтобы избежать необходимости регистрировать десятки зависимостей, которые есть у SignalR.
public class SignalRUnityDependencyResolver : DefaultDependencyResolver
{
private readonly IUnityContainer _container;
public SignalRUnityDependencyResolver(IUnityContainer container)
{
_container = container ?? throw new ArgumentNullException(nameof(container));
}
public override object GetService(Type serviceType)
{
return _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : base.GetService(serviceType);
}
public override IEnumerable<object> GetServices(Type serviceType)
{
return _container.IsRegistered(serviceType) ? _container.ResolveAll(serviceType) : base.GetServices(serviceType);
}
}
После чего вы устанавливаете его в своем автозагрузке
app.Map("/signalr", map =>
{
var hubConfiguration = new HubConfiguration()
{
EnableJSONP = true,
EnableDetailedErrors = true,
Resolver = new SignalRUnityDependencyResolver(UnityConfig.GetContainer())
};
map.RunSignalR(hubConfiguration);
logger.WriteInfo("Started signalr.");
});
Наконец-то зарегистрируйте свой концентратор в Unity
container.RegisterType<MyHub>(new InjectionFactory((obj) => new MyHub(obj.Resolve<ILogger>())));