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.