具有 OWIN 自托管监听器的 Azure Service Fabric

标签 azure owin azure-service-fabric self-host-webapi

在我的一项无状态服务中,我想包含两个监听器:

当我尝试以标准方式注册创建的监听器时,遇到一个问题:基于 OWIN 的监听器在初始化后自动关闭:

Diagonstic events

负责注册服务的部分:

        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);
    }
    ...
}

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

最佳答案

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

    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")
        }
    }

关于具有 OWIN 自托管监听器的 Azure Service Fabric,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36217007/

相关文章:

c# - 值不能为空 - 应用程序管理器

asp.net-web-api - 在 Azure Service Fabric 中,无状态 Web API 和 ASP.NET Core Web API 之间有什么区别?

linux - 将 .Net Core 应用程序部署到 Linux Service Fabric 集群

azure - 使用 Azure Synapse 无服务器池从外部表中检索每个组中的最后一条记录

azure - 复制事件 - 忽略接收器存储过程参数值

java - 是否可以将 DeviceCode 身份验证流程与 Azure Java SDK 一起使用?

json - 在 Azure Cosmos DB 或 Azure Blob 中将 JSON 转换为 CSV

.net - Microsoft.AspNet.Identity 源代码可用性

asp.net-web-api - 带有 OWIN OAuth Bearer token 的 Web Api 2

azure - Azure Service Fabric 上通过 https 的无状态 Web Api