C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: SOAP通信でWebメソッド名をタグに出力しない方法について


(過去ログ 130 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■77021 / inTopicNo.1)  SOAP通信でWebメソッド名をタグに出力しない方法について
  
□投稿者/ Amy (1回)-(2015/09/04(Fri) 16:04:10)

分類:[ASP.NET (C#)] 

Javaをクライアント、.NET(C#)をサーバとしてSOAP通信しようとしています。

通信エラーになるのでWireSharkでSOAP電文をキャプチャしたところ、Internal Server Error
が発生していました。
そこで.NETでSOAPクライアントを作成して要求電文を飛ばしたところ、要求電文に.NET Wcfの
メソッド名がタグに追加されていました。このタグはWSDL定義上には存在しません。

(電文例)
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://hoge.jp/">
    <s:Body>
        <hoge_method_call xmlns="http://hoge.jp/">
            <data>hello</data>
        </hoge_method_call>
    </s:Body>
</s_Envelope>

上記例中、hoge_method_callが.NET Wcfのメソッド名で作成されるタグです。

どうやら.NET SOAPサービスは、このメソッド名のタグ付の要求を期待していると思われます。

しかし本来、このタグは不要で、下例の要求電文を飛ばさなければなりません。

(必要とする要求電文例)
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://hoge.jp/">
    <s:Body>
        <data>hello</data>
    </s:Body>
</s_Envelope>

そこで質問なのですが、.NET SOAP通信において、メソッド名をタグに含めなくする方法
はあるでしょうか?

なお、Javaクライアント及びWSDL定義は相手側のため、こちら側では変更できないので、
.NET SOAPサーバ側のプログラムで対応せざるを得ない状況です。

環境はVisualStudio2010、.NET Framwork4、Windows7です。

御存じの方がいらっしゃいましたら、ご教示頂けると助かります。

引用返信 編集キー/
■77040 / inTopicNo.2)  Re[1]: SOAP通信でWebメソッド名をタグに出力しない方法について
□投稿者/ WebSurfer (647回)-(2015/09/07(Mon) 11:55:02)
No77021 (Amy さん) に返信

> そこで.NETでSOAPクライアントを作成して要求電文を飛ばしたところ、要求電文に.NET Wcfの
> メソッド名がタグに追加されていました。
> ・・・中略・・・
> しかし本来、このタグは不要で、下例の要求電文を飛ばさなければなりません。

上で「このタグは不要」と言われる理由が分かりませんが、そのタグがない
と WCF のどのメソッドが呼び出されたか WCF 側で分からないので、逆に
エラーになるのではないですか? (未検証ですが)

だから「.NETでSOAPクライアントを作成して」試験した時は期待通り応答が帰
ってきているのではないですか?

そうであれば、「Internal Server Error」の原因は Java で作ったクライアン
トアプリにあると思うのですが。


質問者さんがどのような WCF アプリを作ったか詳細不明なので話が通じてない
かもしれません。できれば共通の WCF アプリをベースに話をした方がよさそう
です。例えば下記。

10 行でズバリ!! [C#] WCF サービスの作成と利用
http://code.msdn.microsoft.com/windowsdesktop/10-C-WCF-a3831723

WCF 側を上記の通りに作って、クライアント側を「3. Windows クライアントで 
WCF サービスを利用する」に従って作ってみてください。

label1.Content = client.GetData(12345); というコードでは以下の要求が出て:

POST http://aspnet4site/Service.svc HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/IService/GetData"
Host: aspnet4site
Content-Length: 161
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <GetData xmlns="http://tempuri.org/">
      <value>12345</value>
    </GetData>
  </s:Body>
</s:Envelope>

応答は以下の通りになります。もちろん結果は期待通りになります。

HTTP/1.1 200 OK
Content-Length: 206
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/7.0
X-Powered-By: ASP.NET
Date: Mon, 07 Sep 2015 02:16:07 GMT

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <GetDataResponse xmlns="http://tempuri.org/">
      <GetDataResult>You entered: 12345</GetDataResult>
    </GetDataResponse>
  </s:Body>
</s:Envelope>


#パケットキャプチャツールは WireShark より Fiddler2 の方がお勧めです。上の
 結果は Fiddler2 によるものです。

引用返信 編集キー/
■77048 / inTopicNo.3)  Re[2]: SOAP通信でWebメソッド名をタグに出力しない方法について
□投稿者/ Amy (2回)-(2015/09/07(Mon) 15:32:05)
No77040 (WebSurfer さん) に返信
> ■No77021 (Amy さん) に返信
>
>>そこで.NETでSOAPクライアントを作成して要求電文を飛ばしたところ、要求電文に.NET Wcfの
>>メソッド名がタグに追加されていました。
>>・・・中略・・・
>>しかし本来、このタグは不要で、下例の要求電文を飛ばさなければなりません。
>
> 上で「このタグは不要」と言われる理由が分かりませんが、そのタグがない
> と WCF のどのメソッドが呼び出されたか WCF 側で分からないので、逆に
> エラーになるのではないですか? (未検証ですが)
>
> だから「.NETでSOAPクライアントを作成して」試験した時は期待通り応答が帰
> ってきているのではないですか?

返信、ありがとうございます。

メソッド名のタグがなければWCFのどのメソッドが呼び出されたかWCF側でわからないはずなのは、まったく
同意です。なので、かなり不思議に思い、また、相手側の(Java側の)仕様不備も疑いました。

結果、WCFを使わず、ASP.NET Webサービスとして実装したら、解決しました。
(使用するFrameworkのバージョンを3.5に下げて、Webサービステンプレートを使って実装)

電文をキャプチャすると、Webサービスの場合、メソッド名のタグが無く要求電文が作成され、応答も
正常に動作しました。

先の疑問である「メソッド名の解決はどうやってるの??」は解決しないままなので、モヤモヤしている状態
ですが、まずは実装できたので、本質問は終了とさせていただきます。

追伸:Fiddler2は使ったことがなかったです。便利とのお話なので、一度試してみます。
   アドバイス、ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -