→ASP.NETでのWebサービス開発に関するメモ
→WebAPI関連
→ASP.NET AJAX関連
.NETで作る場合†
- Visual StudioからWeb参照するやり方
- IDEでプロジェクトの参照でWeb参照をするとプロキシクラスが自動生成されてあたかも普通のクラスのように使える
- サービスの名前がHogeとしたら、「SvcHoge」というような名前のクラスが生成される
- サービスのURLが変わった場合はSvcHoge.Urlを書き換えればよいようだ(未確認)
- サービスの引数などが変更になったときはWeb参照をやり直す(プロキシクラスを生成しなおす)必要がある模様
- 使用プロトコルは'SOAP'、'SOAP12'、'HttpGet'、'HttpPost'、またはカスタム プロトコルから選べる
VBで作る場合†
- 以下の方法がある
- PocketSOAPを使う
- MS SOAP Toolkitを使う
- VBからMicrosoft SOAP Type Library 3.0を参照する
PocketSoap†
MS SOAP Toolkitについて†
SoapClient30オブジェクト†
- 以下のオブジェクトに依存する
- SoapSerializer30
- SoapReader30
- WSDLReader30
- WSDLOperation30
WSDL Generator†
- プロキシコードのジェネレータではなく、WSDLそのもののジェネレータ
Trace ユーティリティ†
- IISサーバの待ちうけポートをIISマネージャから8080などに変える
- ※POPFileなどを使っていると既にポート8080が使われているので注意
- File -> New -> Formated Traceなどでユーティリティのデスティネーションポートを8080にし、ローカルポートを80として設定する
- Formatedというのは、HTTPヘッダを切り離して表示するかどうかの違い
- 最低限の機能という感じで、あまり使いやすいものではない
サンプル†
'---------------------------------
' High Level APIで実際に動かしてみたサンプル
'---------------------------------
Private Sub cmdTest_Click()
Dim sc As SoapClient30
Set sc = New SoapClient30
Call sc.MSSoapInit("http://localhost/Test/SrvTst.asmx?WSDL")
Dim s As String
Dim a As String
Dim b As String
a = tbA.Text
b = tbB.Text
s = sc.Test2(a, b)
MsgBox (s)
lblC.Caption = sc.GetVal()
End Sub
タイムアウトの設定†
ユーザ定義した型を引数や戻り値で扱うには?†
- 以下の方法がある
- Type Mapperなるものを使う
- COM オブジェクトとしてマップする
- Type Mapperにはさらに種類がある
- IXMLDOMNodeList parameterを使う(こっちの方が楽だと思う)
- DOMとしてマップする
- Microsoft XML, v4.0以上を参照設定する必要あり
ユーザ定義型を引数として渡すとき†
- このような型をパラメータとして渡したいとき
//注意:Webサービスの引数に使うクラスにはデフォルトコンストラクタが必要
public class PrmCircle
{
public double Lat;
public double Lon;
public double Rad;
public PrmSyokenCircle()
{
Lat = 0;
Lon = 0;
Rad = 0;
}
}
- VBでの渡し方
Dim sc As SoapClient30
Set sc = New SoapClient30
'SOAP Client初期化
Call sc.MSSoapInit(wsdlURL)
Dim dom As New DOMDocument30
Dim list As IXMLDOMNodeList
Dim elm As IXMLDOMElement
Set dom.documentElement = dom.createElement("PrmCircle")
Set elm = dom.createElement("Lat")
elm.Text = "0.1"
Call dom.documentElement.appendChild(elm)
Set elm = dom.createElement("Lon")
elm.Text = "0.2"
Call dom.documentElement.appendChild(elm)
Set elm = dom.createElement("Rad")
elm.Text = "1.0"
Call dom.documentElement.appendChild(elm)
Set list = dom.documentElement.childNodes
Dim lists(0) As IXMLDOMNodeList
Set lists(0) = list
Dim ret As IXMLDOMNodeList
Set ret = sc.HogeCall(lists)
ユーザ定義型の中で配列を使うには†
- パラメータとなる型のメンバはなぜか1つだけでは実行時エラーになるので2つ以上のメンバがないといけないようだ。原因は不明。
- パラメータがこのような場合
public class PrmPoint
{
public double Lat;
public double Lon;
}
public class PrmPolygon
{
public int Cnt; <-- このような場合、メンバが2つ以上必要であるらしい?
public PrmPoint[] Pnts;
public PrmPolygon()
{
Pnts = null;
}
}
- クライアント側の例
Dim sc As SoapClient30
Set sc = New SoapClient30
'SOAP Client初期化
Call sc.MSSoapInit(wsdlURL)
Dim dom As New DOMDocument26
Dim list As IXMLDOMNodeList
Dim elm As IXMLDOMElement
Dim Pnts As IXMLDOMElement
Dim pnt As IXMLDOMElement
Dim lists(1) As IXMLDOMNodeList
Set dom.documentElement = dom.createElement("PrmPolygon")
Set elm = dom.createElement("Cnt")
elm.Text = "0"
Call dom.documentElement.appendChild(elm)
Set Pnts = dom.createElement("Pnts")
Set pnt = dom.createElement("PrmPoint")
Set elm = dom.createElement("Lat")
elm.Text = "0.1"
Call pnt.appendChild(elm)
Set elm = dom.createElement("Lon")
elm.Text = "0.2"
Call pnt.appendChild(elm)
Call Pnts.appendChild(pnt)
Set pnt = dom.createElement("PrmPoint")
Set elm = dom.createElement("Lat")
elm.Text = "0.3"
Call pnt.appendChild(elm)
Set elm = dom.createElement("Lon")
elm.Text = "0.4"
Call pnt.appendChild(elm)
Call Pnts.appendChild(pnt)
Call dom.documentElement.appendChild(Pnts)
Set list = dom.documentElement.childNodes
Set lists(0) = list
Set dom.documentElement = dom.createElement("PrmPolygon")
Set elm = dom.createElement("Cnt")
elm.Text = "1"
Call dom.documentElement.appendChild(elm)
Set Pnts = dom.createElement("Pnts")
Set pnt = dom.createElement("PrmPoint")
Set elm = dom.createElement("Lat")
elm.Text = "0.5"
Call pnt.appendChild(elm)
Set elm = dom.createElement("Lon")
elm.Text = "0.6"
Call pnt.appendChild(elm)
Call Pnts.appendChild(pnt)
Set pnt = dom.createElement("PrmPoint")
Set elm = dom.createElement("Lat")
elm.Text = "0.7"
Call pnt.appendChild(elm)
Set elm = dom.createElement("Lon")
elm.Text = "0.8"
Call pnt.appendChild(elm)
Call Pnts.appendChild(pnt)
Call dom.documentElement.appendChild(Pnts)
Set list = dom.documentElement.childNodes
Set lists(1) = list
Dim ret As IXMLDOMNodeList
Set ret = sc.HogeCall(lists)