NancyFx+SignalR 自托管和 Windows 服务
Posted
技术标签:
【中文标题】NancyFx+SignalR 自托管和 Windows 服务【英文标题】:NancyFx+SignalR self host and Windows service 【发布时间】:2015-12-15 05:52:07 【问题描述】:请帮我解决一个问题。 我使用 NancyFx 并且为了代码优化,我决定只使用 OWIN SelfHost 不使用 NancyFx SelfHost。 我在放置代码的位置创建 Windows 服务(OnStart 函数)
_s7Comm = _container.Resolve<IS7Comm>(); // s7 controller class connection _context = Rhs60Hub.HubContext; // hub context // events for send info to hub from s7 _s7Comm.OnErrorEvent += S7CommOnErrorEvent; ...... var startup = _container.Resolve<Startup>(); // use Unity IoC Service = WebApp.Start("http://+:8081/", startup.Configuration);
在 Windows Service Helper 的帮助下启动服务 - 一切正常。 做服务停止,代码(OnStop函数)
_s7Comm.OnErrorEvent -= S7CommOnErrorEvent; .....
_s7Comm.Dispose(); // 释放对象中的所有任务
Service.Dispose(); // 停止南希
再次启动 - 初始化 NancyFX 的分支不会启动,但会出现异常 NullReferenceException。 我的 Owin 入门课程
app.UseCors(CorsOptions.AllowAll); app.MapSignalR("/signalr", new HubConfiguration() EnableDetailedErrors = true, EnableJSONP = true, EnablejavascriptProxies = true ); app.UseNancy(options => options.Bootstrapper = new Bootstrapper(UnityHelper.GetConfiguredContainer()));
为了测试,我在包 NancyFx SelfHost 的帮助下确定了 NancyFX 的启动 - 一切都很好,开始了吗?停止并重新启动。
(OnStart 函数)
_s7Comm = _container.Resolve(); // s7 控制器类连接 _context = Rhs60Hub.HubContext; // 集线器上下文
// 从 s7 向集线器发送信息的事件 _s7Comm.OnErrorEvent += S7CommOnErrorEvent; ......
_host = new NancyHost(new Uri("http://localhost:8082"), new Bootstrapper(_container));
_host.Start();
var 启动 = _container.Resolve(); // 使用 Unity IoC
Service = WebApp.Start("http://+:8081/", startup.Configuration);
并从带有 nancyFx 定义的 Start 类中删除字符串
OWIN 中使用主机的问题在哪里? 代码 debuf 显示容器已初始化并且所有依赖项都存在。 我怎么能发现依赖不存在?向您展示堆栈跟踪
> в Microsoft.Practices.Unity.UnityDefaultBehaviorExtension.SetLifetimeManager( 类型生命周期类型、字符串名称、LifetimeManager 生命周期管理器)\r\n в Microsoft.Practices.Unity.UnityDefaultBehaviorExtension.OnRegisterInstance (对象发送方,RegisterInstanceEventArgs e)\r\n в System.EventHandler
1.Invoke(Object sender, TEventArgs e)\r\n в Microsoft.Practices.Unity.UnityContainer.RegisterInstance (Type t, String name, Object instance, LifetimeManager lifetime)\r\n в Microsoft.Practices.Unity.UnityContainerExtensions.RegisterInstance[TInterface](IUnityContainer container, TInterface instance, LifetimeManager lifetimeManager)\r\n в Nancy.Bootstrappers.Unity.UnityNancyBootstrapper.RegisterBootstrapperTypes(IUnityContainer applicationContainer)\r\n в Nancy.Bootstrapper.NancyBootstrapperBase
1.Initialise()\r\n в Nancy.Owin.NancyMiddleware.UseNancy(NancyOptions 选项)\r\n в Owin.AppBuilderExtensions.UseNancy(IAppBuilder 构建器,NancyOptions 选项)\r\n в Owin.AppBuilderExtensions.UseNancy(IAppBuilder builder, Action`1 配置)\r\n - RHS60SystemService.Startup.Configuration(IAppBuilder 应用程序) в c:\......\Startup.cs:строка 16" 字符串
字符串 16 是
app.UseNancy(options => options.Bootstrapper = new Bootstrapper(UnityHelper.GetConfiguredContainer()));
【问题讨论】:
【参考方案1】:您从Unity
解决的项目的生命周期管理器是什么?它们是默认的transient
,还是您使用其他东西? (Unity) Understanding Lifetime Managers
异常的实际错误消息是什么(请翻译自乌克兰语/俄语;))
您/您是否也需要Dispose
的startup
实例?
您能否从代码中删除 Nancy 或 SignalR,以尝试确定哪个管道项出现故障?
【讨论】:
以上是关于NancyFx+SignalR 自托管和 Windows 服务的主要内容,如果未能解决你的问题,请参考以下文章