Service 服务结构本地群集ASP.NET核心https端点
我在Azure VM、Windows 2016上运行VS2017,从当前SDK(4/29/17)开始使用本地服务结构,单节点。在深入研究之前,尝试简单地创建一个环境验证应用程序。使用VS工具创建ASP.NET核心web应用程序。它可以直接构建、部署和运行。此多个端点的示例失败: 我所能找到的只是代码片段;没有在本地集群上工作的内容。Service 服务结构本地群集ASP.NET核心https端点,service,asp.net-core,azure-service-fabric,Service,Asp.net Core,Azure Service Fabric,我在Azure VM、Windows 2016上运行VS2017,从当前SDK(4/29/17)开始使用本地服务结构,单节点。在深入研究之前,尝试简单地创建一个环境验证应用程序。使用VS工具创建ASP.NET核心web应用程序。它可以直接构建、部署和运行。此多个端点的示例失败: 我所能找到的只是代码片段;没有在本地集群上工作的内容。 有人能告诉我一个工作示例,它是本地集群上的一个ASP.NET核心web应用程序,具有http和https端点。谢谢 在一个使用SF5.5和SDK2.5的ASP.NE
有人能告诉我一个工作示例,它是本地集群上的一个ASP.NET核心web应用程序,具有http和https端点。谢谢 在一个使用SF5.5和SDK2.5的ASP.NET核心项目(2017年3月)中,尝试简要介绍如何让http和https在本地计算机上同时工作。我显示代码和配置,并列出所有页面作为信息来源的参考。我不可能一个人做这件事。感谢社区
第1步:
创建本地SF群集要使用的证书。我喜欢这样创建证书。然后,我使用certmgr提取证书指纹以获取证书详细信息。
提示:当您从证书存储中复制指纹时,它将不起作用,我将其复制到记事本和Visual Studio代码中,然后将其粘贴到配置中。TChaing引用表示存在隐藏字符。我只是简单地输入(没有空格)。我知道证书有问题,因为事件查看器有错误消息,无法解析证书,这导致我得到了这个答案。
第二步:
对于我的应用程序和服务清单,Matt Kotsenas的文章非常棒。他还提供了一个创建侦听器的优雅解决方案,只需稍加调整即可使用我在代码清单中列出的ASP.Net内核。
代码:
ApplicationManifest文件
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="Web1Pkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
<!-- Add policies for service endpoints -->
<Policies>
<EndpointBindingPolicy EndpointRef="ServiceEndpointHttps" CertificateRef="MyCert" />
</Policies>
服务清单文件
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="Web1Pkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
<!-- Add policies for service endpoints -->
<Policies>
<EndpointBindingPolicy EndpointRef="ServiceEndpointHttps" CertificateRef="MyCert" />
</Policies>
在本例中,C#代码来自我的服务类“Web1”。有两种不同的方法来创建如下所示的侦听器。注释代码直接命名侦听器,如“ServiceEndpoint”和“HttpListner1”。这是ASP.NET核心中的新功能。如果有多个端点,则必须对其进行专门命名。如果未提供名称,ServiceEndpoint不会自动成为名称。未注释的代码使用提取来获取服务名称,然后创建listners。在本例中,我使用“endpoint”变量还根据需要为侦听器添加显式名称
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
//return new ServiceInstanceListener[]
//{
// new ServiceInstanceListener(serviceContext =>
// new WebListenerCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
// {
// ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting WebListener on {url}");
// return new WebHostBuilder().UseWebListener()
// .ConfigureServices(
// services => services
// .AddSingleton<StatelessServiceContext>(serviceContext))
// .UseContentRoot(Directory.GetCurrentDirectory())
// .UseStartup<Startup>()
// .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
// .UseUrls(url)
// .Build();
// }), "HttpListner1"),
// new ServiceInstanceListener(serviceContext =>
// new WebListenerCommunicationListener(serviceContext, "ServiceEndpointHttps", (url, listener) =>
// {
// ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting WebListener on {url}");
// return new WebHostBuilder().UseWebListener()
// .ConfigureServices(
// services => services
// .AddSingleton<StatelessServiceContext>(serviceContext))
// .UseContentRoot(Directory.GetCurrentDirectory())
// .UseStartup<Startup>()
// .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
// .UseUrls(url)
// .Build();
// }), "HttpsListner1")
//};
var endpoints = Context.CodePackageActivationContext.GetEndpoints()
.Where(endpoint => endpoint.Protocol == EndpointProtocol.Http || endpoint.Protocol == EndpointProtocol.Https)
.Select(endpoint => endpoint.Name);
var eps = endpoints.Select(endpoint =>
new ServiceInstanceListener(serviceContext =>
new WebListenerCommunicationListener(serviceContext, endpoint, (url, listener) =>
{
ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting WebListener on {url}");
return new WebHostBuilder().UseWebListener()
.ConfigureServices(
services => services
.AddSingleton<StatelessServiceContext>(serviceContext))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseUrls(url)
.Build();
}
), endpoint));
return eps;
}
受保护的重写IEnumerable CreateServiceInstanceListeners()
{
//返回新服务InstanceListener[]
//{
//新ServiceInstanceListener(serviceContext=>
//新的WebListenerCommunicationListener(serviceContext,“ServiceEndpoint”,(url,listener)=>
// {
//ServiceEventSource.Current.ServiceMessage(serviceContext,$“在{url}上启动WebListener”);
//返回新的WebHostBuilder().UseWebListener()
//.配置服务(
//服务=>服务
//.AddSingleton(serviceContext))
//.UseContentRoot(目录.GetCurrentDirectory())
//.UseStartup()
//.UseServiceFabricIntegration(侦听器,ServiceFabricIntegrationOptions.None)
//.useURL(url)
//.Build();
//}),“HttpListner1”),
//新ServiceInstanceListener(serviceContext=>
//新的WebListenerCommunicationListener(serviceContext,“ServiceEndpointHttps”,(url,侦听器)=>
// {
//ServiceEventSource.Current.ServiceMessage(serviceContext,$“在{url}上启动WebListener”);
//返回新的WebHostBuilder().UseWebListener()
//.配置服务(
//服务=>服务
//.AddSingleton(serviceContext))
//.UseContentRoot(目录.GetCurrentDirectory())
//.UseStartup()
//.UseServiceFabricIntegration(侦听器,ServiceFabricIntegrationOptions.None)
//.useURL(url)
//.Build();
//}),“HttpsListner1”)
//};
var endpoints=Context.CodePackageActivationContext.GetEndpoints()
.Where(endpoint=>endpoint.Protocol==EndpointProtocol.Http | | endpoint.Protocol==EndpointProtocol.Https)
.Select(endpoint=>endpoint.Name);
var eps=端点。选择(端点=>
新ServiceInstanceListener(serviceContext=>
新的WebListenerCommunicationListener(serviceContext,endpoint,(url,listener)=>
{
ServiceEventSource.Current.ServiceMessage(serviceContext,$“在{url}上启动WebListener”);
返回新的WebHostBuilder().UseWebListener()
.配置服务(
服务=>服务
.AddSingleton(serviceContext))
.UseContentRoot(目录.GetCurrentDirectory())
.UseStartup()
.UseServiceFabricIntegration(侦听器,ServiceFabricIntegrationOptions.None)
.useURL(url)
.Build();
}
)终点);
返回每股收益;
}
我希望这能为您带来所有缺失的部分。在一个ASP.NET核心项目中,通过SF5.5和SDK2.5(2017年3月),简要介绍如何让http和https在本地机器上同时工作。我显示代码和配置,并列出所有页面作为信息来源的参考。我不可能一个人做这件事。感谢社区
第1步:
创建本地SF群集要使用的证书。我喜欢这样创建证书。然后,我使用certmgr提取证书指纹以获取证书详细信息。
提示:当您从证书存储中复制指纹时,它将不起作用,我将复制
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
//return new ServiceInstanceListener[]
//{
// new ServiceInstanceListener(serviceContext =>
// new WebListenerCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
// {
// ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting WebListener on {url}");
// return new WebHostBuilder().UseWebListener()
// .ConfigureServices(
// services => services
// .AddSingleton<StatelessServiceContext>(serviceContext))
// .UseContentRoot(Directory.GetCurrentDirectory())
// .UseStartup<Startup>()
// .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
// .UseUrls(url)
// .Build();
// }), "HttpListner1"),
// new ServiceInstanceListener(serviceContext =>
// new WebListenerCommunicationListener(serviceContext, "ServiceEndpointHttps", (url, listener) =>
// {
// ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting WebListener on {url}");
// return new WebHostBuilder().UseWebListener()
// .ConfigureServices(
// services => services
// .AddSingleton<StatelessServiceContext>(serviceContext))
// .UseContentRoot(Directory.GetCurrentDirectory())
// .UseStartup<Startup>()
// .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
// .UseUrls(url)
// .Build();
// }), "HttpsListner1")
//};
var endpoints = Context.CodePackageActivationContext.GetEndpoints()
.Where(endpoint => endpoint.Protocol == EndpointProtocol.Http || endpoint.Protocol == EndpointProtocol.Https)
.Select(endpoint => endpoint.Name);
var eps = endpoints.Select(endpoint =>
new ServiceInstanceListener(serviceContext =>
new WebListenerCommunicationListener(serviceContext, endpoint, (url, listener) =>
{
ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting WebListener on {url}");
return new WebHostBuilder().UseWebListener()
.ConfigureServices(
services => services
.AddSingleton<StatelessServiceContext>(serviceContext))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseUrls(url)
.Build();
}
), endpoint));
return eps;
}