Почему мои рабочие контракты в моем клиенте wcf не принимают интерфейсы в качестве параметров?

У меня есть простой сервисный контракт wcf, который отлично работает, если я использую конкретные реализации для интерфейсов, но если я хочу использовать интерфейсы в параметрах вместо конкретных классов, это дает мне ошибку, которую я покажу ниже.

Вот код:

[ServiceContract]
public interface IClientUserRegistration
{
    [OperationContract]
    void RegisterClientUser(ClientUser clientUser);

    [OperationContract]
    List<ClientUser> GetUsers();
}

Если я заменю ClientUser на IClientUser, тестовый клиент WCF скажет, что операция RegisterClientUser не поддерживается, поскольку он использует тип System.Object. Если я заменяю возвращаемое значение GetUsers на List, это говорит о том, что эта операция не поддерживается, потому что она использует тип System.Object[]. Почему это дает эти ошибки?

Причина, по которой я пытался использовать IClientUser, заключается в том, что я мог реализовать различные типы пользователей, которые реализуют интерфейс IClientUser, и передать их в RegisterClient, но если я могу только передать ClientUser, то мне нужно создать группу переопределений RegisterClient, которые принимают разные типы пользователей.

2 ответа

Решение

SOAP не имеет понятия интерфейсов. Это может затруднить десериализацию.

Это потому, что объекты должны быть сериализованы для передачи между клиентом и сервером. Вам не разрешено передавать тип "объект". Все типы должны быть конкретными, чтобы их можно было правильно сериализовать и десериализовать. Интерфейс - это не что иное, как объектный тип с подтипом интерфейса. Таким образом, объект в целом не может быть десериализован и сериализован, могут быть только члены интерфейса. Это сделало бы действительно грязную реализацию с обеих сторон.

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