2017-02-13 10 views
1

У меня есть служба, размещенная в кластере Service Fabric в Azure (не локально), и я пытаюсь вызвать метод в нем с помощью консольного приложения на моей локальной машине. Используя WCF для связи, у меня есть конечная точка HTTPS, настроенная в моем приложении на определенном порту, и настроил правила балансировки нагрузки для порта на портале Azure. Кластер имеет 6 узлов, и приложение является единственным, установленным в кластере.Служба обслуживания вызовов из консольного приложения с использованием конечной точки WCF HTTPS

Последовало за ServiceFabric.WcfCalc на GitHub (link), которое работает на локальном кластере с использованием конечных точек HTTP, но не может вызвать метод службы с использованием конечных точек HTTPS после его развертывания. Что мне нужно сделать, чтобы заставить его работать? Попробовали по примеру here, но не знаете, как настроить это для HTTPS с помощью службы на нескольких узлах для доступа к консольному приложению.

Заранее спасибо.

EDIT Вот мой код клиента, который я использую для вызова метода службы. Я передаю структуру:/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 вызова, который вызывает метод в моей службы в Service Fabric. Приложение не бросает никаких исключений и не возвращается к отладчику в Visual Studio.

+0

Какую ошибку или проблему вы видите при попытке вызвать метод службы, развернутой в кластере? Тайм-аут или что-то еще? – yoape

+0

В моем коде не исключены исключения, хотя я вижу в проводнике кластера службы Fabric следующее предупреждение: «HTTP не смог зарегистрировать URL http: // +: 443/26c710ea-38b9-4416-9d70-c1710e698521/8d259277- ed49-4e11-b7ec-fac80075297e-131314658022522000 /. Другое приложение уже зарегистрировало этот URL-адрес с помощью HTTP.SYS. " Это происходит, когда я вызываю метод службы из консольного приложения на моем локальном компьютере. Отредактированный вопрос выше, чтобы отразить это. – dan4291

+0

Я бы ожидал увидеть HTTPS не HTTP в URL-адресе, если вы правильно настроили конечную точку. – LoekD

ответ

0
  • Убедитесь, что вы запускали каждый экземпляр службы/реплику с уникальным URL-адресом.

  • Убедитесь, что вы вызываете конструктор WebHttpBinding, используя WebHttpSecurityMode.Transport.

  • Убедитесь, что вы зарегистрировать URL, используя один и тот же порт номера (443) вероятно, как в вас обслуживать манифест конечной точки declaration.

  • Убедитесь, что конечная точка сконфигурирована как HTTPS.

+0

Я сделал то, что вы предложили, но как только я отлаживаю консольное приложение и получаю вызов метода службы, приложение просто зависает и не возвращается в отладчик в Visual Studio. – dan4291

+0

Что произойдет, если вы позвоните в службу поддержки Postman? – LoekD

+0

Я раньше не использовал Почтальона. Какой адрес я бы использовал, так как, конечно, он не согласился бы с тканью/URI, которую я использую для ServicePartitionClient в коде, который я использую для вызова метода службы. – dan4291

0

Предупреждение вы видите в службе ткани говорит вам, что есть уже другая служба, регистрируемая для прослушивания port 443 на ваших узлах. Это означает, что Service Fabric не может развернуть вашу службу (поскольку она создает исключение изнутри, когда пытается зарегистрировать URL-адрес с http.sys). Вы можете изменить порт для службы на что-то другое, что не будет вступать в противоречие с существующей службы, например:

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

Если вы войти в Service Fabric Explorer, на 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