我正在尝试将signalR hub作为使用MEF的插件的一部分。但是在List<>上调用ImportMany之后对象,然后在Global.asax文件的Application_Start()方法中添加目录/容器/ ComposeParts部分,我得到的是:
未捕获的TypeError:无法读取未定义的属性“server”。
如果问题来自我的界面,插件,global.asax文件或javascript,我不知道。
界面:
public interface IPlugin
{
}
插件:
[Export(typeof(IPlugin))]
[HubName("testHub")]
public class TestHub : Hub, IPlugin
{
public string Message()
{
return "Hello World!";
}
}
Global.asax文件中的:
[ImportMany(typeof (IPlugin))]
private IEnumerable<IPlugin> _plugins { get; set; }
protected void Application_Start()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog(@"./Plugins"));
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
RouteTable.Routes.MapHubs();
//log4net
log4net.Config.XmlConfigurator.Configure();
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
最后是javascript:
$(document).ready(function () {
$.connection.hub.url = 'http://127.0.0.1/signalr/';
var proxy = $.connection.testHub;
$.connection.hub.start({ transport: ['webSockets', 'serverSentEvents', 'longPolling'] })
.done(function () {
proxy.invoke('Message').done(function(res) {
alert(res);
});
})
.fail(function () { alert("Could not Connect!"); });
});
我发现的唯一信息是this post,但我无法使其发挥作用。当我手动添加引用时,一切正常,但是当我在加载插件后查看“signalr / hubs”时,则没有引用我的hub的方法。
非常感谢你的帮助。
答案 0 :(得分:3)
你的问题是第一次请求SignalR caches the generated "signalr/hubs" proxy script。 SignalR提供缓存脚本以响应每个后续请求&#34; signalr / hubs&#34;。
SignalR不仅缓存脚本本身,而且还在进程开始时找到它caches the collection of Hubs。
您可以解决缓存的代理脚本问题by simply not using the proxy script,但仍然无法实际连接到流程启动后加载的程序集中定义的集线器。
如果您希望能够连接到此类集线器,则需要实现自己的IHubDescriptorProvider,该DependencyResolver知道在运行时加载的插件中定义的集线器。
您可以向SignalR&#39; HubConfiguration注册您的提供商,可以通过您传递到MapSignalR的{{3}}对象的Resolver
属性将其传递到SignalR。
也就是说,每当插件添加到&#34; ./ Plugins&#34;时,重启app pool / server进程可能会更容易。 。目录