Błędów
Komunikat o błędzie służy do przekazywania informacji o błędzie dotyczących błędu w zdalnym punkcie końcowym. Komunikat o błędzie jest podobny do każdego innego komunikatu, z wyjątkiem formatu treści komunikatu ma standardowy format. Błędy mogą być używane zarówno przez protokoły infrastruktury, jak adresowanie WS, jak i protokoły aplikacji wyższego poziomu.
Przegląd
Zawartość treści komunikatu o błędzie jest reprezentowana w tym interfejsie API przy użyciu struktury WS_FAULT. Mimo że błąd ma stały zestaw pól używanych do dostarczania informacji o awarii (takich jak WS_FAULT_CODE, który identyfikuje typ błędu, oraz WS_FAULT_REASON zawierający tekst opisujący błąd), zawiera również pole szczegółów, które można użyć do określenia dowolnej zawartości XML odnoszącej się do błędu.
Generowanie błędów w usłudze
Usługa zazwyczaj wysyła błąd z powodu błędu napotkanego podczas przetwarzania żądania. Model używany przez ten interfejs API polega na tym, że kod w usłudze, który napotka błąd przetwarzania, przechwytuje niezbędne informacje o błędzie w obiekcie WS_ERROR, a następnie kod na wyższym poziomie w łańcuchu wywołań faktycznie wyśle błąd przy użyciu informacji przechwyconych w niższej warstwie. Ten schemat umożliwia kod, który wysyła błąd, aby był odizolowany od tego, w jaki sposób błędy są mapowane na błędy, jednocześnie umożliwiając wysyłanie zaawansowanych informacji o błędach.
Następujące właściwości mogą być używane z WsSetFaultErrorProperty do przechwytywania informacji o błędach dla obiektu WS_ERROR:
- WS_FAULT_ERROR_PROPERTY_ACTION. Określa akcję do użycia dla komunikatu o błędzie. Jeśli to nie zostanie określone, zostanie podana akcja domyślna.
- WS_FAULT_ERROR_PROPERTY_FAULT. Zawiera on strukturę WS_FAULT, która jest wysyłana w treści komunikatu o błędzie.
- WS_FAULT_ERROR_PROPERTY_HEADER. Niektóre błędy obejmują nagłówki komunikatów, które są dodawane do komunikatu o błędzie w celu przekazywania błędów przetwarzania odnoszących się do nagłówków komunikatu żądania. Tej właściwości można użyć do określenia WS_XML_BUFFER zawierającego nagłówek, który ma zostać dodany do komunikatu o błędzie.
Wszystkie ciągi błędów dodawane do obiektu WS_ERROR są używane jako tekst w wysłanym błędzie. Ciągi błędów można dodać do obiektu błędu przy użyciu WsAddErrorString.
Funkcja WsSetFaultErrorProperty może służyć do ustawiania tych właściwości obiektu WS_ERROR.
Aby ustawić szczegóły błędu przechowywanego w obiekcie WS_ERROR, użyj funkcji WsSetFaultErrorDetail. Ta funkcja może służyć do kojarzenia dowolnej zawartości XML z błędem.
hosta usługi automatycznie wysyła błędy przy użyciu powyższych informacji w obiekcie WS_ERROR. Właściwość WS_SERVICE_PROPERTY_FAULT_DISCLOSURE może służyć do kontrolowania sposobu wysyłania szczegółowych informacji o błędzie.
Jeśli pracujesz w warstwie kanału, błędy mogą być wysyłane dla obiektu WS_ERROR przy użyciu WsSendFaultMessageForError.
Obsługa błędów na kliencie
Jeśli klient otrzymuje błąd podczas korzystania z serwera proxy usługi lub za pośrednictwem WsRequestReply lub WsReceiveMessage, zostanie zwrócony błąd WS_E_ENDPOINT_FAULT_RECEIVED. (Aby uzyskać więcej informacji, zobacz wartości zwracane usług sieci Web systemu Windows.) Te funkcje wypełnią również obiekt WS_ERROR dostarczony do wywołania informacjami o odebranych błędach.
Następujące właściwości obiektu WS_ERROR można wykonywać zapytania przy użyciu WsGetFaultErrorProperty w celu uzyskania informacji o odebranym błędzie:
- WS_FAULT_ERROR_PROPERTY_ACTION. Określa wartość akcji komunikatu o błędzie.
- WS_FAULT_ERROR_PROPERTY_FAULT. Zawiera on strukturę WS_FAULT, która została zdeserializowana z treści komunikatu o błędzie.
Błąd może zawierać dowolną dodatkową zawartość XML w szczegółach błędu. Dostęp do niego można uzyskać przy użyciu funkcji WsGetFaultErrorDetail.
Używanie błędów z komunikatami
Poniższa sekcja ma zastosowanie w przypadku bezpośredniego radzenia sobie z zawartością treści komunikatu o błędzie.
Zawartość treści komunikatu o błędzie jest reprezentowana przez standardową strukturę WS_FAULT, która ma wbudowaną obsługę serializacji.
Na przykład następujący kod może służyć do zapisania błędu w treści komunikatu:
HRESULT hr;
WS_ELEMENT_DESCRIPTION faultDescription = { NULL, WS_FAULT_TYPE, NULL, NULL };
WS_FAULT fault = { ... };
hr = WsWriteBody(message, &faultDescription, WS_WRITE_REQUIRED_VALUE, &fault, sizeof(fault), error);
Poniższy kod może służyć do odczytywania błędu z treści komunikatu:
HRESULT hr;
WS_ELEMENT_DESCRIPTION faultDescription = { NULL, WS_FAULT_TYPE, NULL, NULL };
WS_FAULT fault;
hr = WsReadBody(message, &faultDescription, WS_READ_REQUIRED_VALUE, &fault, sizeof(fault), error);
Aby dowiedzieć się, czy odebrany komunikat jest błędem, czy nie, można skonsultować się z WS_MESSAGE_PROPERTY_IS_FAULT. Ta właściwość jest ustawiana na podstawie tego, czy pierwszy element w treści jest elementem błędu podczas WsReadMessageStart, czy WsReadEnvelopeStart.
Aby utworzyć WS_FAULT na podstawie WS_ERROR, użyj funkcji WsCreateFaultFromError.
Następujące wyliczenia są częścią błędów:
Następujące funkcje są częścią błędów:
- WsCreateFaultFromError
- WsGetFaultErrorDetail
- WsGetFaultErrorProperty
- WsSetFaultErrorDetail
- WsSetFaultErrorProperty
Następujące struktury są częścią błędów: