C#でSOAPのWebサービスを非同期で呼び出すコードを紹介します。
概要
こちらの記事では同期呼び出しでSOAPインターフェイスを持つWebサービスのWebメソッドを呼び出すプログラムを紹介しました。同期呼び出しでも通常は大きな問題は起きませんが、Webサービス側で処理時間が長くかかる場合や、受け渡しのデータ量くなる場合、インターネットの接続が低帯域で通信速度が遅い場合など、Webメソッドの呼び出しに時間がかかる場合があります。
Webメソッドの呼び出しに時間がかかる環境で同期呼び出しを実行するとWebメソッドからの戻り値を取得する間、アプリケーションのUIがロックするなどの問題が発生する可能性があります。
非同期呼び出を利用することで、UIがロックする現象を避けられます。この記事では非同期呼び出しのプログラムとコードを紹介します。
プログラム例
Windows Formアプリケーションを新規に作成します。
Webサービスの参照を追加します。ソリューションエクスプローラのウィンドウで右クリックし、[サービス参照の追加]メニューをクリックします。
[サービス参照の追加]ダイアログが表示されます。WebサービスのURLを入力してWebサービスの参照を追加します。
Webサービスの参照が追加できました。
UI
下図のUIを作成します。テキストボックスを2つ、ボタンを1つ配置します。
コード
async, awaitを利用するコードと利用しないコードの2パターンを紹介します。
コード1:async awaitを利用しない場合
下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AsmxWebServiceAsyncCall
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
CallWebApiAsync1();
}
private void CallWebApiAsync1()
{
iPentecSimpleWebServiceReference.SimpleWebServiceSoapClient client = new iPentecSimpleWebServiceReference.SimpleWebServiceSoapClient();
Task<iPentecSimpleWebServiceReference.AddQuoteResponse> task = client.AddQuoteAsync(textBox1.Text);
task.Wait();
textBox2.Text = task.Result.Body.AddQuoteResult.ToString();
}
}
}
解説
ボタンをクリックすると CallWebApiAsync1() メソッドを呼び出します。
CallWebApiAsync1() メソッドでは以下の処理が実行されます。
下記のコードでSoapClient オブジェクトを作成します。
iPentecSimpleWebServiceReference.SimpleWebServiceSoapClient client = new iPentecSimpleWebServiceReference.SimpleWebServiceSoapClient();
SoapClientの
Webメソッド名+Async
のWebメソッドを非同期呼び出しするメソッドを呼び出します。戻り値は
Task<Webサービスの参照名.Webメソッド名+Response>
型となります。
Task<iPentecSimpleWebServiceReference.AddQuoteResponse> task = client.AddQuoteAsync(textBox1.Text);
非同期メソッドのため、Webメソッドの実行が完了するまで待機する必要があります。Wait()メソッドを呼び出し非同期処理の完了を待ちます。
task.Wait();
非同期処理が完了すると戻り値の結果が参照できます。TaskオブジェクトのResultプロパティのBodyプロパティ内の
Webメソッド名+Result
に戻り値の値が代入されています。戻り値の値をテキストボックスに表示します。
textBox2.Text = task.Result.Body.AddQuoteResult.ToString();
コード2:async awaitを利用する場合
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AsmxWebServiceAsyncCall
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
CallWebApiAsync2();
}
private async void CallWebApiAsync2()
{
iPentecSimpleWebServiceReference.SimpleWebServiceSoapClient client = new iPentecSimpleWebServiceReference.SimpleWebServiceSoapClient();
iPentecSimpleWebServiceReference.AddQuoteResponse resp = await client.AddQuoteAsync(textBox1.Text);
textBox2.Text = resp.Body.AddQuoteResult.ToString();
}
}
}
解説
ボタンをクリックすると CallWebApiAsync2() メソッドを呼び出します。
メソッド内でawaitを利用するため、メソッドの定義部分にasyncキーワードを記述します。
private async void CallWebApiAsync2()
CallWebApiAsync2() メソッドでは以下の処理が実行されます。
下記のコードでSoapClient オブジェクトを作成します。
iPentecSimpleWebServiceReference.SimpleWebServiceSoapClient client = new iPentecSimpleWebServiceReference.SimpleWebServiceSoapClient();
SoapClientの
Webメソッド名+Async
のWebメソッドを非同期呼び出しするメソッドを呼び出します。await キーワードを追加して呼び出すため、戻り値は
Webサービスの参照名.Webメソッド名+Response
型となります。
iPentecSimpleWebServiceReference.AddQuoteResponse resp = await client.AddQuoteAsync(textBox1.Text);
awaitを追加して呼び出したため、待機は自動で処理されます。非同期処理が完了すると下記のコードが実行され、戻り値が下部のテキストボックスに表示されます。
textBox2.Text = resp.Body.AddQuoteResult.ToString();
実行結果
async,awaitを利用する場合も、利用しない場合も同じ結果となります。
プロジェクトを実行します。下図のウィンドウが表示されます。
上部のテキストボックスに入力値の文字列を入力します。入力後[button1]をクリックします。
ボタンをクリックするとWebメソッドの呼び出しが実行されます。株のテキストボックスにWebメソッドからの戻り値が表示されます。AddQuoteメソッドが実行され入力文字列が「"」ダブルクォーテーションで囲まれた値が戻ることが確認できます。
SOAP WebサービスのWebメソッドを非同期で呼び出すことができました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-07
作成日: 2018-05-28