Service Fabric:在基于Kestrel的无状态服务中支持HTTP和HTTPS

时间:2017-03-15 15:55:17

标签: c# stateless kestrel

我有一个现有的无状态ASP.Net Core MVC服务结构服务,默认情况下(由向导生成代码)使用HTTP。我们还需要使用相同的控制器在同一服务中支持HTTPS。

ServiceManifest.xml中定义了两个端点:

<Endpoints>
  <Endpoint Protocol="http" Name="HttpEndpoint" Type="Input" Port="16080" />
  <Endpoint Protocol="https" Name="HttpsEndpoint" Type="Input" Port="16443" />
</Endpoints>

这里是来自StatelessService派生类的GetServiceInstanceListeners重写:

    protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
    {
        return new ServiceInstanceListener[]
        {
            new ServiceInstanceListener(serviceContext =>
                new WebListenerCommunicationListener(serviceContext, "HttpEndpoint", url =>
                {
                    ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting WebListener on {url}");

                    return new WebHostBuilder()
                                .UseKestrel(
                                    options =>
                                    {
                                        options.NoDelay = true;
                                        options.UseConnectionLogging();
                                    })
                                .ConfigureServices(services => services.AddSingleton<StatelessServiceContext>(serviceContext))
                                .UseContentRoot(Directory.GetCurrentDirectory())
                                .UseStartup<Startup>()
                                .UseUrls(url)
                                .Build();
                }))
            ,
            new ServiceInstanceListener(serviceContext =>
                new WebListenerCommunicationListener(serviceContext, "HttpsEndpoint", url =>
                {
                    ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting WebListener on {url}");

                    return new WebHostBuilder()
                                .UseKestrel(
                                    options =>
                                    {
                                        options.NoDelay = true;
                                        options.UseHttps("mycert.pfx", "this_isnt_the_password");
                                        options.UseConnectionLogging();
                                    })
                                .ConfigureServices(services => services.AddSingleton<StatelessServiceContext>(serviceContext))
                                .UseContentRoot(Directory.GetCurrentDirectory())
                                .UseStartup<Startup>()
                                .UseUrls(url)
                                .Build();
                }))

        };

运行时没有错误,并且服务确实绑定到端口,但是在尝试连接时我拒绝连接,没有解释原因。

禁用Windows防火墙。

我知道这是代码(或框架/产品)的问题,因为如果我注释掉其中一个侦听器,另一个工作,就在它的相应端口上。但是当两者都被实例化时,都不起作用。它们似乎在某种程度上相互干扰,我不知道它的能力如何。

我尝试从UseKestrel()切换到UseWebListener()并观察到相同的行为。所以这不是Kestrel特有的问题。

我试过让它通过在端点中不指定端口来选择端口,并观察到相同的行为。

简而言之,我被困住了。

0 个答案:

没有答案