2017-06-20 255 views
1

我使用Microsoft.AspNet.SignalRMicrosoft.AspNetCore.Server.Kestrel来承载signalR集线器。服务器启动成功。但是,如果客户端尝试连接到SignalR集线器,则服务器上出现以下错误。Microsoft.AspNetCore.Server.Ketrel:错误:没有为此对象定义的无参数构造函数

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 

里面配置方法,下面的代码用来配置SignalR。

app.UseAppBuilder(appBuilder => appBuilder.MapSignalR(
    new Microsoft.AspNet.SignalR.HubConfiguration 
    { 
     EnableDetailedErrors = true, 
    })); 

Hub将服务作为构造参数使用UnityContainer注入。

任何人都可以找出问题吗?

回答

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; 
     })); 
    } 
} 
相关问题