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

Posted

技术标签:

【中文标题】在 Windows 服务中使用自托管托管 SignalR【英文标题】:Hosting SignalR with self host in Windows Service 【发布时间】:2013-07-14 15:06:14 【问题描述】:

我是 signalR 和 Owin 的新手,需要帮助。

我在一个库中编写了所有 signalR 代码 [我的集线器将是自托管的]。然后我从 Windows 服务应用程序中引用了该库,在 Windows 服务应用程序中安装了包“Microsoft.Owin.Host.HttpListener”并尝试执行它。 我收到了有线异常:

序列不包含匹配元素

我在一个 winForm 应用程序中测试了我的库,它工作正常。

我不知道为什么会这样。

更新:代码示例: 在我的图书馆“myLib”

私有 IDisposable 主机;

    private bool Start()
            
                try
                            
                               string url = "http://localhost:5000/";
                   host = SelfHost.Host(url);
                            
                            catch (Exception ex)
                            
                               log.WriteLine("************HOSTING FAILED                  ********************************* ex.ToString():"+ ex.ToString()+
                               " Ex.StackTrace: "+ex.StackTrace +" EX.Message: " + ex.Message + "***************"); 
                               
            

private bool Stop()
        
            if (host != null)
            
                host.Dispose();
            
        

我的 SelfHost 课程:

class SelfHost
    
        public static IDisposable Host(string url)
        
            return WebApplication.Start<SelfHost>(url);
        

        public void Configuration(IAppBuilder app)
        
            // Turn cross domain on 
            var config = new HubConfiguration  EnableCrossDomain = true ;

            // This will map out to http://localhost:8080/signalr by default
            app.MapHubs(config);
        

    

在我的 Windows 服务应用程序中从此库创建对象后:

myLib l = new myLib();

我实现了 Windows 服务的 OnStart(),它启动了一个从 myLib 调用 Start() 函数的线程:

protected override void OnStart(string[] args)
    
      Thread t = new Thread(new ThreadStart(this.StartServiceThread));
      t.CurrentCulture = new System.Globalization.CultureInfo("en-US");
      t.Start();
    
 private void StartServiceThread()
    
     l.Start();
    

输出 [Ex-Details]

************HOSTING FAILED ********************************* 
ex.ToString():
    System.InvalidOperationException: Sequence contains no matching element
       at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source, Func`2 predicate)
       at Microsoft.Owin.Hosting.ServerFactory.DefaultServerFactoryLoader.Load(String serverName)
       at Microsoft.Owin.Hosting.KatanaEngine.ResolveServerFactory(StartContext context)
       at Microsoft.Owin.Hosting.KatanaEngine.Start(StartContext context)
       at Microsoft.Owin.Hosting.Starter.DirectHostingStarter.Start(StartOptions options)
       at Microsoft.Owin.Hosting.KatanaStarter.Start(StartOptions options)
       at Microsoft.Owin.Hosting.WebApplication.Start[TStartup](IServiceProvider services, StartOptions options)
       at Microsoft.Owin.Hosting.WebApplication.Start[TStartup](StartOptions options)
       at Microsoft.Owin.Hosting.WebApplication.Start[TStartup](String url)
       at SelfHost.Host(String url) in SelfHost.cs:line 29
       at myLib.Start() in myLib.cs:line 381

 Ex.StackTrace:
    at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source, Func`2 predicate)
       at Microsoft.Owin.Hosting.ServerFactory.DefaultServerFactoryLoader.Load(String serverName)
       at Microsoft.Owin.Hosting.KatanaEngine.ResolveServerFactory(StartContext context)
       at Microsoft.Owin.Hosting.KatanaEngine.Start(StartContext context)
       at Microsoft.Owin.Hosting.Starter.DirectHostingStarter.Start(StartOptions options)
       at Microsoft.Owin.Hosting.KatanaStarter.Start(StartOptions options)
       at Microsoft.Owin.Hosting.WebApplication.Start[TStartup](IServiceProvider services, StartOptions options)
       at Microsoft.Owin.Hosting.WebApplication.Start[TStartup](StartOptions options)
       at Microsoft.Owin.Hosting.WebApplication.Start[TStartup](String url)
       at SelfHost.Host(String url) in SelfHost.cs:line 29
       at myLib.Start() in myLib.cs:line 381 
EX.Message: Sequence contains no matching element***************

提前致谢!

【问题讨论】:

请展示一些示例代码 请提供异常的完整细节,包括堆栈跟踪(.ToString() 它)。 我做到了,看看我的更新 这里有一个相关链接,让其他尝试从 Windows 服务托管 SignalR 的人更容易做到这一点:west-wind.com/weblog/posts/2013/Sep/04/… 【参考方案1】:

我发现了问题所在。我在两个月前编写了 myLib 代码,并正在使用我在 2 个月前编写的 winForms 应用程序对其进行测试。

但是昨天我在我的 Windows 服务应用程序中安装了新的 Owin 包,并尝试使用我之前编写的同一个库,所以我得到了错误。

问题是myLib(Owin.Hosting的旧版本)中的NuGetPackage与12天前发布的新包版本不兼容。新的更改不支持 WebApplication(来自旧版本)。现在称为 WebApp。

【讨论】:

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

选择使用 IIS 进行 WCF 服务托管或使用 Windows 服务进行自托管

将 Web Api 服务自托管到 Windows 窗体中

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

连接到 Windows 服务中自托管的 SignalR 的问题

WCF 作为 Windows 服务托管 - 自定义 HTTP 标头未反映在响应标头上

NancyFx+SignalR 自托管和 Windows 服务