2017-02-13 41 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

相关问题