2008年4月23日水曜日

.NET ウェブサービスが SOAP リクエスト パラメータを受理しない

http://www.nsoftware.com/kb/showentry.aspx?entry=04300305

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


VS.NET でウェブサービスを書いているのですが、SOAP コンポーネントを使ってこのサービスをアクセスした場合、SOAP リクエストに付与したパラメータをウェブサービス側で受け取れません。

解決法:


あなたが呼び出そうとしているウェブサービスは RPC スタイルですか?それとも Document スタイルですか?

もし不明の場合は、当該サービスの文書をチェックしてください。あるいはもしそのサービスが .NET サービスでありそのソースコードにアクセスできるのであれば、当該サービスおよび webmethod の SoapRPCService 属性および SoapRPCMethod 属性をチェックするか、あるいは同じく当該サービスおよび webmethod の SoapDocumentService 属性および SoapDocumentMethod 属性をチェックします。

当該サービスが Document スタイルの場合、メソッド名のプレフィックスが存在しないことを確認します。(既定値では "m" がメソッド名前空間プレフィックスとして使用されます。) これを行うには、MethodNamespacePrefix 構成設定パラメータをコード内で設定します。例:
SOAP1.Method = "MyTest"
SOAP1.MethodURI = "http://localhost/webservice/"
SOAP1.ActionURI = "http://localhost/webservice/MyTest"
SOAP1.URL = "http://localhost/WebService/test.asmx"
SOAP1.AddParam "x", "something"
SOAP1.Config "MethodNameSpaceprefix="
SOAP1.SendRequest

SOAP MethodURI およびその他のプロパティ

http://www.nsoftware.com/kb/showentry.aspx?entry=06050217

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


SOAP コンポーネントを使ってアクセスしたい SOAP サービスの MethodURI やその他の必要事項を知るにはどうすれば良いですか?

解決法:


MethodURI、Method、ActionURI およびその他の必要事項は全てアクセスしたいいサービスの WSDL ファイルを調べることで判明します。それぞれの SOAP サービスには1つずつ WSDL ファイルが存在しており、通常は http://サービスURL?WSDL でアクセスできます。

弊社サイト http://nsoftware.com/kb/ には "Web Service Proxy Generator" が用意されており、これをご利用いただくことで自動的に WSDL ファイルを調査し、そのサービスを利用するためにどのように弊社の SOAP コンポーネントを使用するかが示されます。

【訳注】直接のリンクは http://www.nsoftware.com/kb/apps/wspg/

HTTP 経由でのプロクシサーバ認証

http://www.nsoftware.com/kb/showentry.aspx?entry=12119701

該当製品:


  • IP*Works!


現象:


プロクシサーバを使うように変更したのですが、そのサーバはプロクシ認証を必要とします。"USER" プロパティと "PASSWORD" プロパティを使おうとしているのですが、"407 proxy authenticate required" で失敗するようになってしまいました。

解決法:


.User プロパティおよび .Password プロパティは認証文字列を計算しウェブサイトに送信します。一方プロクシ認証では、ProxyUser プロパティおよび ProxyPassword プロパティを使用することになります。

旧バージョンの IP*Works! では、Proxy-Authorization ヘッダをあなた自身が手で設定する必要があります。

この場合、認証文字列の計算は以下の例のように、まず .User プロパティおよび .Password プロパティに値を設定し、.Authorization プロパティを読み取ります。(この手順は基本認証を使って認証文字列を計算するために、1度だけ行う必要があります。)
     '認証文字列の計算
HTTP1.User = "myname" 'put your proxy login name here
HTTP1.Password = "mypassword" 'put your proxy password here
HTTP1.OtherHeaders = "Proxy-Authorization: " + _
HTTP1.Authorization + chr(13) + chr(10)

'認証はプロキシに対してのみなので空文字列を設定しておく
HTTP1.User = ""
HTTP1.Password = ""

プロキシサーバを通過する全てのリクエストはこの "Proxy-Authorization: ..." ヘッダを .OtherHeaders プロパティ内に保持しているべきです。

個々のプロパティについてはヘルプファイルを参照して下さい。

なお、.URL プロパティに値を設定する時にサーバ値を変更すると、User プロパティおよび Password プロパティの値はクリアされる点に注意してください。これはセキュリティ上の理由によります。

