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.EventHandler1.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.NancyBootstrapperBase1.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

异常的实际错误消息是什么(请翻译自乌克兰语/俄语;))

您/您是否也需要Disposestartup 实例?

您能否从代码中删除 Nancy 或 SignalR,以尝试确定哪个管道项出现故障?

【讨论】:

以上是关于NancyFx+SignalR 自托管和 Windows 服务的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的自托管 NancyFX 应用程序在通过 HTTPS 运行时会挂起?

在SSL / https下托管SignalR

在 Windows 服务中使用自托管托管 SignalR

SignalR 自托管与 WCF 服务和客户端将是桌面用户

为啥没有查询参数被传递到我的 NancyFX 模块?

SignalR 自托管 Windows 服务,监听消息