→ASP.NETでのWebサービス開発に関するメモ

→WebAPI関連

#contents

*JavaScript(Ajax)で作る場合 [#ueb3bc91]
→ASP.NET AJAX関連

-[[Call SOAP Web services with Ajax part1>http://www.ibm.com/developerworks/webservices/library/ws-wsajax/]]
-[[同 part 2>http://www.ibm.com/developerworks/jp/webservices/library/ws-wsajax2/index.html]]


*.NETで作る場合 [#se6cbdd3]
-WSDL.exeでプロキシクラスを作るやり方
 wsdl.exe <オプション> <URL またはパス> <URL またはパス> ...
--WSDLの内容を見てクライアント側プロキシクラスを生成してくれるツール。
--そのプロキシクラスを使えばクライアント側は簡単に作れる
--ただしC#,VB.NET, JavaScript, Visual J#のいずれか
--WSDL.EXEはVisual Studio用のコマンドプロンプトから実行可能

-Visual StudioからWeb参照するやり方
--IDEでプロジェクトの参照でWeb参照をするとプロキシクラスが自動生成されてあたかも普通のクラスのように使える
--サービスの名前がHogeとしたら、「SvcHoge」というような名前のクラスが生成される
--サービスのURLが変わった場合はSvcHoge.Urlを書き換えればよいようだ(未確認)
--サービスの引数などが変更になったときはWeb参照をやり直す(プロキシクラスを生成しなおす)必要がある模様
--使用プロトコルは'SOAP'、'SOAP12'、'HttpGet'、'HttpPost'、またはカスタム プロトコルから選べる


*VBで作る場合 [#v82ef3a4]
-以下の方法がある
--PocketSOAPを使う
--MS SOAP Toolkitを使う
---VBからMicrosoft SOAP Type Library 3.0を参照する

*PocketSoap [#w81a7f05]
-[[PocketSoap>http://www.pocketsoap.com/pocketsoap/]]
-[[PocketSoap用Proxyジェネレータ>http://www.pocketsoap.com/wsdl/]]
-ASP.NETのWebサービスに引数を送っても無視される問題
--[[FAQの"Why does my .NET webservice ignore the data I send it with PocketSOAP ?"の項>http://www.pocketsoap.com/faq/default.aspx#dotnetdoclit]]を参照
 Set the EncodingStyle to ""
 Specify the namespace URI for all the parameters.
--要するに、ネームスペースをちゃんと指定しないと引数を無視される


*MS SOAP Toolkitについて [#p946a02f]
-[[Downloadページ>http://msdn.microsoft.com/webservices/webservices/building/soaptk/default.aspx]]

**SoapClient30オブジェクト [#n1fd0dae]
-以下のオブジェクトに依存する
--SoapSerializer30
--SoapReader30
--WSDLReader30
--WSDLOperation30

**WSDL Generator [#ze50a13a]
-プロキシコードのジェネレータではなく、WSDLそのもののジェネレータ

**Trace ユーティリティ [#qc22cf5a]
-IISサーバの待ちうけポートをIISマネージャから8080などに変える
--※POPFileなどを使っていると既にポート8080が使われているので注意
-File -> New -> Formated Traceなどでユーティリティのデスティネーションポートを8080にし、ローカルポートを80として設定する
-Formatedというのは、HTTPヘッダを切り離して表示するかどうかの違い
-最低限の機能という感じで、あまり使いやすいものではない

**サンプル [#we1ff313]
 '---------------------------------
 ' 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

**タイムアウトの設定 [#p1c884b4]
-Timeout値(処理終了の待ち時間)の変更は以下のようにやる
 Dim sc As SoapClient30
 Set sc = New SoapClient30
    
 'サーバのURLにあわせる
 Call sc.MSSoapInit(wsdlURL)
 sc.ConnectorProperty("Timeout") = 90000 'ms単位。デフォルトは30000
-MSSoapInit()を処理した後にやること。
-Webサーバ側のタイムアウト設定も合わせてやっておくこと(IISの設定とWeb.configの設定がある。Web.configの方についてはASP.NET関連のページを見よ)
-ConnectTimeoutプロパティはサーバへの接続を待つ時間のタイムアウトなので混同しないように

**ユーザ定義した型を引数や戻り値で扱うには? [#j89950b4]
-以下の方法がある
-Type Mapperなるものを使う
--COM オブジェクトとしてマップする
--Type Mapperにはさらに種類がある
---Generic Type Mapper
   ・UDT(User Designed Type) Mapper
     ・COMではなくUserDefined dataを使いたい場合
   ・Custom Type Mapper
     ・双方向リストやグラフを使う場合
     ・elementではなくattributeを読み書きしたい場合
     ・マッピングが1対1対応しない場合

-IXMLDOMNodeList parameterを使う(こっちの方が楽だと思う)
--DOMとしてマップする
---COMを使いたくない場合
--Microsoft XML, v4.0以上を参照設定する必要あり


**ユーザ定義型を引数として渡すとき [#o98f9b9d]
-このような型をパラメータとして渡したいとき
  //注意: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)

**ユーザ定義型の中で配列を使うには [#ia1a9484]
-パラメータとなる型のメンバはなぜか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)

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS