【问题标题】:Microsoft.AspNetCore.Server.Kestrel: Error: No parameterless constructor defined for this objectMicrosoft.AspNetCore.Server.Kestrel:错误:没有为此对象定义无参数构造函数
【发布时间】:2017-06-23 23:46:37
【问题描述】:

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

谁能解决这个问题?

【问题讨论】:

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


    【解决方案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;
            }));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多