Проблема с MessageContract, универсальными типами возврата и именами на стороне клиента

Я создаю веб-сервис, который использует MessageContracts, потому что я хочу добавить настраиваемые поля в мой заголовок SOAP. В предыдущей теме я узнал, что составной ответ должен быть упакован. Для этой цели я разработал общий класс ResponseWrapper.

[MessageContract(WrapperNamespace = "http://mynamespace.com", 
                    WrapperName="WrapperOf{0}")]
public class ResponseWrapper<T>
{
    [MessageBodyMember(Namespace = "http://mynamespace.com")]
    public T Response
    {
        get;
        set;
    }
}

Я сделал базовый класс ServiceResult, определенный следующим образом:

[MessageContract(WrapperNamespace = "http://mynamespace.com")]
public class ServiceResult
{
    [MessageBodyMember]
    public bool Status
    {
        get;
        set;
    }

    [MessageBodyMember]
    public string Message
    {
        get;
        set;
    }

    [MessageBodyMember]
    public string Description
    {
        get;
        set;
    }
}

Чтобы иметь возможность включить контекст запроса в ответ, я использую производный класс ServiceResult, который использует обобщения:

[MessageContract(WrapperNamespace = "http://mynamespace.com",
                WrapperName = "ServiceResultOf{0}")]
public class ServiceResult<TRequest> : ServiceResult
{
    [MessageBodyMember]
    public TRequest Request
    {
        get;
        set;
    }
}

Это используется следующим образом

[OperationContract()]
ResponseWrapper<ServiceResult<HCCertificateRequest>> OrderHealthCertificate(RequestContext<HCCertificateRequest> context);

Я ожидал, что мой клиентский код будет сгенерирован как

ServiceResultOfHCCertificateRequest OrderHealthCertificate(RequestContextOfHCCertificateRequest context);

Вместо этого я получаю следующее:

ServiceResultOfHCCertificateRequestzSOTD_SSj OrderHealthCertificate(CompType1 c1, CompType2 c2, HCCertificateRequest context);

CompType1 а также CompType2 являются свойствами RequestContext учебный класс. Проблема в том, что хеш добавляется в конец ServiceResultOfHCCertificateRequestzSOTD_SSj, Как мне определить общие типы возвращаемых данных, чтобы тип клиента был сгенерирован должным образом (без хэша)?

1 ответ

У нас также были проблемы с возвратом общего списка через WCF.

Решение, которое работает для нас, состоит в том, чтобы создать класс, который имеет единственное свойство, и это свойство является общим списком.

Затем мы отправляем этот класс через WCF. Если у вас много таких списков, вы можете создать класс со списком типа T. Так что при создании класса вы можете указать, какой тип списка вы хотите.

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