Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

SOAP拡張機能でSoapExceptionに例外情報を付加する

例外の一元的なハンドリングと例外情報の付加

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/01/17 00:00

SOAPの仕様では、例外発生時にdetail要素に任意の情報を付加するように定められています。しかし、特別な仕組みを構築せずWebサービスを作成した状態では、detail要素には何の情報も設定されません。本稿では、.NET Frameworkで提供されるSOAP機能拡張を活用し、例外情報を付加するSoapExtensionクラスの作成方法について説明します。

目次

はじめに

 SOAPとは、XMLで構成されたメッセージを、HTTPなどのプロトコルで送受信するための仕組みです。メッセージは送信する際にXML形式にシリアライズされ、受信する際には逆シリアライズされます。正常時はもちろん例外発生時にも同様にXML形式で情報が返されます。

 SOAPの仕様によると例外発生時には、このXML形式に定義されるdetail要素に任意の情報を付加するように定められています。しかし、特別な仕組みを構築せず、Webサービスを作成した状態で例外が発生しても、detail要素には何の情報も設定されません。取得できる情報はmessage要素に含まれるExceptionのメッセージとスタックトレース程度です。

 そこで本稿では、.NET Frameworkで提供されるSOAP機能拡張を使い、Webサービス内で発生した例外を一元的にハンドリングし、detail要素に例外情報を付加するSoapExtensionクラスの作成方法について説明します。

detail要素の設定方法

 まず、例外発生時のSOAPメッセージにdetail要素を設定するには、どのような方策が考えられるでしょうか?

  1. 発生した例外を補足する度にSoapExceptionを生成し、プロパティに情報を設定する。
  2. プロパティに値が設定されるような例外クラスを独自に作成し、SoapExceptionクラスを継承させる。

 上記1の場合は、例外が発生する箇所に付加情報を設定するコーディングを都度行わなくてはなりませんし、上記2の場合は付加情報を設定する箇所を一元化できても、NullReferenceExceptionなど実行時に発生するすべての例外をカバーすることはできません。そこでこれらの問題を解決するために、SOAP機能拡張を活用します。

SOAP拡張機能とは?

 SOAP拡張機能とは、メッセージ処理の特定の段階でメッセージの検査や変更処理を行うことができる拡張用のアーキテクチャです。実際のコーディングではSoapExtensionクラス、SoapExtensionAttributeクラスをそれぞれを継承したクラスを作成し、任意のメソッドに属性を付与することで、Webサービスメソッド本体に手を加えることなく、SOAP拡張機能の仕組みを利用することができます。

サンプルプログラムの説明

 サンプルは、Webサービスとクライアントプログラムに分かれています。Webサービスの作成手順について、ここでは説明しません。詳しくは、『XML Web サービスの作成とアクセスに関するチュートリアル』(MSDNライブラリ)を参照してください。

Webサービス

 サンプルのWebサービスとして、引数として文字列を受け取り、生成したメッセージを返すGenerateMessageメソッドを実装したMessageServiceクラスを作成しました。このメソッドは引数の文字列が空であった場合、例外を返します。GenerateMessageメソッドにはWebサービスとして公開するため<WebMethod>属性を付与しています。

SoapExtension適用前のMessageService.vbの抜粋
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols

Public Class MessageService
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    Public Function GenerateMessage(ByVal str As String) As String
        If String.IsNullOrEmpty(str) Then
            Throw New ArgumentException("空の文字は無効です。")
        End If
        Return "Hello !" + str
    End Function

End Class
補足説明
 本稿ではサンプルコードを簡潔にするため<WebService>属性、<WebServiceBinding>属性は省略しています。省略した場合、これらの属性によって設定できる値にはデフォルト値が設定されます。

クライアントプログラム

 クライアントプログラムとして「SampleForm」クラスを作成しました。SampleFormには文字列を入力するテキストボックスと、生成されたメッセージを表示するテキストボックス、[表示]ボタンを配置しています。[表示]ボタンクリック時にWebサービスのGenerateMessage関数でメッセージを取得し、表示しています。またSoapException発生時にはmessageプロパティから情報を取得し、ダイアログ表示しています。

SoapExtension適用前のSampleForm.vbの抜粋
Imports Microsoft.VisualBasic
Imports System.Web.Services.Protocols

Public Class SampleForm

    Private Sub Button1_Click(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles Button1.Click
        Dim service As MessageProxy.MessageService = _
                New MessageProxy.MessageService
        Try
            TextBox2.Text = service.GenerateMessage(TextBox1.Text)
        Catch ex As SoapException
            MessageBox.Show(ex.message, "エラー情報")
        End Try
    End Sub

End Class

実行例

 正常実行時の画面は次のようになります。

サンプルアプリケーションの実行画面
サンプルアプリケーションの実行画面

 このときのSOAP通信内容をトレースしてみると、次のようになります。

正常時のSOAP通信の内容
正常時のSOAP通信の内容
補足説明
 SOAP通信の内容を取得するツールとして本稿では「SOAP Toolkit 3.0」を使用しました。本ツールはマイクロソフトが提供するもので、あらかじめリクエストを受信するポート、フォワードするホストとポートを設定しておくことで、その通信内容をトレースすることができます。入手先やインストール方法、使い方については本稿の最後のSoapToolKitの参考情報を参照してください。

 引数を空にし、例外を発生させた場合、次のようなダイアログが表示されます。

エラー発生時のダイアログ
エラー発生時のダイアログ

 このときのSOAP通信内容をトレースしてみると、次のようになります。

Sエラー発生時のSOAP通信の内容
Sエラー発生時のSOAP通信の内容

 この状態ではエラーの内容が分かりづらい上に、必要な情報を取得することもできません。それでは、SOAP機能拡張を利用して例外情報を付加してみましょう。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2007/11/10 21:05 SampleExtentionクラスから冗長なコードを削除

  • 2007/07/16 19:51 読者からのご指摘により一部スペルミスを修正

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

  • WINGSプロジェクト 奥山 学(オクヤマ マナブ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5