Microsoft.AspNetCore.Server.Kestrel:错误:没有为此对象定义无参数构造函数

时间:2017-06-20 14:38:33

标签: asp.net-core signalr asp.net-core-mvc kestrel

我正在使用Microsoft.AspNet.SignalRMicrosoft.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注入。

有人能解决这个问题吗?

1 个答案:

答案 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;
        }));
    }
}