ServiceProxy抛出ProtocolException,重试时不会恢复通信

时间:2015-12-02 09:48:46

标签: azure-service-fabric

我们在与群集中运行的服务进行通信时看到ProtocolExceptions。消息和InnerException消息:

System.ServiceModel.ProtocolException: You have tried to create a channel to a service that does not support .Net Framing.
---> System.IO.InvalidDataException: Expected record type 'PreambleAck', found '145'.

此服务在本地开发群集上运行,并且在与服务成功通信后抛出异常。

我们用于沟通的代码是:

var eventHandlerServiceClient = ServiceProxy.Create<IEventHandlerService>(eventHandlerTypeName, new Uri(ServiceFabricSettings.EventHandlerServiceName));
return await eventHandlerServiceClient.GetQueueLength();

我们有重试逻辑(尝试之间的延迟增加)。但这个呼吁永远不会成功。所以看起来服务处于故障状态,无法从中恢复。

更新

我们还在日志中看到以下错误:

connection 0x1B6F9EB0 localhost:64002-[::1]:50376 target 0x1B64F3C0: invalid frame: length=0x1000100,type=514,header=28278,check=0x742E7465

更新14-12-2015

如果抛出此ProtocolException,则重试无效。即使经过几个小时的等待,它仍然会失败。

我们使用

记录端点地址
var spr = ServicePartitionResolver.GetDefault();
var x = await spr.ResolveAsync(new Uri(ServiceFabricSettings.EventHandlerServiceName), 
        eventHandlerTypeName, 
        new CancellationToken());
var endpointAddress = x.GetEndpoint().Address;

已解析的端点类似于

{"Endpoints":{"":"net.tcp:\/\/localhost:57999\/d6782e21-87c0-40d1-a505-ec6f64d586db\/a00e6931-aee6-4c6d-868a-f8003864a216-130945476153695343"}}        

此端点与Service Fabric Explorer报告的相同。

从我们看到的日志中,似乎此服务正在运行(可以通过其他API方法访问),但此特定调用永远不会成功。

2 个答案:

答案 0 :(得分:1)

这通常表示服务和客户端上的通信堆栈不匹配。服务启动并运行后,通过Service Fabric Explorer检查服务副本的端点。如果这似乎没问题,请检查客户端是否正在连接到正确的服务。使用ServicePartitionResolver(https://msdn.microsoft.com/en-us/library/azure/microsoft.servicefabric.services.servicepartitionresolver.aspx)解析分区,传递传递给ServiceProxy的相同参数。

答案 1 :(得分:1)

我看到了同样的错误。只是查看我的代码,我正在缓存一个actorproxy。如果缓存引用旧服务实例,我将更改并删除缓存。

这似乎解决了我的问题。我猜测代理在使用后会缓存引用,如果服务发生变化,该引用就会过时。