gpt4 book ai didi

mef - 使用 MEF 加载插件后映射 SignalR Hub

转载 作者:行者123 更新时间:2023-12-01 02:26:17 27 4
gpt4 key购买 nike

我正在尝试将 signalR 集线器作为使用 MEF 的插件的一部分。但是在 List<> 对象上调用 ImportMany 然后在 Global.asax 文件的 Application_Start() 方法中添加目录/容器/ComposeParts 部分后,我得到的是:

未捕获的类型错误:无法读取未定义的属性“服务器”。

我不知道问题是出自我的界面、插件、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 方法。

非常感谢你的帮助。

最佳答案

您的问题是 SignalR caches the generated "signalr/hubs" proxy script第一次请求。 SignalR 提供缓存脚本以响应对“signalr/hubs”的每个后续请求。

SignalR 不仅缓存脚本本身,而且还缓存 caches the collection of Hubs它在进程开始时找到。

您可以解决缓存代理脚本问题 by simply not using the proxy script ,但这仍然无法让您实际连接到在流程开始后加载的程序集中定义的集线器。

如果您希望能够连接到此类集线器,您需要实现自己的 IHubDescriptorProvider知道在运行时加载的插件中定义的集线器。

您可以向 SignalR 的 DependencyResolver 注册您的提供商可以通过 Resolver 传递到 SignalR HubConfiguration 的属性(property)您传入的对象 MapSignalR .

也就是说,每当将插件添加到“./Plugins”目录时,重新启动应用程序池/服务器进程可能会更容易。

关于mef - 使用 MEF 加载插件后映射 SignalR Hub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16143948/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com