我正在使用Microsoft.AspNet.SignalR
与Microsoft.AspNetCore.Server.Kestrel
来托管signalR集线器。服务器启动成功。但是,如果客户端尝试连接到SignalR集线器,则会在服务器上出现以下错误。
Microsoft.AspNetCore.Server.Kestrel: Error: Connection id "0HL5NPEI2QFM0": An unhandled exception was thrown by the application.
System.MissingMethodException: No parameterless constructor defined for this object.
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
at Microsoft.AspNet.SignalR.Hubs.DefaultHubActivator.Create(HubDescriptor descriptor)
at Microsoft.AspNet.SignalR.Hubs.DefaultHubManager.ResolveHub(String hubName)
at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.CreateHub(IRequest request, HubDescriptor descriptor, String connectionId, StateChangeTracker tracker, Boolean throwIfFailedToCreate)
at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.OnReceived(IRequest request, String connectionId, String data)
at Microsoft.AspNet.SignalR.PersistentConnection.<>c__DisplayClass64_1.<ProcessRequestPostGroupRead>b__5()
at Microsoft.AspNet.SignalR.TaskAsyncHelper.FromMethod(Func`1 func)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNet.SignalR.Transports.ForeverTransport.<ProcessSendRequest>d__40.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Owin.Mapping.MapMiddleware.<Invoke>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Owin.WebSocketAcceptAdapter.<>c__DisplayClass6_0.<<AdaptWebSockets>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.<Invoke>d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.<Invoke>d__6.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Builder.RouterMiddleware.<Invoke>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Hosting.Internal.RequestServicesContainerMiddleware.<Invoke>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame`1.<RequestProcessingAsync>d__2.MoveNext()
Microsoft.AspNetCore.Hosting.Internal.WebHost: Information: Request finished in 43.3861ms 200
在Configure方法中,以下代码用于配置SignalR。
app.UseAppBuilder(appBuilder => appBuilder.MapSignalR(
new Microsoft.AspNet.SignalR.HubConfiguration
{
EnableDetailedErrors = true,
}));
Hub将服务作为构造函数参数,使用UnityContainer注入。
有人能解决这个问题吗?
答案 0 :(得分:1)
如果有人对此解决方案感兴趣。 HubConfiguration上的解析器丢失了。以下对我有用。
appBuilder.MapSignalR(new Microsoft.AspNet.SignalR.HubConfiguration
{
EnableDetailedErrors = true,
Resolver = new UnityResolver(_unityContainer),
});
UnityResolver类:
public class UnityResolver : Microsoft.AspNet.SignalR.DefaultDependencyResolver, Microsoft.AspNet.SignalR.IDependencyResolver
{
private IUnityContainer container;
public UnityResolver(Microsoft.Practices.Unity.IUnityContainer container)
{
this.container = container;
}
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
container.Dispose();
}
public object GetService(Type serviceType)
{
try
{
return container.Resolve(serviceType);
}
catch
{
return base.GetService(serviceType);
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
var services = container.ResolveAll(serviceType).ToList();
object defaultService = GetService(serviceType);
if (defaultService != null)
{
services.Add(defaultService);
}
return services;
}
catch
{
return base.GetServices(serviceType);
}
}
public void Register(Type serviceType, Func<object> activator)
{
container.RegisterType(serviceType, new InjectionFactory((c) => activator.Invoke()));
base.Register(serviceType, activator);
}
public void Register(Type serviceType, IEnumerable<Func<object>> activators)
{
container.RegisterType(serviceType, new InjectionFactory((c) =>
{
object returnObject = null;
foreach (var activator in activators)
{
object tempObject = activator.Invoke();
if (tempObject != null)
{
returnObject = tempObject;
break;
}
}
return returnObject;
}));
}
}