Azure Service Fabric с прослушивателем самообслуживания OWIN

В один из моих сервисов без сохранения состояния я хотел бы включить двух слушателей:

Когда я пытаюсь зарегистрировать созданные слушатели стандартным способом, у меня возникает проблема, заключающаяся в том, что слушатель, основанный на OWIN, автоматически закрывается после инициализации:

Диагональные события

Часть, отвечающая за регистрацию услуг:

        protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
        {
           return new List<ServiceReplicaListener>
           {
              new ServiceReplicaListener(parameters => new OwinCommunicationListener("account",new Startup(), parameters)),
              new ServiceReplicaListener(parameters => new ServiceRemotingListener<AccountService>(parameters, this))

        };
    }

Настройка портов ServiceManifest:

<Resources>
  <Endpoints>
    <Endpoint Name="ServiceEndpoint" />
    <Endpoint Name="WebApiEndpoint" Type="Input" Protocol="http" Port="8083"/>
    <Endpoint Name="ReplicatorEndpoint" />
  </Endpoints>
</Resources>

OwinCommunicationListener:

public class OwinCommunicationListener: ICommunicationListener
{
    private readonly IOwinAppBuilder startup;
    private readonly string appRoot;
    private IDisposable serverHandle;
    private string listeningAddress;
    private readonly ServiceInitializationParameters serviceInitializationParameters;

    public OwinCommunicationListener(string appRoot, IOwinAppBuilder startup, ServiceInitializationParameters serviceInitializationParameters)
    {
        this.startup = startup;
        this.appRoot = appRoot;
        this.serviceInitializationParameters = serviceInitializationParameters;
    }

    public Task<string> OpenAsync(CancellationToken cancellationToken)
    {
        EndpointResourceDescription serviceEndpoint = serviceInitializationParameters.CodePackageActivationContext.GetEndpoint("WebApiEndpointB");
        int port = serviceEndpoint.Port;
        listeningAddress = string.Format(CultureInfo.InvariantCulture,"http://+:{0}/{1}",port,string.IsNullOrWhiteSpace(appRoot)? string.Empty: appRoot.TrimEnd('/') + '/');
        serverHandle = WebApp.Start(listeningAddress, appBuilder => startup.Configuration(appBuilder));
        string publishAddress = listeningAddress.Replace("+", FabricRuntime.GetNodeContext().IPAddressOrFQDN);
        ServiceEventSource.Current.Message("Listening on {0}", publishAddress);
        return Task.FromResult(publishAddress);
    }
    ...
}

Как я могу решить эту проблему и зарегистрировать этих двух слушателей?


person Przemek Marcinkiewicz    schedule 25.03.2016    source источник


Ответы (1)


Если у вас более одного слушателя, вы должны дать им уникальные имена. Из-за этого ваша служба может выйти из строя, что приведет к тому, что она будет открываться и закрываться снова и снова:

    protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
    {
        return new List<ServiceReplicaListener>
       {
          new ServiceReplicaListener(parameters => new OwinCommunicationListener("account",new Startup(), parameters), "accountListener"),
          new ServiceReplicaListener(parameters => new ServiceRemotingListener<AccountService>(parameters, this), "remotingListener")
        }
    }
person Vaclav Turecek    schedule 26.03.2016