Проблема с MessageContract, универсальными типами возврата и именами на стороне клиента - PullRequest
0 голосов
/ 05 марта 2010

Я создаю веб-сервис, который использует 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 Ответ

0 голосов
/ 05 марта 2010

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

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

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

...