2016-04-28 3 views
2

Ich möchte einen https-Endpunkt für meinen in einem lokalen Service Fabric (GA-Version) gehosteten statuslosen Cluster-Web-API-Dienst. Nachdem ich das erreicht habe, möchte ich meinen Cluster in Azure bereitstellen.Statusloser Web-API-Dienst mit HTTPS-Endpunkt löst Integritätszustandsfehler aus

Ich habe die Schritte im Artikel "Secure a Service Fabric cluster" der Service Fabric-Dokumentation ausgeführt und ein selbstsigniertes Zertifikat erstellt und in meinen Schlüsseltresor hochgeladen. Ich habe auch mein Zertifikat in den "Trusted People" -Laden meiner Maschine mit den Import-PfxCertificate Befehlen in Schritt 2.5 importiert.

AddCertToKeyVault:

Invoke-AddCertToKeyVault -SubscriptionId <Id> -ResourceGroupName 'ResourceGroupName' -Location 'West Europe' -VaultName 'VaultName' -CertificateName 'TestCert' -Password '****' -CreateSelfSignedCertificate -DnsName 'www.<clustername>.westeurope.cloudapp.azure.com' -OutputPath 'C:\MyCertificates' 

Nun stellte ich die ServiceManifest.xml, ApplicationManifest.xml (wie in RunAs: Run a Service Fabric application with different security permissions) und meine OwinCommunicationListener.cs:

ServiceManifest.xml (MasterDataServiceWebApi):

<?xml version="1.0" encoding="utf-8"?> 
<ServiceManifest Name="MasterDataServiceWebApiPkg" 
       Version="1.0.0" 
       xmlns="http://schemas.microsoft.com/2011/01/fabric" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ServiceTypes> 
    <StatelessServiceType ServiceTypeName="MasterDataServiceWebApiType" /> 
    </ServiceTypes> 

    <CodePackage Name="Code" Version="1.0.0"> 
    <EntryPoint> 
     <ExeHost> 
     <Program>MasterDataServiceWebApi.exe</Program> 
     </ExeHost> 
    </EntryPoint> 
    </CodePackage> 

    <ConfigPackage Name="Config" Version="1.0.0" /> 

    <Resources> 
    <Endpoints> 
     <Endpoint Name="ServiceEndpoint" Type="Input" Protocol="https" Port="5030" CertificateRef="TestCert"/> 
    </Endpoints> 
    </Resources> 
</ServiceManifest> 

ApplicationManifest:

<?xml version="1.0" encoding="utf-8"?> 
<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="exCHANGETestCluster2Type" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric"> 
    <Parameters> 
     <Parameter Name="MasterDataServiceWebApi_InstanceCount" DefaultValue="-1" /> 
    </Parameters> 
    <ServiceManifestImport> 
     <ServiceManifestRef ServiceManifestName="MasterDataServiceWebApiPkg" ServiceManifestVersion="1.0.0" /> 
     <ConfigOverrides /> 
     <Policies> 
     <EndpointBindingPolicy EndpointRef="ServiceEndpoint" CertificateRef="TestCert" /> 
     </Policies> 
    </ServiceManifestImport> 
    <DefaultServices> 
     <Service Name="MasterDataServiceWebApi"> 
     <StatelessService ServiceTypeName="MasterDataServiceWebApiType" InstanceCount="[MasterDataServiceWebApi_InstanceCount]"> 
      <SingletonPartition /> 
     </StatelessService> 
     </Service> 
    </DefaultServices> 
    <Certificates> 
     <EndpointCertificate X509FindValue="<Thumbprint>" Name="TestCert" /> 
    </Certificates> 
</ApplicationManifest> 

OwinCommunicationListener.cs:

[...] 
public Task<string> OpenAsync(CancellationToken cancellationToken) 
    { 
     var serviceEndpoint = this.serviceContext.CodePackageActivationContext.GetEndpoint(this.endpointName); 
     int port = serviceEndpoint.Port; //NEW! 

     if (this.serviceContext is StatefulServiceContext) 
     { 
     [...] 
     } 
     else if (this.serviceContext is StatelessServiceContext) 
     { 
     var protocol = serviceEndpoint.Protocol; 

     this.listeningAddress = string.Format(
      CultureInfo.InvariantCulture, 
      //"http://+:{0}/{1}", 
      "{0}://+:{1}/{2}", //NEW! 
      protocol, 
      port, 
      string.IsNullOrWhiteSpace(this.appRoot) 
       ? string.Empty 
       : this.appRoot.TrimEnd('/') + '/'); 
     } 
     else 
     { 
     throw new InvalidOperationException(); 
     } 
[...] 

Als ich den staatenlos Dienst auf meinem lokalen Cluster bereitstellen jetzt, berichtet meinen Dienst Stoff Explorer einige sehr "ausdrucksvoll" Fehler und ich kann nicht auf meinen Service zugreifen:

Kind  Health State Description 
============================================================================= 
Services Error   Unhealthy services: 100% (1/1), ServiceType='MasterDataServiceWebApiType', MaxPercentUnhealthyServices=0%. 
Service  Error   Unhealthy service: ServiceName='fabric:/sfCluster/MasterDataServiceWebApi', AggregatedHealthState='Error'. 
Partitions Error   Unhealthy partitions: 100% (1/1), MaxPercentUnhealthyPartitionsPerService=0%. 
Partition Error   Unhealthy partition: PartitionId='e5635b85-3c23-426b-bd12-13ae56796f23', AggregatedHealthState='Error'. 
Event  Error   Error event: SourceId='System.FM', Property='State'. Partition is below target replica or instance count. 

Visual Stu dio liefert mir keine weiteren Fehlerdetails. Es ist genau das Gegenteil. Der Stacktrace druckt: fabric:/sfCluster/MasterDataServiceWebApi is ready.

Was habe ich vermisst? Habe ich etwas falsch konfiguriert?

BTW: Danach, habe ich einen neuen Cluster in Azure mit meinem selbst signiertes Zertifikat, aber wenn ich versuche, den Service Fabric Explorer dieses Clusters ich keine UI müssen Acess und eine leere Seite ..

Antwort

3

Ich habe gelernt, dass Service Fabric den lokalen Computerspeicher für die Zertifikatsüberprüfung verwendet. (https://github.com/Azure-Samples/service-fabric-dotnet-web-reference-app/issues/3)

So hatte ich diesen leicht modifizierten Powershell-Skript das Zertifikat in meinem lokalen Computerspeicher zu importieren:

Import-PfxCertificate -Exportable -CertStoreLocation cert:\localMachine\my -FilePath C:\MyCertificates\TestCert.pfx -Password (Read-Host -AsSecureString -Prompt "Enter Certificate Password") 

Davor habe ich mein Zertifikat in Cert:\CurrentUser\TrustedPeople importiert und Cert:\CurrentUser\My. Aber der lokale Service Fabric-Cluster sieht dort nicht nach.

BTW: Ich erhalte immer noch eine leere Site, wenn ich versuche, auf den Service Fabric Explorer meines azur-gehosteten Service Fabric-Clusters zuzugreifen, den ich mit demselben Zertifizierungsschlüssel gesichert habe. Ich werde eine weitere Frage für dieses Problem erstellen. EDIT: Mit dem Internet Explorer anstelle von Firefox löste meine leere Website Problem.