DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C#でのSOAPヘッダ追加方法について

環境/言語:[C# 2005、.NET Framework 2.0 SP1]
分類:[.NET]

はじめまして。いつも参考にさせていただいております。

当掲示板に質問を投げるのが適切かわかりませんが、かなり困っておりますので使用させていただきます。


「Amazon E-Commerce Serviceを使用する
(http://dobon.net/vb/melma/dotnet75.txt)」に近い形で、C#のWSDLを使用したSOAP使用でAmazonからの情報を取得した処理を作っています。
※プロキシクラスは、WEB参照追加より作成しました。

今回、Amazonから「電子認証が必要になる」旨連絡を受けました。
できれば、「WSセキュリティを利用せずに SOAP リクエストを処理する方法(下記URL)」で実装したいと思っています。
https://affiliate.amazon.co.jp/gp/associates/help/t126/a18?ie=UTF8&pf_rd%5Ft=501&ref%5F=amb%5Flink%5F84046896%5F3&pf%5Frd%5Fm=AN1VRQENFRJN5&pf%5Frd%5Fp=&pf%5Frd%5Fs=center-1&pf%5Frd%5Fr=&pf%5Frd%5Fi=assoc%5Fhelp%5Ft126%5Fa15


ただし、C#でSOAPヘッダを追加する方法が見つからず困っています。
あと、可能であれば極力PCに何かアプリをインストールすることを避けた形で実装したいと思っています。

ご存知の方がいらっしゃいましたら、ご教授の程よろしくお願いいたします。
なさりたいことが実現可能か検証していませんが、
Soap Extension を MSDN でお調べになってはいかがでしょうか?

見当違いでしたら、ごめんなさい。

> ただし、C#でSOAPヘッダを追加する方法が見つからず困っています。
> あと、可能であれば極力PCに何かアプリをインストールすることを避けた形で実装したいと思っています。
lpswさん、アドバイスありがとうございます。

> なさりたいことが実現可能か検証していませんが、
> Soap Extension を MSDN でお調べになってはいかがでしょうか?


「Soap Extension」についてこれから調べてみます。
ありがとうございました。
自己レスになります。

とりあえず、WSE 3.0(Web Services Enhancements (WSE) 3.0 for Microsoft .NET)をインストールした形では動くようになりました。
C# 2005、.NET Framework 2.0 SP1なので、プロキシクラスを WseWsdl3.exeで作成したり、Amazonのサンプルプログラムを多少いじったりはしましたが、概ねはAmazonサンプルから大きくいじらずに済みました。

ただし、この WSE 3.0を使用しているからか、以前より少し処理が重い気がします。

現在調査中ですが、WSE 3.0を使用しない代替の実装方法をご存じでしたらご教授ください。
以前、ご教授いただいた「Soap Extension」も引き続き調べています。
■No25252に返信(daiさんの記事)
> 自己レスになります。
>
> とりあえず、WSE 3.0(Web Services Enhancements (WSE) 3.0 for Microsoft .NET)をインストールした形では動くようになりました。

私はこちらの方はわからないです(勉強します)。

SoapExtension のほうは、以下は参考にならないでしょうか?

SOAP 拡張機能を使用した SOAP メッセージの変更
<http://msdn.microsoft.com/ja-jp/library/esw638yk.aspx>

ProcessMessage() で、SoapMessageStage.AfterSerialize あたりで
送信しようとしている XML に細工が出来ると思います。
lpswさん

> ProcessMessage() で、SoapMessageStage.AfterSerialize あたりで
> 送信しようとしている XML に細工が出来ると思います。


アドバイスありがとうございます。

前回のアドバイスから「Soap Extension」をMSDNやその他サイトで調べたところ、下記記事にぶつかったのもあり、少しずつ理解できているところです。
(VBソースなので、C#への組換えが必要でしたが)

http://codezine.jp/article/detail/834
 → これは、Body部のDetailへ付加するサンプルでした。


途中で、「Amazonのサンプルでも 『ProcessMessage』って見かけたな?」と思い、ちょっと寄り道してました。
実装はできたのですが、処理速度が難ありなので、また元の調査に戻っています。


上記リンクを参考に組んでみたソースについて ProcessMessageに飛んできているようなのでこれから引き続き試してみます。


ありがとうございました。
お世話になっております。


ProcessMessage() の、SoapMessageStage.AfterSerialize からなんとかSOAPヘッダを加工できつつあるのですが、また1つつまづいています。

Soap Extension のクラスに値を渡したいのですが(アクセスIDなど)、それは可能でしょうか?
可能だとしたら、Soap Extension Attribute を使用するのでしょうか。
今現在、あれこれ試行錯誤中です。


不勉強なことばかりで申し訳ありませんが、ご教授の程よろしくお願いいたします。
自己レスです。

> Soap Extension のクラスに値を渡したいのですが(アクセスIDなど)、それは可能でしょうか?


ひとまず、Soap Extension Attributeを元に、GetInitializer、Initialize を修正することで何とか取れるようになりました。


あとは、XMLでまだおかしいところがあってエラーを起こしているので調べています。
大変遅くなりましたが、何とか対応が完了しましたので報告いたします。


lpsw さんのアドバイス、「SoapExtension」や「ProcessMessage() で、SoapMessageStage.AfterSerialize」を元に、下記リンクのサンプルソースを元にあれこれ組換えながら何とか実装することができました。


> Product Advertising API Signed Requests Sample Code - C# SOAP
> http://developer.amazonwebservices.com/connect/entry.jspa?externalID=2481&categoryID=14

> SOAP拡張機能でSoapExceptionに例外情報を付加する
> http://codezine.jp/article/detail/834


アクセスキーなどを「SoapExtension」へ動的に渡したかったのですが、結局うまくいかなかったためちょっと無理やり的なやり方で「ProcessMessage」まで引き渡しました。
あとは、AmazonサンプルのXML操作処理部分を WSEを使用しない形で何とか組換えました。

速度的には、感覚値ながらWSE使用時よりはちょっと早いのかな…?


つくづくSOAP処理やXML処理周りの知識が不足していることを実感しました。
もっと勉強します。

lpsw さんをはじめ、どうもありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板