2016-12-23 6 views
1

Моя ситуация:Http Связь между Azure Service Fabric услуги

  • Stateful Услуги
  • Stateless WebAPI, который действует в качестве конечной точки для не-SF приложений, чтобы ударить мою Stateful службу.
  • Служба состояния и бездействия WebAPI взаимодействует через RPC. Я после этого учебника (https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-add-a-web-frontend)

Проблема:

Я пытаюсь изменить связь между моей Stateful службы и моей Stateless WebAPI от RPC к HTTP связи, потому что я хочу, чтобы избежать использования интерфейса для связи между службами. Возможно ли это с помощью HTTP-коммуникации? Если да, то каким образом мой ASPAP-статус без имени не может использовать специальные методы в моем приложении Stateful без использования интерфейса?

UPDATE:

Благодаря alltej, я начал читать больше на HttpCommunicationListeners. Этот урок (https://docs.microsoft.com/nl-nl/azure/service-fabric/service-fabric-concepts-partitioning) объяснил Http Communication довольно хорошо.

В фрагменте кода ниже: «CreateServiceReplicaListeners()» вызывает CreateInternalListener(), который затем вызывает «ProcessInternalRequest()», который затем, наконец, вызывает «AddUserAsync()».

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() 
    { 
     return new[] { new ServiceReplicaListener(context => this.CreateInternalListener(context))}; 
    } 

    private ICommunicationListener CreateInternalListener(ServiceContext context) 
    { 
     EndpointResourceDescription internalEndpoint = context.CodePackageActivationContext.GetEndpoint("ProcessingServiceEndpoint"); 

     string uriPrefix = String.Format(
      "{0}://+:{1}/{2}/{3}-{4}/", 
      internalEndpoint.Protocol, 
      internalEndpoint.Port, 
      context.PartitionId, 
      context.ReplicaOrInstanceId, 
      Guid.NewGuid()); 

     string nodeIP = FabricRuntime.GetNodeContext().IPAddressOrFQDN; 

     string uriPublished = uriPrefix.Replace("+", nodeIP); 
     return new HttpCommunicationListener(uriPrefix, uriPublished, this.ProcessInternalRequest); 
    } 

    private async Task ProcessInternalRequest(HttpListenerContext context, CancellationToken cancelRequest) 
    { 
     string output = null; 
     string user = context.Request.QueryString["lastname"].ToString(); 

     try 
     { 
      output = await this.AddUserAsync(user); 
     } 
     catch (Exception ex) 
     { 
      output = ex.Message; 
     } 

     using (HttpListenerResponse response = context.Response) 
     { 
      if (output != null) 
      { 
       byte[] outBytes = Encoding.UTF8.GetBytes(output); 
       response.OutputStream.Write(outBytes, 0, outBytes.Length); 
      } 
     } 
    } 

    private async Task<string> AddUserAsync(string user) 
    { 
     IReliableDictionary<String, String> dictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<String, String>>("dictionary"); 

     using (ITransaction tx = this.StateManager.CreateTransaction()) 
     { 
      bool addResult = await dictionary.TryAddAsync(tx, user.ToUpperInvariant(), user); 

      await tx.CommitAsync(); 

      return String.Format(
       "User {0} {1}", 
       user, 
       addResult ? "sucessfully added" : "already exists"); 
     } 
    } 
} 

ответ

1

MyCustomHttpListener это класс, который вы должны создать как свой собственный пользовательский слушатель, который реализует ICommunicationListener. Он содержит три метода, которые необходимо переопределить. См. Пример здесь для OwinCommunicationListener: https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-services-communication-webapi

+0

Я создал HttpCommunicationListener.cs, который реализует ICommunicationListener. Я могу разрешить URI службы состояния, но как я могу называть определенные методы/функции в службе состояния с помощью моего безпартийного webapi? – Jacky

+0

Вам нужно вызвать методы без состояния из службы состояния, для чего вам необходимо управлять транзакциями в надежной очереди. Вы называете это внутри метода RunAsync надежного сервиса. – alltej

+0

Подождите ... Мне нужно вызвать методы без состояния из службы с сохранением состояния? разве это не наоборот? Я хочу, чтобы мой stateless WebApi (действие POST) вызывал задачу «Blah()» в моем состоянии с сохранением состояния. – Jacky