Интерфейс метода Wcf как параметр, видимый как объект на стороне клиента - PullRequest
0 голосов
/ 23 октября 2019

Я использую интерфейс в качестве входного параметра в OperationContract. Но когда я генерирую прокси-класс на стороне клиента, метод клиента выглядит так: GetDat (значение объекта) вместо GetData (значение IMyObj)

  1. Интерфейс службы
[ServiceContract]
[ServiceKnownType(typeof(MyObj))]
public interface IService
{
    [OperationContract]
    string GetData(IMyObj value);
}
Класс обслуживания
public class Service : IService
{
    public string GetData(IMyObj value)
    {
        return string.Format("You entered: {0}", value.MyValue);
    }

}
Интерфейс
public interface IMyObj
{
    int MyValue { get; set; }
}
Контракт данных
[DataContract]
[KnownType(typeof(IMyObj))]
public class MyObj : IMyObj
{
    [DataMember]
    public int MyValue { get; set; }
}

Примечание: Есть много похожих вопросов о стеке потока относительно параметров интерфейса и wcf. Но все они говорят использовать атрибут ServiceKnownType и KnownTypeAttribute (что я и сделал). Но он по-прежнему дает вызывающему методу на стороне клиента объект типа параметра вместо моего типа интерфейса.

1 Ответ

0 голосов
/ 24 октября 2019

Для других людей, которые сталкиваются с той же проблемой. Я нашел ответ от Ладислава на https://social.msdn.microsoft.com/Forums/vstudio/en-US/2c52251b-af7f-4529-a2ac-14418ca4b19d/wcf-service-reference-does-not-add-the-interface-definition-of-a-datacontract-of-a-class?forum=wcf

Здравствуйте,

Вы не можете этого сделать. DataContract представляет собой определение данных, передаваемых между клиентом и сервисом. Это определение преобразуется в XSD, который описывает формат обмениваемого XML (объекта контракта сериализованных данных). XML может передавать только данные, а не логику, и не передает никакой информации о реализации контракта данных = нет наследования и реализации интерфейса. Если вы хотите использовать datacontract с интерфейсом на клиенте, вы должны совместно использовать этот контракт данных в сборке (не только интерфейс) и повторно использовать его на клиенте при создании прокси-сервера службы.

С уважением, Ladislav

...