基本思想 - 我有一个无状态服务,通过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")
};
}
当我添加第二个监听器时,我得到启动应用程序的异常......
this.serverHandle = WebApp.Start(this.listeningAddress, appBuilder => this.startup.Configuration(appBuilder));
抛出异常:&#39; System.Net.Sockets.SocketException&#39;在System.dll中 抛出异常:&#39; System.ServiceModel.CommunicationException&#39;在System.ServiceModel.dll中 抛出异常:&#39; System.ServiceModel.CommunicationException&#39;在System.ServiceModel.dll中 抛出异常:&#39; System.ServiceModel.CommunicationException&#39;在System.ServiceModel.Internals.dll中 - 多次重复--- 抛出异常:&#39; System.ServiceModel.CommunicationException&#39;在System.Fabric.dll
中
(不知道如何获取异常详情。我的&#34;尝试{}&#34;周围 没有捕获异常。)
一旦处于此状态,我会在服务尝试自动重启时获得后续异常 - 错误与端口共享有关。
我能做些什么来使WebApi通信监听器与ServiceRemotingListener一起工作?我现在假设在引擎盖下,ServiceRemotingListener也在使用http,而且他们不能很好地一起玩。
答案 0 :(得分:7)
基本上,我在服务清单中添加了第二个端点,即使文档说每个服务只能在一个端口上侦听。
我离开ServiceRemotingListener的默认/第一个端点进行注册,并添加了一个专门侦听端口8083的端点。
<Endpoint Name="ServiceEndpoint" Protocol="http" Type ="Input"/>
<Endpoint Name="ServiceEndpoint2" Protocol="http" Port="8083" Type ="Input"/>
然后在IOwinCommunicationsListener中的,我指定了第二个端点,它选择了备用端口号(我假设ServiceInstanceListener将使用默认/第一个端点)。
var codePackageActivationContext = this.serviceInitializationParameters.CodePackageActivationContext;
var port = codePackageActivationContext.GetEndpoint("ServiceEndpoint2").Port;
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")
};
希望这有助于为其他人节省大量时间。