ServiceProxy выбрасывает ProtocolException, связь не восстанавливается при повторной попытке

Мы видим исключение ProtocolException при обмене данными со службой, работающей в кластере. Сообщение и сообщение 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'.

Эта служба работает в локальном кластере dev, и исключение выдается после успешного взаимодействия со службой.

Код, который мы используем для общения:

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 ответа

Я вижу такие же ошибки. Просто глядя на мой код, я кеширую actorproxy. Я собираюсь изменить это и удалить кеширование на случай, если кеш ссылается на старый экземпляр службы.

Кажется, это исправило мои проблемы. Я предполагаю, что прокси-сервер кеширует ссылку после ее использования, и если служба меняется, эта ссылка устарела.

Это обычно указывает на несовпадающий стек связи на стороне сервиса и клиента. Когда служба запущена и работает, проверьте конечную точку реплики службы через Service Fabric Explorer. Если это кажется нормальным, убедитесь, что клиент подключается к нужному сервису. Разрешите раздел с помощью ServicePartitionResolver ( https://msdn.microsoft.com/en-us/library/azure/microsoft.servicefabric.services.servicepartitionresolver.aspx), передав те же аргументы, которые вы передаете ServiceProxy.

Другие вопросы по тегам