Проблема с 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. Так что при создании класса вы можете указать, какой тип списка вы хотите.