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

Posted

技术标签:

【中文标题】为啥我的自托管 NancyFX 应用程序在通过 HTTPS 运行时会挂起?【英文标题】:Why does my Self-Hosted NancyFX application hang when running over HTTPS?为什么我的自托管 NancyFX 应用程序在通过 HTTPS 运行时会挂起? 【发布时间】:2013-06-05 22:16:55 【问题描述】:

我写了一个 Nancy self-hosted 应用程序。这旨在作为没有任何客户端接口的 API 运行。因此它是一个通过TopShelf 部署的控制台应用程序(参见下面的代码)

只要我在标准 http 上运行,一切正常。但是我需要通过在 https 上运行它来保护这个 API(参见下面的 SSL 设置部分)

一旦我让服务通过 https 运行,服务就会在第一次调用后挂起。需要明确的是,第一个电话工作正常,我收到了正确的回复。然而,一定是出了点问题,因为第二次调用挂起并且只在超时后才返回。

这是 Nancy 自助托管中的错误还是我在代码/设置中犯了错误?

谢谢。

控制台应用程序

public class Program

    [STAThread]
    public static void Main()
    
        HostFactory.Run(config => 
            config.Service<SelfHost>(service =>
            
                service.ConstructUsing(name => new SelfHost());
                service.WhenStarted(s=> s.Start());
                service.WhenStopped(s=> s.Stop());
            );
            config.RunAsLocalSystem();
            config.StartAutomatically();
        );
    

自托管控制器

public class SelfHost

    private NancyHost nancyHost;

    public void Start()
    
        var config = new HostConfiguration  
            UnhandledExceptionCallback = e => Log.Error("Self Host Exception", e) 
        ;
        nancyHost = new NancyHost(config, new Uri("https://myurl.com:8081"));
        nancyHost.Start();
    

    public void Stop()
    
        nancyHost.Stop();
    

南希模块

public class RootModule : NancyModule

    public RootModule()
    
        Get["/"] = _ =>
        
            return "Service is Running";
        ;
    

SSL 设置

netsh http add sslcert ipport=0.0.0.0:8081 certhash=XXXX880f5e33288a4c88bb1d321d88d44d2XXXX appid=xxxxxxxx-e7e9-xxxx-94dd-5634a472f42d
netsh http add urlacl url=https://myurl.com:8081/ user=MYDOMAIN\my-admin-user

编辑 1

按照@Steven Robbins 的建议,我现在使用预发布的 nuget 包重新编译。不幸的是,最新的预发布包并没有解决问题,但是我现在确实有一些非常有趣的日志信息。

日志

//First Call - success
12:51:10|GET| /
12:51:10|OK | Service is Running    

//Second Call failure                                                                                                                                                                                                                        
12:51:12|Self Host Exception
12:51:12| Method    :AsyncProcessClientCertificate
12:51:12| Message   :Element not found

//Restart Service
12:51:41|Stopping Service
12:51:41|Self Host Exception
12:51:41| Method    :EndGetContext
12:51:41| Message   :The I/O operation has been aborted because of either a thread exit or an application request
12:51:41|Self Host Exception
12:51:41| Method    :EndGetContext
12:51:41| Message   :The I/O operation has been aborted because of either a thread exit or an application request

12:51:43|Starting on https://myurl.net:8081

【问题讨论】:

【参考方案1】:

如果您将配置对象传递给 NancyHost 构造函数,您可以挂钩未捕获的错误 - 您可能会发现由于客户端证书所做的更改将在 0.18 中修复,但您可以得到修复现在,如果您从 CI 提要中获取它:

http://www.myget.org/gallery/nancyfx

【讨论】:

这已被确认为自托管 SSL 中的错误。所以我会接受这个答案并等待修复。 @biofractal 你真好 ;-) 它现在已经在 master 中修复了。

以上是关于为啥我的自托管 NancyFX 应用程序在通过 HTTPS 运行时会挂起?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NancyFX 自托管分块压缩响应

NancyFx+SignalR 自托管和 Windows 服务

NancyFx 2.0的开源框架的使用-CustomModule(自定义模块)

我可以在我的自托管 WCF 应用程序中使用 Let's Encrypt 证书吗?

为啥我的自定义 UITableViewCell 没有显示?

使用令牌身份验证的 Owin 托管 Web 应用程序