Hungry Mind , Blog about everything in IT - C#, Java, C++, .NET, Windows, WinAPI, ...

WWS - How to read SOAP Fault

Сервера веб служб возвращают ошибки в элементе SOAP Fault. Здесь я объясню, как прочитать эту информацию.

Как узнать, что произошел сбой? Проверить код возврата на равенство WS_E_ENDPOINT_FAULT_RECEIVED. Дальше начинается магия.

WS_FAULT *pFault;
hr = WsGetFaultErrorProperty(pError, WS_FAULT_ERROR_PROPERTY_FAULT, &pFault, sizeof(pFault));

Структура определена следующим образом:

//  Faults structure
//
//   A Fault is a value carried in the body of a message which conveys a
//  processing failure.  Faults are modeled using the WS_FAULT structure.
//  See Faults for more information.
//
struct _WS_FAULT {
    WS_FAULT_CODE* code;
    WS_FAULT_REASON* reasons;
    ULONG reasonCount;
    WS_STRING actor;
    WS_STRING node;
    WS_XML_BUFFER* detail;
};

Наибольший интерес вызывает информация, заложенная в элементе <detail/>. WCF определяет специальные сущности с названием Fault Contract. Мы хотим их получить в удобном виде. Текущая версия WWS не генерирует код для Fault Contract-ов. Можно прочитать голый XML или вручную написать эти структуры вместе с метаданными, которые их описывают.

WS_XML_WRITER *pWriter;
hr = WsCreateWriter(NULL, 0, &pWriter, pError);

WS_XML_WRITER_TEXT_ENCODING textEncoding;
textEncoding.charSet = WS_CHARSET_UTF8;
textEncoding.encoding.encodingType = WS_XML_WRITER_ENCODING_TYPE_TEXT;

LPVOID pBuf;
ULONG nBufSize;
hr = WsWriteXmlBufferToBytes(pWriter, pFault->detail, &textEncoding.encoding, NULL, 0, _pWsHeap, &pBuf, &nBufSize, _pWsError);

WsFreeWriter(pWriter);

Этот код запишет XML в буффер pBuf (там будет строка в кодировке UTF-8). Кстати, метод WsWriteXmlBufferToBytes хочет в 3-м параметре __in_opt const WS_XML_WRITER_ENCODING* encoding, а мы ему передаем указатель на член структуры WS_XML_WRITER_TEXT_ENCODING. Учитывая значение WS_XML_WRITER_ENCODING_TYPE_TEXT в поле encodingType, WWS предполагает, что дальше в памяти содержится WS_CHARSET. В WWS многие методы работают таким вот хитрым образом - полагаются на расположение вложенных структур в оперативной памяти.

Десериализацию структуры я опишу позже. Может быть.

3 коммент.:

Larisa комментирует...

Как одна фраза может поднять продажи втрое
Пример для вольной журналистики является четким примером маркетинговой лжи. Его если и можно использовать, то только для одноразовой продажи. Да и вообще пример достаточно сомнительный - слишком уж мала аудитория пользователей курсы.ру.А вот мой сайт возможно вас за интересует это - очередной островок любви и нежности - buy viagra ;);)...Большое спасибо вам и я очень благадарна вам за визит на мой сайт ...удачи...С Уважением Лариса

Анонимный комментирует...

Oh my goodness! Awesome article dude! Thanks, However I am encountering issues with your RSS.
I don't understand the reason why I can't subscribe to it.
Is there anybody else having the same RSS issues? Anyone that knows the answer will you kindly respond?
Thanks!!
Feel free to surf my blog - GFI Norte

Анонимный комментирует...

It's genuinely very complex in this active life to listen news on TV, therefore I simply use internet for that reason, and take the hottest news.

Also visit my blog :: online backup service reviews
My web site :: best online backup service

Отправить комментарий

Copyright 2007-2011 Chabster