我想注入一个SignalR IHubContext
到 ASP.NET MVC 5 应用程序 Framework 4.72(不是 .NET Core)中的 Web API 2.x 控制器中。当调用Web API控制器时,它正在抛出这个异常。MyController
:
在尝试创建类型为'MyController'的控制器时发生错误。请确保控制器有一个无参数的公共构造函数。
内部异常说。
在类型'MyController'上用'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'找到的构造函数都不能用可用的服务和参数来调用。无法解析参数'Microsoft.AspNet.SignalR.IHubContext'。
[MyHub] context' of constructor 'Void .ctor(Microsoft.AspNet.SignalR.IHubContext
MyHub])'。
我不介意使用属性注入来做这件事,但没有任何运气让它工作。所以我正在做注入到控制器的c'tor中。
我按照这些答案寻求帮助。
这是Web API控制器。
public class MyController : WebApiController
{
public IHubContext<MyHub> Context { get; set; }
public MyController(IHubContext<MyHub> context)
{
Context = context;
}
}
这里是相关的部分。Startup.cs
:
public void Configuration(IAppBuilder app)
{
// Other code...
var builder = new ContainerBuilder();
var config = new HttpConfiguration();
builder.RegisterHubs(Assembly.GetExecutingAssembly());
builder.RegisterControllers(typeof(MvcApplication).Assembly)
.InstancePerRequest();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly())
.InstancePerRequest();
builder.RegisterType<AutofacDependencyResolver>()
.As<IDependencyResolver>()
.SingleInstance();
builder
.Register(c => c.Resolve<IConnectionManager>().GetHubContext<MyHub>())
.Named<IHubContext>("MyHub");
builder.RegisterType<MyController>()
.WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(IHubContext),
(pi, ctx) => ctx.ResolveNamed<IHubContext>("MyHub")
)
);
var container = builder.Build();
app.UseAutofacMiddleware(container);
DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(container));
config.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container);
app.Map("/signalr", map =>
{
var hubConfiguration = new HubConfiguration
{
Resolver = new AutofacDependencyResolver(container),
};
map.RunSignalR(hubConfiguration);
});
}
我缺什么?谢谢,我想把SignalR IHubContext注入到ASP.NET MVC 5应用程序的Web API 2.x控制器中。
你的第一个问题是 typeof(IHubContext)
不等于 typeof(IHubContext<MyHub>)
. 你可以通过使用。
pi.ParameterType == typeof(IHubContext).MakeGenericType(typeof(MyHub))
然而,旧版本的SignalR并不支持通用接口,所以如果你保持比较的原样,并注入一个通用接口,可能会更好。IHubContext
而非 IHubContext<MyHub>
在 MyController
.
你能试着加上这个吗?
app.UseSignalR(routes =>
{
routes.MapHub<MyHub>("/MyHub");
});