На стороне клиента возвращаемое значение операционного контракта 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 или одна из его папок братьев и сестер

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