HTTP におけるリダイレクトの取り扱い方

http://www.nsoftware.com/kb/showentry.aspx?entry=07190014

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


HTTP でリダイレクトを扱うには、どのようにすれば良いですか?

解決法:


IP*Works! Version 5 は【訳注: V6, V8 も】FollowRedirects プロパティをサポートしており、リダイレクトを自動的に処理させることが可能です。実例:
HTTP1.FollowRedirects = frAlways
HTTP1.Get "http://www.nsoftware.com"

IP*Works! の過去のバージョン: サーバは Location ヘッダに新しい URL を設定した上でエラーコード 301 または 302 を返します。HTTP コントロールは "Redirected" という説明文と共にエラーまたは例外を発生させますので、Header イベント内で Location ヘッダを保存した上でコントロールが生成するエラーイベントあるいは例外を処理し、この新しい場所へリクエストを送信します。

VB による実例を以下に示します。
     Dim gNewURL as String

Private Sub HTTP1_Header(Field As String, Value As String)
If LCase(Field) = "location" Then gNewURL = Value
End Sub

Private Sub Command1_Click()
On Error GoTo errhandler
HTTP1.WinsockLoaded = True
HTTP1.URL = "http://www.microsoft.com/support"
HTTP1.Action = a_GetDocument
Exit Sub
errhandler:
If Err.Number = 20152 And (Left(Error, 4) = "303 " Or _
Left(Error, 4) = "302 ") Then
HTTP1.URL = gNewURL 'assign new URL
Resume 'repeat action
End If
End Sub

HTTP コントロールでバイナリファイルを受信する方法

http://www.nsoftware.com/kb/showentry.aspx?entry=09039731

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


非テキストデータ (gif、jpg 等) の取得に HTTP コンポーネントを使用したいと思います。HTTP でこれは可能でしょうか?それとも何か他のもの (例えば IPPORT) を使わなければならないでしょうか?

解決法:


可能です。まず最初に URL プロパティと (オプションで) LocalFile プロパティを割り当てます。次に Get メソッドを呼び出します。データは LocalFile プロパティに指定されたファイル内に格納されるか、あるいは Transfer イベントの引数に付与されます。実例については httpget デモをご覧下さい。

2008年4月22日火曜日

HTTP で部分ダウンロードをする方法

http://www.nsoftware.com/kb/showentry.aspx?entry=07180010

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


HTTP で部分ダウンロード (partial download) を行うにはどうすれば良いですか?

解決法:


HTTP/1.1 では部分ダウンロードをサポートしています。(RFC2068 の第14.36節) あるファイルを部分ダウンロードするには、Range プロパティにバイト範囲を指定します。
     'the actual byte range
HTTP1.Range = "0-499" 'get only the first 500 bytes
HTTP1.Get URL

Range プロパティの書式は '-' で区切られた2つの数字により指定されるバイト範囲 (例えば '0-499') から成ります。例: 最初の500バイト: 0-499 次の500バイト: 500-999 最後の500バイト: -500

IP*Works! の旧バージョンには Range プロパティは含まれておらず、HTTPVersion プロパティに HTTP/1.1 プロトコルを設定すると共に OtherHeader プロパティを用いて Range ヘッダを設定する必要があります。

サーバ名を HTTP ヘッダ内に指定する方法

http://www.nsoftware.com/kb/showentry.aspx?entry=09039737

該当製品:


  • IP*Works!
  • IP*Works! SSL


現象:


HTTP リクエストヘッダにサーバ名称を含めて送信する必要があります。今日の幾つかのウェブサーバ単一の IP に対してマルチホームを許容しています。サーバが違いを認識する際には HTTP リクエストヘッダ内からサーバ名称を探し出します。IP*Works! コントロールはこれらを扱うことができますか?

解決法:


はい、扱うことができます。既定値では HTTP コントロールは自動的に Host ヘッダを送信します。

旧バージョンの IP*Works! はこれを既定値では行いませんでした。特別なヘッダを追加する場合は以下のようにします:
     HTTP1.URL = ...
HTTP1.OtherHeaders = "Host: " + HTTP1.URLServer + chr$(13)+chr$(10)