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

WebAPI関連

JavaScript(Ajax)で作る場合

ASP.NET AJAX関連

.NETで作る場合

  • 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で作る場合

  • 以下の方法がある
    • 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

タイムアウトの設定

  • 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プロパティはサーバへの接続を待つ時間のタイムアウトなので混同しないように

ユーザ定義した型を引数や戻り値で扱うには?

  • 以下の方法がある
  • 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以上を参照設定する必要あり

ユーザ定義型を引数として渡すとき

  • このような型をパラメータとして渡したいとき
     //注意: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)

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-05 (日) 11:17:09 (2d)