C# Programming

Image

Web Service

開発環境: Visual Studio 2005 

目次

  1. 目的
  2. 参考書
  3. Web Service の作成
  4. Web Service の発行
  5. Web サービスを呼び出すアプリケーションを作る
  6. JavaScript から XML Web Service を呼び出す

1.目的

Web Service をホスティング上で動作させて、接続を検証する。

2.参考書

  1. MSDN2: Windows 認証を使用するように XML Web サービスを構成する

3.Web Service の作成

まず、最初に Web Service (サーバー側)を作成します。

Visual Studio 2005 の[メインメニュー] → [ファイル] → [新規作成] → [Web サイト] を選択します。

すると、次のような [新しい Web サイト] ダイアログが表示されます。そこで、ASP.NET Web サービスを選択し、プロジェクトの場所として適切なディレクトリを指定します。ここでは、TestWebService とします。

Image

すると、TestWebService プロジェクトが作成され、Service.cs というサービスプログラムのテンプレートが表示されます。

Image

この中で、[WebMethod] 属性の HelloWorld メソッドが Web Service として登録されることになります。このメソッド自体は、"Hello World" の文字列を返すというシンプルなメソッドです。

もう、これだけで実行可能なサービスになっているので、そのまま実行すると次のような [デバッグが無効です] というダイアログが表示されるので、一応、デバッグを有効とするため、OKを押します。

Image

すると、次のような IE 画面が表示されます。

Image

ここで、HelloWorld のリンクをクリックすると、次のような Service の画面が表示され、HelloWorld を起動するための Web 画面が表示されます。

Image

そこで、起動ボタンを押すと、次のように Web Service から Hello World という文字列が返されてきているのがわかります。

Image

4.Web Service の発行

このままでは、ローカルで動いているだけなので、ホスティングサーバーにアップロードします。

その前に、Service.cs で次のように名前空間が "http://tempuri.org/" となっています。

[WebService(Namespace = "http://tempuri.org/")]

そこで、自分のドメインを名前空間に変更します。

また、引数を伴うメソッドをテストのために追加しておきます。

Service.cs
using System;
using
System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace = "http://uchukamen.com/")]
[
WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
   
public Service () {

        //デザインされたコンポーネントを使用する場合、次の行をコメントを解除してください
        //InitializeComponent();
   
}

    [WebMethod]
    public string HelloWorld() {
        return "Hello World";
    }

    [WebMethod]
    public int Add(int i, int j)
    {
        return i + j;
    }
}

次に、Visual Studio 2005 のメインメニューから [ビルド] → [Web サイトの発行]を選択します。

すると、次のような [Web サイトの発行] ダイアログが表示されます。

Image

そこで、ターゲットの場所をホスティング先を指定します。私の場合は、http://uchukamen.com/ なので、そこの下に TestWebService に発行することにします。厳密名は、必要に応じて使用すればよいでしょう。

OKボタンを押すと、次のように出力ダイアログに結果が表示されます。次のように発行が正常終了になっていればOKです。

Image

それでは、うまくアップロードできたかどうか確認してみます。

その前に、ホスティング先でのディレクトリに anonymous アクセスを許可し、スクリプトの実行権限を与える必要があります。その設定方法に関しては、各サービスプロバイダに問い合わせてください。

Cervi の場合は、Hosting Controller → Domains → Virtual Dir. → TestWebService を選択し、Properties ボタンを押す。Cervi の場合は、次のようになります。

Image

では、アップロード先の Service.asmx をWeb ブラウザからアクセスしてみてください。私の場合は、http://uchukamen.com/TestWebService/Service.asmx となります。次のように表示されれば、OKです。

Image

[ページを表示できません

プログラムの実行が許可されていないディレクトリから、CGI、ISAPI、またはその他の実行可能プログラムを実行しようとしました。 ]

というエラーが表示される場合には、ホスティング先でのディレクトリにスクリプトの実行権限を与える必要があります。

5.Web サービスを呼び出すアプリケーションを作る

では、このWeb サービスを呼び出すアプリケーションを作ってみます。

Visual Studio 2005 のメインメニューから、[ファイル] → [新規作成] → [プロジェクト] で Windows アプリケーションを作成します。

次に、[のメインメニュー] → [プロジェクト] → [Web 参照の追加] を選択します。

すると、次のような [Web 参照の追加] ダイアログが表示されますので、URL のところに先にアップロードしたサービスを指定します。

私の場合は、http://uchukamen.com/TestWebService/Service.asmx になります。なお、このサービスは公開しておきますので、自由にアクセスして結構です。

参照の追加ボタンを押して、Web 参照を追加します。

エラーになる場合は、URL が正しいかどうか、Anonymous がアクセスが許可されているか、スクリプトの実行が許可されているか確認してください。

Image

あとは、HelloWorld ボタンを押したときに HelloWorld の Web Service を呼び出して、結果を表示する処理と、Add ボタンを押したときに、TextBox から2つの値を Add ウェブサービスに渡して、受け取った結果を TextBox に書き出す処理を実装します。

 まずは、次のようなコントロールを貼り付けます。

Image

実装は至って簡単で、通常の名前空間のクラスのメソッド呼び出しと同じ要領です。

Form1.cs
private void button1_Click(object sender, EventArgs e)
{
com.uchukamen.
Service service = new com.uchukamen.Service();

    textBox1.Text = service.HelloWorld();
}

private void button2_Click(object sender, EventArgs e)
{
com.uchukamen.
Service service = new com.uchukamen.Service();

    textBox4.Text = service.Add(Int32.Parse(textBox2.Text), Int32.Parse(textBox3.Text)).ToString();
}

あとは実行するだけで、次のような結果が得られるはずです。


Image

ここでは、認証をしないで実行する方法について説明しましたが、認証が必要な場合は参考書1を参照してください。

--------------

余談: 

この程度の例を見ると、とても簡単なものと思われますが、実運用に耐えられるものを作ろうと思うと、複数にまたがる認証、非同期処理、トランザクション、エラー処理について、十二分な事前検討が必要です。簡単だと思って手を出すと、痛い目にあいそう・・・・

6.JavaScript から XML Web Service を呼び出す

JavaScript から、今回作成したWeb Service を呼び出します。

呼び出し方は、ActiveXObject でSoapClientを作成して、そこから呼び出します。

コードは、以下を参考。

Test.htm
<html>
<head>
<script langauge="javascript">
function helloworld() {
var sc = new ActiveXObject("MSSOAP.SoapClient");
sc.mssoapinit("http://uchukamen.com/TestWebService/Service.asmx?WSDL");
helloResult.value = sc.HelloWorld();
}

function calculate() {
var sc = new ActiveXObject("MSSOAP.SoapClient");
sc.mssoapinit("http://uchukamen.com/TestWebService/Service.asmx?WSDL");
calcResult.value = sc.Add(i.value, j.value);
}
</script>
</head>
<body>

<input type="text" id="helloResult" value="">
<input type="button" id="helloButton" value="Hello World" onclick="helloworld();">

<p></p>
<input type="text" id="i" value="">
+
<input type="text" id="j" value="">
=
<input type="text" id="calcResult" value="">

<input type="button" id="addButton" value="Add" onclick="calculate();">


</body>
</html>

実行結果

Image

ただし、スクリプトを実行しても安全だとマークされていない ActiveX コントロールの初期化とスクリプトの実行

をダイアログを表示する、か有効にする必要があります。変更方法は、IE → [ツール] → [インターネット オプション]で、

[セキュリティ] タブ → [レベルのカスタマイズ]

Image