我们在与群集中运行的服务进行通信时看到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方法访问),但此特定调用永远不会成功。
答案 0 :(得分:1)
这通常表示服务和客户端上的通信堆栈不匹配。服务启动并运行后,通过Service Fabric Explorer检查服务副本的端点。如果这似乎没问题,请检查客户端是否正在连接到正确的服务。使用ServicePartitionResolver(https://msdn.microsoft.com/en-us/library/azure/microsoft.servicefabric.services.servicepartitionresolver.aspx)解析分区,传递传递给ServiceProxy的相同参数。
答案 1 :(得分:1)
我看到了同样的错误。只是查看我的代码,我正在缓存一个actorproxy。如果缓存引用旧服务实例,我将更改并删除缓存。
这似乎解决了我的问题。我猜测代理在使用后会缓存引用,如果服务发生变化,该引用就会过时。