带有OWIN自主机侦听器的Azure服务结构

带有OWIN自主机侦听器的Azure服务结构,azure,owin,azure-service-fabric,self-host-webapi,Azure,Owin,Azure Service Fabric,Self Host Webapi,在我的一个无状态服务中,我希望包括两个侦听器: 服务结构为服务之间的内部通信提供的侦听器 根据示例()实现的基于OWIN自主机的侦听器 当我尝试以标准方式注册创建的侦听器时,我遇到一个问题,即基于OWIN的侦听器在初始化后自动关闭: 负责注册服务的部分: protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() {

在我的一个无状态服务中,我希望包括两个侦听器:

  • 服务结构为服务之间的内部通信提供的侦听器
  • 根据示例()实现的基于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))

        };
    }
protectedoverride IEnumerable CreateServiceReplicaListeners()
{
返回新列表
{
新建ServiceReplicaListener(参数=>新建OwinCommunicationListener(“帐户”,新启动(),参数)),
新建ServiceReplicaListener(参数=>new ServiceRemotingListener(参数,此))
};
}
ServiceManifest端口设置:

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

Ow独立通信侦听器:

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);
    }
    ...
}
公共类OwinCommunicationListener:ICommunicationListener
{
私有只读IOwinAppBuilder启动;
私有只读字符串批准;
私有IDisposable服务器句柄;
私有字符串ListingAddress;
专用只读ServiceInitializationParameters ServiceInitializationParameters;
公共OwinCommunicationListener(字符串批准、IOwinAppBuilder启动、ServiceInitializationParameters ServiceInitializationParameters)
{
this.startup=启动;
this.approt=approt;
this.serviceInitializationParameters=serviceInitializationParameters;
}
公共任务OpenAsync(CancellationToken CancellationToken)
{
EndpointResourceDescription serviceEndpoint=serviceInitializationParameters.CodePackageActivationContext.GetEndpoint(“WebApiEndpointB”);
int-port=serviceEndpoint.port;
listeningAddress=string.Format(CultureInfo.InvariantCulture,“http://+:{0}/{1}”,端口,string.IsNullOrWhiteSpace(Approt)?string.Empty:Approt.TrimEnd('/')+'/');
serverHandle=WebApp.Start(ListingAddress,appBuilder=>startup.Configuration(appBuilder));
string publishAddress=ListingAddress.Replace(“+”,FabriRuntime.GetNodeContext().IPAddressOrFQDN);
ServiceEventSource.Current.Message(“侦听{0}”,publishAddress);
返回Task.FromResult(publishAddress);
}
...
}

如何解决此问题并注册这两个侦听器?

当您有多个侦听器时,必须为它们指定唯一的名称。您的服务可能因此而失败,这将导致它一次又一次地打开和关闭:

    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")
        }
    }
protectedoverride IEnumerable CreateServiceReplicaListeners()
{
返回新列表
{
新的ServiceReplicaListener(参数=>new OwinCommunicationListener(“帐户”,new Startup(),参数),“accountListener”),
新建ServiceReplicaListener(参数=>new ServiceRemotingListener(参数,this),“remotingListener”)
}
}