WCF Сервисные контракты и контракты на передачу данных - PullRequest
0 голосов
/ 12 марта 2019

Я занимаюсь разработкой сервиса WCF.Методы, которые должен поддерживать этот сервис, определяются третьей стороной.Интерфейс, который определяет контракт на обслуживание, частично выглядит следующим образом:

[SoapHeaders]
[ServiceContract(Namespace ="abc.xyz")]
public interface IAbcSoap
{
    [SoapHeader("AuthenticationHeader", 
        typeof(AuthenticationHeader), 
        Direction = SoapHeaderDirection.In)]
    [OperationContract(Action = "abc.xyz/ReverseCard")]
    ReverseCardResponse ReverseCard(
        OriginalRequest OriginalRequest);

Классы, определяющие контракт данных, включают в себя OriginalRequest и несколько более конкретных типов, которые наследуются от OriginalRequest, например:

[DataContract]
public class OriginalRequest
{
    [DataMember]
    public MessageHeader MsgHeader { get; set; }
}

[DataContract]
public class OriginalLoadRequest : OriginalRequest
{
    [DataMember]
    public long ProductCode { get; set; }
}

У меня есть тестовая клиентская программа, созданная с использованием SvcUtil из WSDL, созданного службой.Моя проблема в том, что код, сгенерированный из WSDL, включает в себя только OriginalRequest, а не классы, подобные OriginalLoadRequest, которые наследуются от OriginalRequest, предположительно потому, что в интерфейсе нет ссылки на эти классы.Я попытался добавить перегрузку к интерфейсу следующим образом:

[OperationContract(Action = "abc.xyz/ReverseCard")]
ReverseCardResponse ReverseCard(
    OriginalRequest OriginalLoadRequest);

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

Что я могу сделать, чтобы клиентская программа знала OriginalLoadRequest и другие классы, которые наследуются от OriginalRequest?

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Мне кажется, я нашел ответ.Похоже, мне нужен был атрибут KnownType:

[DataContract]
[KnownType(typeof(OriginalConfirmRequest))]
[KnownType(typeof(OriginalLoadRequest))]
[KnownType(typeof(OriginalRedeemRequest))]
[KnownType(typeof(OriginalVoidRequest))]
public class OriginalRequest
{
    [DataMember]
    public MessageHeader MsgHeader { get; set; }
}

Этот похожий вопрос помог: Как вернуть список в WCF

0 голосов
/ 12 марта 2019

В вашей перегрузке,

[OperationContract(Action = "abc.xyz/ReverseCard")]
ReverseCardResponse ReverseCard(
    OriginalRequest OriginalLoadRequest);

если вы не получили тип параметра и не указали неверное имя, т. Е. Не должно быть

OriginalLoadRequest OriginalRequest);

или даже

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