服务结构多个通信监听器

Mar*_*rkD 3 azure-service-fabric

基本思想 - 我有一个无状态服务,通过http实现Owin通信监听器,为基于WebApi的公共客户端提供服务.我想添加第二个侦听器,它将使用内置的ServiceRemotingListener()通过Rpc在集群内接收请求.原因是我不希望这个监听器是公共的,因为它为无状态服务实现了非公共管理接口.这是设置......:

        protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
    {
        return new[]
        {
            new ServiceInstanceListener(initParams => new OwinCommunicationListener("MyWebService", new Startup(_options, this), initParams),"MyServiceHttp"),
            new ServiceInstanceListener(initParams => new ServiceRemotingListener<Interfaces.IConfig>(initParams, this),"MyServiceRpc")           
        };
    }
Run Code Online (Sandbox Code Playgroud)

当我添加第二个监听器时,我得到启动应用程序的异常...

                 this.serverHandle = WebApp.Start(this.listeningAddress, appBuilder => this.startup.Configuration(appBuilder));
Run Code Online (Sandbox Code Playgroud)

抛出异常:抛出System.dll Exception中的'System.Net.Sockets.SocketException':System.ServiceModel.dll中的'System.ServiceModel.CommunicationException'抛出异常:抛出System.ServiceModel.dll异常中的'System.ServiceModel.CommunicationException'异常:System.ServiceModel.Internals.dll中的'System.ServiceModel.CommunicationException' - 多次重复---抛出异常:System.Fabric.dll中的'System.ServiceModel.CommunicationException'

(不知道如何获取异常细节.我的"try {}"周围没有捕获异常.)

一旦处于此状态,我会在服务尝试自动重启时获得后续异常 - 错误与端口共享有关.

我能做些什么来使WebApi通信监听器与ServiceRemotingListener一起工作?我在这一点上假设,在引擎盖下,ServiceRemotingListener也正在使用http,并且它们不能很好地协同工作.

Mar*_*rkD 7

好吧,解决方案结果是直截了当但不明显.即使TCP/RPC和HTTP不能一起使用,文档也似乎鼓励端口共享方法.

基本上,我向服务清单添加了第二个端点,即使文档说每个服务只能在一个端口上侦听.

我离开ServiceRemotingListener的默认/第一个端点进行注册,并添加了一个专门侦听端口8083的端点.

<Endpoint Name="ServiceEndpoint" Protocol="http" Type ="Input"/>
<Endpoint Name="ServiceEndpoint2" Protocol="http" Port="8083" Type ="Input"/>
Run Code Online (Sandbox Code Playgroud)

然后在IOwinCommunicationsListener中,我指定了第二个端点,它获取了备用端口号(我假设ServiceInstanceListener将使用默认/第一个端点).

var codePackageActivationContext = this.serviceInitializationParameters.CodePackageActivationContext;
var port = codePackageActivationContext.GetEndpoint("ServiceEndpoint2").Port;
Run Code Online (Sandbox Code Playgroud)

CreateServiceInstanceListeners没有任何额外的配置.如上所述,我想知道是否可以使用ServiceRemoteListenerSettings强制ServiceRemotinglistener使用替代端口而不是上面的IOwinCommunicationsListener)

        return new[]
        {
            new ServiceInstanceListener(initParams => new ServiceRemotingListener<Interfaces.IConfig>(initParams, this),"MyRpc"),
            new ServiceInstanceListener(initParams => new OwinCommunicationListener("ShopifyWebService", new Startup(_options, this), initParams),"MyOwin")
               };
Run Code Online (Sandbox Code Playgroud)

希望这有助于为其他人节省大量时间.