1

我们在与集群中运行的服务通信时看到了 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

2015 年 14 月 12 日更新

如果抛出此 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 方法访问),但该特定调用从未成功。

4

2 回答 2

1

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

于 2015-12-02T18:44:55.707 回答
1

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

这似乎解决了我的问题。我猜代理在使用后会缓存引用,如果服务更改,则该引用已过时。

于 2016-02-14T13:34:00.797 回答