特集
次世代XML Webサービスを試す Part 4

2.WSEとWS-Attachments

インフォテリア株式会社
吉松 史彰
2003/04/02

Page1 Page2 Page3 Page4

WSEとWS-Attachments

 WSEで添付ファイルを扱う手順は簡単だ。ここでは、添付ファイルを受け取って保存するWebサービスと、そのWebサービスに添付ファイルを送信するクライアントを作成してみる。

 まず、次の1から3までの手順は、本連載のPart1でWS-Securityの実装を行ったときと同じで、WSEの機能が使えるようにするための準備だ。

Visual Studio .NET(以下VS.NET)でASP.NET Webサービス・プロジェクトを新しく作成する。ここではプロジェクトの名前を「WSEDIME」とした。

VS.NETの「参照の追加」機能でMicrosoft.Web.Services.dllへ参照を追加する。

Web.configファイルを編集して、system.web要素の子要素になるように次の要素を記述して、XML Webサービスの実行時にSoapExtensionが起動されるようにする。

<webServices>
  <soapExtensionTypes>
    <add type="Microsoft.Web.Services.WebServicesExtension, Microsoft.Web.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="1" group="0"/>
  </soapExtensionTypes>
</webServices>
Web.configファイルでのSoapExtensionの設定
XML Webサービスの実行時にSoapExtensionが起動されるようにする。

C:\Inetpub\wwwroot\WSEDIMEフォルダにincomingサブフォルダを作成する。

 このフォルダに添付されたファイルを保存するので、適切なNTFSアクセス権を設定しなければならない。デフォルト構成の場合は、ASPNETユーザーに書き込み権限を与えればよい。

Service1.asmx.csファイルに次のWebMethodを追加する。

[WebMethod]
public string PutData(string originalName) {
  SoapContext ctx = HttpSoapContext.RequestContext;
  if (ctx.Attachments.Count == 0) {
    throw new SoapException("Attachments required.",
        new XmlQualifiedName("Client",
        "http://schemas.xmlsoap.org/soap/envelope"));
  }
  FileStream fs = new FileStream(
      Server.MapPath("incoming/" + originalName),
      FileMode.CreateNew, FileAccess.Write, FileShare.None);

  byte[] buf = new byte[ctx.Attachments[0].Stream.Length];
  ctx.Attachments[0].Stream.Read(buf, 0, buf.Length);
  fs.Write(buf, 0, buf.Length);
  fs.Close();
  return "http://localhost/WSEDIME/incoming/" + originalName;
}
Webサービスとなるメソッドの追加

 このコードでは、クライアントから添付されてきたファイルをincomingフォルダに保存し、そのURLを返信している。添付ファイルの保存は、WSEによって作成されるSoapContextクラスのインスタンスにあるAttachmentsプロパティにアクセスして添付ファイルを取得し、それを読み取ってファイルに書き込むだけのコードで実現できる。このコードでは添付ファイルは1つしか処理しない。

 これでサーバ側の実装は完了したので、クライアント側のアプリケーションも作成しよう。

Windowsアプリケーションのプロジェクトを作成する。ここでは名前をWSEDIMEClientとした。

プロジェクトにMicrosoft.Web.Services.dllへの参照を追加する。

上記手順で作成したWebサービスに対してWeb参照の追加を行う。

http://localhost/WSEDIME/Service1.asmx?wsdl

というURLでWSDLが取得できる。

作成されたプロキシ・クラスのソース・コードを変更する。

 プロキシ・クラスのソース・コードは、Reference.csという名前で[Web References」の中の[localhost」の下にある。表示されない場合は、VS.NETのソリューション・エクスプローラで[すべてのファイルを表示」ボタンをクリックすれば表示される。

 変更内容は、プロキシ・クラス「WSERoutingClient.localhost.Service1」の基底クラスを、

System.Web.Services.Protocols.SoapHttpClientProtocol

から、

Microsoft.Web.Services.WebServicesClientProtocol

にすることだけだ。

public class Service1 :
Microsoft.Web.Services.WebServicesClientProtocol {
  ……
自動生成されたプロキシ・クラスの基底クラスの修正

フォームにボタンとテキスト・ボックス、そして添付ファイルを選択するための[ファイルを開く]ダイアログ・ボックス(OpenFileDialogコンポーネント)を1つずつ貼り付ける。

ボタンのClickイベントのイベント・ハンドラを実装する。ここでファイルを添付するコードを実装する。

private void button1_Click(object sender, System.EventArgs e) {
  localhost.Service1 svc = new localhost.Service1();
  openFileDialog1.CheckFileExists = true;
  if (openFileDialog1.ShowDialog() == DialogResult.OK) {
    System.IO.Stream str = openFileDialog1.OpenFile();
    svc.RequestSoapContext.Attachments.Add(
        new DimeAttachment("image/jpeg",
        TypeFormatEnum.MediaType, str));
    textBox1.Text = svc.PutData(
        new System.IO.FileInfo(openFileDialog1.FileName).Name);
    str.Close();
  }
}
Webサービスを呼び出すボタンのイベント・ハンドラ
ここでは「ファイルを開く」ダイアログ・ボックスを開き、選択されたファイルを添付ファイルとして設定してから、Webサービスを呼び出している。

 ここでは、まず[ファイルを開く]ダイアログ・ボックスを表示して、ユーザーにファイルを選択させる。ファイルが選択されたら、そのファイルのストリームを開いて、DimeAttachmentクラスのインスタンスを作成する。このときファイルの種類と開いたストリームをコンストラクタの引数で渡している。作成されたDimeAttachmentクラスのインスタンスは、WSEによって作成されるRequestSoapContextのAttachmentsプロパティに追加する。これで添付ファイルが設定できたので、メソッドを実行してSOAPメッセージを送信する。

 このコードを実行すると、DIMEメッセージがHTTPプロトコルに乗ってASP.NETのWebサービスに届く。このとき、クライアントからは次に解説するようなデータが送信される。


 INDEX
  [特集]次世代XML Webサービスを試す Part 4
  SOAPメッセージとファイル添付
    1.SOAPメッセージの添付ファイル
  2.WSEとWS-Attachments
    3.DIMEメッセージの解析
    4.ほかのWS-Attachments実装との相互運用
 
更新履歴
【2003/04/02】本ページのクライアント・アプリケーション作成手順のにおいて、OpenFileDialogコンポーネントを貼り付ける手順が抜けておりました。お詫びして訂正させていただきます。

 「特集:次世代XML Webサービスを試す」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間