ServiceRemoting V2_1 по-прежнему выдает исключительную сериализацию при работе с типами возврата интерфейса - PullRequest
0 голосов
/ 01 мая 2019

в последние несколько дней я пытался оснастить свое приложение стеками IPC службы удаленного взаимодействия.Я изначально реализовал версию V2, но только благодаря этому сообщению (https://github.com/Azure/service-fabric-issues/issues/735)) заметил, что он не поддерживает возврат интерфейсов.

Итак, я только что переключился на V2_1.

Однако я все еще сталкиваюсь с этой проблемой:

One or more errors occurred. (Type 'MooMed.Core.DataTypes.Session.SessionContext' with data contract name 'SessionContext:http://schemas.datacontract.org/2004/07/MooMed.Core.DataTypes.Session' is not expected. Add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.)'

Это метод службы, который вызывается в конечной точке:

    [CanBeNull]
    public Task<ISessionContext> GetSessionContext(int accountId):

Соответствующие классы / интерфейсы выглядят так:

public interface ISessionContext
{
    Account Account { get; set; }
}

[DataContract]
public class SessionContext : ISessionContext
{
    [DataMember]
    public Account Account { get; set; }
}

Также, как я уже упоминал, я только что изменил свою версию удаленного взаимодействия с V2 на V2_1, поэтому она добавлена ​​в класс Service, который содержит метод GetSessionContext:

[assembly: FabricTransportServiceRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2_1, RemotingClientVersion = RemotingClientVersion.V2_1)]

Итак, в соответствии с документами (https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-services-communication-remoting#use-the-remoting-v2-interface-compatible-stack) Теперь я должен быть полностью укомплектован, чтобы все работало должным образом.

Единственное, что я вижу, что я делаю иначе, чем учебник, - это то, как я объявляю конечную точкуслушатели. Я делаю это через FabricTransportServiceRemotingListener следующим образом:

    public static ServiceReplicaListener CreateTypedListener([NotNull] IService service)
    {
        return new ServiceReplicaListener(context => new FabricTransportServiceRemotingListener(context, service), 
            $"I{service.GetType().Name}");
    }

Однако я не понимаю, как это может быть виновником, так как запрос поступает правильно, и я не думаю, что объявляюконечные точки обязательно яНе обращайте внимания на то, как сериализуются ответы.

Итак, что я здесь не так делаю?

1 Ответ

0 голосов
/ 05 мая 2019

DataContractSerializer не может сериализовать интерфейс.(см. как пометить интерфейс как DataContract в WCF ).

Однако вы можете написать свой собственный сериализатор для достижения этой цели.Из той статьи, которую вы разместили внизу, приведены инструкции о том, как это сделать.Вы также можете посмотреть мой пример реализации protobuf-net здесь: https://github.com/mikeruhl/Frenetik.Fabric.Remoting.Protobuf

Мой пример не должен использоваться в производстве.Это незавершенная работа, и на данный момент для нее написано ноль тестов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...