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,并且它们不能很好地协同工作.
好吧,解决方案结果是直截了当但不明显.即使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)
希望这有助于为其他人节省大量时间.
| 归档时间: |
|
| 查看次数: |
5129 次 |
| 最近记录: |