На стороне клиента возвращаемое значение операционного контракта WCF равно нулю! Любое решение?
У меня есть Сервисный контракт в моей службе WCF, который возвращает экземпляр класса, который на самом деле является Контрактом сообщений. (Не данные договора). Контракт сообщения имеет свойства с атрибутом> [MessageBodyMember]
[MessageContract(WrapperName="AuthorizarionResponse", IsWrapped="true")]
public class AuthorizationResponse
{
[MessageBodyMember] public string role {get;set;};
[MessageBodyMember] public Organization organization {get; set;};
}
[ServiceContract]
interface IAuthorization
{
[OperationContract]
public AuthoriztionResponse GetAuthorizationResult(AuthorizationRequestMessage request);
}
Organization
Класс использует XmlSerializer. Он не использует Data Contract, потому что я хочу, чтобы служба WCF использовалась из существующих клиентов ASMX. Когда я отлаживаю сервис и вижу возвращаемое значение в методе Операционного контракта, я вижу все, что я хочу вернуть из сервиса через этот контракт.
Но на стороне клиента я получаю нулевое значение!
Все заканчивается без каких-либо исключений / ошибок. Fiddler2 не дает никаких красных знаков / ошибок! Что будет не так?
2 ответа
Проблема заключается в том, что Сервис отправляет ответное мыльное сообщение, сформированное не так, как ожидалось кодом клиентского контракта. Сериализатор анализирует сообщение Soap на основе контракта, определенного в коде прокси-сервера в клиентском приложении, однако, если полученное мыльное сообщение не соответствует ожидаемому, сериализатор молча пропускает содержимое и перемещается вперед. Итак, ошибки нет, а также объект не заполнен, потому что сериализатор не нашел ожидаемого содержимого.
Итак, вам нужно определить, как клиент ожидает формирования мыльного сообщения.
Вы можете включить ведение журнала трассировки, как описано здесь
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "c:\wcf.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
затем используйте SvcTraceViewer.exe
от C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin
или одна из его папок братьев и сестер