2017-02-13 80 views
1

我有一個服務在Azure(不是本地)的服務結構集羣中託管,我嘗試使用本地計算機上的控制檯應用程序調用其中的方法。使用WCF進行通信,我的應用程序在特定端口上設置了HTTPS端點,併爲Azure門戶中的端口配置了負載平衡規則。羣集有6個節點,應用程序是在羣集上部署的唯一節點。使用WCF HTTPS端點從控制檯應用程序調用服務結構服務

已遵循GitHub上的ServiceFabric.WcfCalc(link),它在使用HTTP端點的本地羣集上工作,但在部署後無法使用HTTPS端點調用服務上的方法。我需要做些什麼才能使它工作?已嘗試遵循示例here,但不知道如何將此配置用於HTTPS,並使用多個節點上的服務供控制檯應用程序訪問。

在此先感謝。

編輯這是我用來調用服務方法的客戶端代碼。我在這裏將結構:/ URI傳遞給構造函數。

public class Client : ServicePartitionClient<WcfCommunicationClient<IServiceInterface>>, IServiceInterface 
{ 
    private static ICommunicationClientFactory<WcfCommunicationClient<IServiceInterface>> communicationClientFactory; 

    static Client() 
    { 
     communicationClientFactory = new WcfCommunicationClientFactory<IServiceInterface>(
      clientBinding: new BasicHttpBinding(BasicHttpSecurityMode.Transport)); 
    } 

    public Client(Uri serviceUri) 
     : this(serviceUri, ServicePartitionKey.Singleton) 
    { } 

    public Client(
     Uri serviceUri, 
     ServicePartitionKey partitionKey) 
     : base(
      communicationClientFactory, 
      serviceUri, 
      partitionKey) 
    { } 


    public Task<bool> ServiceMethod(DataClass data) 
    { 
     try 
     { 
      //It hangs here 
      return this.InvokeWithRetry((c) => c.Channel.ServiceMethod(data)); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
} 

當我的本地機器上調試我的控制檯應用程序,該應用程序掛在InvokeWithRetry調用,它調用該方法在我的服務織物的服務。該應用程序不會拋出任何異常,並且不會返回到Visual Studio中的調試器。

+0

當您嘗試在集羣中部署的服務上嘗試調用該方法時,您看到什麼錯誤或問題?超時或其他東西? – yoape

+0

我的代碼中沒有引發異常,儘管我在Service Fabric集羣資源管理器中看到以下警告: - 「HTTP無法註冊URL http:// +:443/26c710ea-38b9-4416-9d70-c1710e698521/8d259277- ed49-4e11-b7ec-fac80075297e-131314658022522000 /。另一個應用程序已經使用HTTP.SYS註冊了這個URL。「當我從本地機器上的控制檯應用程序調用服務方法時,會發生這種情況。上面編輯的問題反映了這一點。 – dan4291

+0

如果您正確配置了端點,我希望在url中看到HTTPS不是HTTP。 – LoekD

回答

0
  • 確保您運行具有唯一網址的每個服務實例/副本。

  • 確保您使用WebHttpSecurityMode.Transport致電WebHttpBinding構造函數。

  • 確保您使用與您的服務清單端點declaration相同的端口數字(443可能)註冊該URL。

  • 確保端點配置爲HTTPS

+0

我已經完成了你的建議,但是一旦我調試了控制檯應用程序並進入服務方法調用,應用程序就會掛起,並且不返回到Visual Studio中的調試器。 – dan4291

+0

如果您使用郵遞員致電服務,會發生什麼情況? – LoekD

+0

我以前沒有用過郵遞員。我將使用什麼地址,因爲它肯定不會接受我用於代碼中ServicePartitionClient的結構:/ URI,這是我用來調用服務方法的地址。 – dan4291

0

你在服務織物看到該警告是告訴你,已經有另一種服務註冊到監聽port 443您的節點上。這意味着Service Fabric無法啓動您的服務(因爲它在嘗試向http.sys註冊URL時在內部引發異常)。您可以更改端口爲您服務,別的東西,不會與現有服務發生衝突,如:

<Resources> 
    <Endpoint Name="CalculatorEndpoint" Protocol="https" Type="Input" Port="44330" /> 
</Endpoints> 

如果您登錄到服務織物資源管理器中https://{cluster_name}.{region}.cloudapp.azure.com:19080你應該能看到什麼其他應用程序和服務正在運行。如果將服務一直擴展到節點,則應該能夠查看現有服務的已註冊端點(包括端口)。

獎金 您可以查詢使用FabricClient集羣的所有已註冊端點

var fabricClient = new FabricClient(); 
var applicationList = fabricClient.QueryManager.GetApplicationListAsync().GetAwaiter().GetResult(); 
foreach (var application in applicationList) 
{ 
    var serviceList = fabricClient.QueryManager.GetServiceListAsync(application.ApplicationName).GetAwaiter().GetResult(); 
    foreach (var service in serviceList) 
    { 
     var partitionListAsync = fabricClient.QueryManager.GetPartitionListAsync(service.ServiceName).GetAwaiter().GetResult(); 
     foreach (var partition in partitionListAsync) 
     { 
      var replicas = fabricClient.QueryManager.GetReplicaListAsync(partition.PartitionInformation.Id).GetAwaiter().GetResult(); 
      foreach (var replica in replicas) 
      { 
       if (!string.IsNullOrWhiteSpace(replica.ReplicaAddress)) 
       { 
        var replicaAddress = JObject.Parse(replica.ReplicaAddress); 
        foreach (var endpoint in replicaAddress["Endpoints"]) 
        { 
         var endpointAddress = endpoint.First().Value<string>(); 
         Console.WriteLine($"{service.ServiceName} {endpointAddress} {endpointAddress}"); 
        } 
}}}}} 

只要運行與適當的FabricClient憑證(如果它是一個安全的集羣),你應該看到它列出所有端點爲那裏的所有服務。這應該有助於您找到具有以下端點的端點:443

相關問題