【2/17】今年は「濃厚」技術トーク!@ITメールセミナー スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷
 

特集
次世代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サービスを試す」

ホワイトペーパーTechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

- PR -
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  企業の仮想化に足りない“発想”とは?
仮想化運用管理のキモは意外なところに!

New!
  操作もマニュアルも分かりやすい!
ユーザー視点で開発されたPC管理ツール

New!
  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  セキュリティを知り尽くす上野氏が登壇!
@ITメールソリューションLive! in Tokyo

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  世界に通用するストレージの作り方とは?
製品に込めた思いを富士通の開発者に聞く

  OSSで手間も時間も、障害も減った――
「マピオンの事例」オープンソース活用法

  「ノートPCの持ち出し禁止」で大丈夫?
情報漏えいを防ぐ管理手法とインフラは?

  1日の処理を1秒に――MySQLの達人が語る
「コスト削減」できるチューニング

  ドキュメント作成を自動化して、SEの作業
効率を大幅アップ! Visio 2007の魅力

  急速に広がるHyper-Vでのサーバ仮想化
そのベストプラクティスをデルが解説

  @IT主催セミナーで語られた、「担当者に
求められるセキュリティ対策」をレポート

  @IT「Windows 7」 特設サイトオープン!
最新情報・移行ノウハウを公開しています