Моя ситуация: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");
}
}
}
Я создал HttpCommunicationListener.cs, который реализует ICommunicationListener. Я могу разрешить URI службы состояния, но как я могу называть определенные методы/функции в службе состояния с помощью моего безпартийного webapi? – Jacky
Вам нужно вызвать методы без состояния из службы состояния, для чего вам необходимо управлять транзакциями в надежной очереди. Вы называете это внутри метода RunAsync надежного сервиса. – alltej
Подождите ... Мне нужно вызвать методы без состояния из службы с сохранением состояния? разве это не наоборот? Я хочу, чтобы мой stateless WebApi (действие POST) вызывал задачу «Blah()» в моем состоянии с сохранением состояния. – Jacky