問題タブ [mtom]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arrays - WCF: サーバーが不正な要求で応答しています (400)
私のWCFクライアントは、カスタムオブジェクトの配列を渡そうとするサーバーを呼び出す場合を除いて、WCFサーバーで正常に動作します。配列が 100 アイテムの場合は問題なく動作しますが、アイテム数が 300 の場合、サーバーは例外 Bad Request (400) をスローします。したがって、解決策の鍵は構成ファイルにあると思います。
まず最初に、クライアントの app.config を示します。WCF クライアントは、Outlook アドインである DLL に常駐しています。この app.config を Outlook.exe.config から Outlook インストール ディレクトリにコピーします。これは、アドインが Outlook によって読み込まれるために必要なものです。
サーバー構成の関連部分は次のようになります。
app.config は、bin/Debug に ServerName.exe.config を生成します (以前は埋め込みリソースとして使用していましたが、どちらも役に立ちませんでした...
ご覧のとおり、バッファ、メッセージなどのすべての数を最大に増やし、時間の値が十分に高いことを確認しました...問題は、サーバーまたはクライアントのいずれかが何らかの形で認識していないことであると確信していますこれらの増加した値についてはわかりませんが、その理由はわかりません...
java - Axis2がMTOMアタッチメントを受信しましたデータハンドラーが見つかりませんエラー
プロジェクトでは、ApacheAxis21.6.2を使用してSOAPサービスを実装しています。MTOMを使用してファイルを受信する必要があるサービスがあります。しかし悲しいことに、MTOM添付ファイルの受信で問題が発生し続けています。私は例外を受け取り続けます:
...。
Webで回答を検索しようとしましたが、成功しませんでした。誰かが私を正しい方向に導いてくれることを願っています。私のWSDLには次のスニペットが含まれています。
SoapUIを使用してリクエストを生成し、プロパティ'useMTOM'をtrueに設定しました。
同じ問題に遭遇した、またはこれを解決する方法を知っている人はいますか?助けていただければ幸いです!
リチャード
アップデート
私はその問題に取り組んだと思います。問題は私のxsd/wsdl定義内にありました。jaxbを使用して、外部xsdで定義されたビジネスオブジェクトをJAXBアノテーション付きのPOJOに変換しました。しかし、xs:base64Binaryはbyte[]として変換されました。xsdを次のように変更します。
そして、要素を次のように変更します。
JAXBは、getPDF_AttatchmentContentのリターンタイプとしてDataHandlerを作成するようになりました。私が取り組まなければならない唯一の問題は、SOAPUIがMTOM添付ファイルを送信できるようにすることです。どういうわけか、私が作成したテストクライアントは完全に機能しますが、SOAPUIは添付ファイルを送信しません...
上記のソリューションのソース:http://cxf.apache.org/docs/mtom-attachments-with-jaxb.html
更新2: http : //ssagara.blogspot.nl/2012/03/test-axis2-jax-ws-mtom-service-using.htmlは、MTOMに関するSOAPUIの問題を解決しました。せっけんメッセージの正しいCIDを編集しませんでした。私はSOAPUIがそれを手伝ってくれると思いましたが、そうではありませんでした。
java - Spring WS + Wss4jSecurityInterceptor + MTOM メモリの問題
これは長年の疑問のようで、今のところ決定的な解決策はありません。着信 MTOM メッセージが SOAP メッセージにインライン化され、メモリ使用量が原因でアプリケーションがクラッシュする状況です。
受け取るファイルが大きいため、Apache Axiom (1.2.13) を使用して Spring WS (2.1) でファイル アップロード Web サービスを作成しています。
私は XML データのマーシャリングに JAXB (2.2.5) を使用していますが、これは添付ファイルをインライン化するため、添付ファイルを処理するエンドポイントにはSoapMessage
直接使用します。私が好むものではありませんが、許容できます。ここまではこの設定で問題なく、非常に大きなファイルをアップロードできます。問題は、Apache WSS4J 1.6.6 を使用している認証も必要であることです。
インターセプターがメッセージの検証を行うとき、添付データをメッセージの本文にインライン化し、大量のメモリを消費しOutOfMemoryError
、適切なサイズのメッセージを生成します。
これまでのところ、この望ましくないインライン展開を修正する方法は見つかりませんでした。ヘッダーを手動で読み取って処理したくありません。WSS4J が無意味になり、将来の要件を処理するためのコードの柔軟性が低下します。
このスレッドは、ヘッダーのみを含むメッセージのコピーを使用するようにインターセプターを騙すことを提案していますが、私はそれを実装できませんでした (これは数年前のもので、API が変更される可能性があります)。これはおそらく、暗号化され署名されたメッセージの使用を禁止するでしょう (返信が指摘しているように) が、これまでのところ、私にとっての要件ではありません。この別のスレッドは、何もしなかった Axiom 1.2.8 に固執しvalidateRequest
、Axiom ファクトリのフラグをfalse
(これはセキュリティを無効にするため、奇妙に聞こえます - エラーはありませんがセキュリティはありません。それのポイントは何でしょうか? )。
それで、誰でもこの問題の解決策を手伝ってくれますか? JAXB の修正、WSS4J インターセプターのトリック、またはその他の解決策はありますか? どんな助けでも大歓迎です!
ありがとう!
java - Spring WS with Axiom: JAXB は MTOM 添付ファイルをインライン化しています
添付ファイルを送受信するための Web サービスがあり、JAXB をマーシャラーとして使用したいのですが、JAXB はメッセージ本文で送受信される添付ファイルを base64 文字列としてインライン化するため、これまでのところ正しく機能していません。メモリ不足になり、OutOfMemoryError が頻繁に発生します。セットアップと修正の試みの概要を説明しています。誰かがそれを正しく行うのを手伝ってくれることを願っています.
私は大きな添付ファイルを処理する必要があるため、メッセージ ファクトリとしては SAAJ よりも Axiom を選択しています。アタッチメントが関係している場合を除き (インラインの問題)、エンドポイント メソッドのパラメーターと戻り値の型のマーシャラーとして JAXB を正常に使用できます。これは私のセットアップです:
Web サービス構成 XML:
私のXSDの一部:
私のエンドポイントクラス:
したがって、このコードは機能しますが、添付ファイルの場合とは異なります。私は仕事の解決策を探しています:
- Spring Forums: 正しい MTOM 処理? : いくつかの Axiom クラスを拡張することを提案していますが、コードは (2008 年) 以降かなり変更されており、動作させることができませんでした。
- Spring フォーラム: Response-Attachment/Saaj/Jaxb : 1.6u14 で修正された JVM バグが原因である可能性があります。これは、私の Weblogic バージョンで使用されているものです (さらに、トピック作成者には機能しませんでした)。
- Spring フォーラム: Spring-WS クライアントで大きな添付ファイルを送信する: 誰かが Axis2 を使用して Spring WS を直接バイパスして解決しましたが、これは重要ではありません。
- Stackoverflow: MTOM 添付ファイルを使用した Spring-WS Web サービス - Hello world テスト: 私と同じ問題、2 週間前、回答なし。
どうやら、 WSS4J で発生しているこのインライン化の問題について私が投稿したこの他の SO の質問から、最良の助けが得られたようです。Blaise Doughan は、彼がブログに投稿したように、(un)marseller を適切に処理するために必要であり、設定AttachmentMarshaller
する必要があると述べました。AttachmentUnmarshaller
したがって、添付マーシャラーがこの問題を解決するための鍵であると思います。
それらを (un) マーシャラーに設定するには、指定された (un) マーシャラーにアタッチメント マーシャラー (Doughan のコードをコピーしました) を設定Jaxb2Marshaller
するinitJaxbMarshaller
以外に方法はありませんでした。initJaxbUnmarshaller
Jaxb2Marshaller
しかし、手動で に設定しても、自分のものは使用されていませんsws:annotation-driven
。
このマーシャラー クラスは作成されますが、使用されることはありません。理由がわからないため、AttachmentMarshaller
s が問題を解決できるかどうかをまだテストできませんでした。
今のところ言えることはこれだけです。試すにはかなりの数のアプローチがあります。
MyJaxb2Marshaller
が無視されている理由を見つけます。おそらく最も簡単です。- s で解決できない場合は、JAXB 添付ファイルのインライン展開を別の方法で修正
AttachmentMarshaller
してください。それがどうなるかわかりません。 - JAXB を他のマーシャラーに置き換えます。これは同様に機能します (主に Axiom サポート、おそらく WSS4J)。
私はこの問題に長い間取り組んでおり、明らかな解決策を見逃しているに違いありません。どんな助けでも大歓迎です。
ありがとう!
ライブラリのバージョン:
- Spring 3.1.0 (コア、Bean、oxm など)
- Spring WS 2.1.0 (コアおよび Spring XML)
- StAX2 2.1
- WoodSToX 3.2.9 (wstx)
- JAXB 2.2.5-2 (API+実装)
- Apache 公理 1.2.13 (API+impl+c14n+dom)
- Apache Mime4j 0.7.2 (コア)
アプリ サーバーは、Java 1.6.0u14 を使用した Oracle 11g R1 Patchset 1 です。
c# - WCFサービスからのストリームを読み取らずに中止するにはどうすればよいですか?
これは私が先週調査してきた問題であり、解決策を見つけることができません。同じことを求めているが答えが得られない投稿が見つかりました。これが他の人にも役立つことを願っています。
内部にWCF
含まれるオブジェクトを返すサービスがあります。ストリーミング転送とMtomをstream
使用して、クライアントに送信します。basicHttpBinding
クライアントはWCF
サービスを呼び出し、応答オブジェクトを受信した直後にプロキシを閉じます。
次に、クライアントはWCFサービスから取得したストリームを読み取り、ローカルディスク上のファイルに書き込みます。これはすべて正常に機能します。
私の問題は、クライアントが操作を中止してWCFサービスからのデータのダウンロードを停止したい場合です。.close()
ストリームを呼び出すと、たとえば次のようになります。serverReply.DataStream.Close();
次に、WCFサービスからストリーム全体をブロックして読み取り、続行する前に終了します。ストリームは非常に大きくなる可能性があり、ネットワークは常に高速であるとは限りません。
これは、ネットワークリソースの使用量の両方にとって非常に望ましくありません。ネットワークリソースの使用量は、基本的に、使用されなくなったデータで無駄になります。またbasicHttpBinding
、WCFサービスサーバーへの同時TCP接続は(デフォルトで)2つしか許可されないため、ストリームが最後まで読み取られるまで、他の接続の試行をブロックします。
同時接続の数を増やすことはできますが、それは問題の可能性を生み出すため、悪い解決策になります。
たとえば、20回のダウンロードが中止されましたが、データをダウンロードして破棄しています。転送を完全に停止する必要があります。
クライアントでは、ストリームオブジェクトは単なる通常Stream
のクラスであるため、closeメソッドのみがあり、他には何もありません。
プロキシオブジェクトを呼び出し.close()
たり、プロキシオブジェクトを使用したりしても、または他のメソッド.abort()
を使用してオブジェクトを破棄することはできません。.dispose()
サーバー側では、OperationContext.OperationCompleted
イベントを処理しますが、からのデータstream
が最後まで読み取られるまで発生しません。
だから問題は、ストリームを完全に読まずにストリームを閉じる/中止するにはどうすればよいですか?
linux - Linux CURL を使用した SOAP MTOM 添付ファイル
これまでのところ、単純な base64 エンコーディングを使用して SOAP で添付ファイルを送信し、それらをインラインで配置してきました - すべて CURL によって行われました。ここで、添付ファイルを MTOM 添付ファイルとして送信する必要がある新しい要求があります。質問は、Linux カールで可能ですか? おそらく、multipart/related
または類似のコンテンツタイプが必要になるでしょう。
JAX-WS を使用すると可能であることがわかりますが、これを行うには新しいクライアントを開発する必要があり、実際には最適なオプションではありません。
可能かどうか教えてください。可能であれば、その方法を教えてください。
java - SOAPHandlersを使用してMTOMSOAPメッセージに署名するにはどうすればよいですか?
現在、2つのハンドラーがあります。1つはロギング用で、もう1つはSOAPメッセージに署名するためのものです(これは本質的にSOAPメッセージを改ざんします)。ハンドラチェーンがない場合、MTOMは期待どおりに機能し、base64バイナリコンテンツをインライン化するのではなく、バイナリコンテンツへの参照を挿入します。
ハンドラーを導入するとすぐに、MTOMコンテンツがインラインに含まれるようになりました。
ハンドラーを使用してSOAPメッセージに署名することは可能ですか、それともこれを行うためのより適切な手段がありますか?
アップデート1 完全なソースを投稿できません。ただし、基本的には、カスタムSOAPHandlerの実装です。タイムスタンプ(ヘッダー内)、カスタムヘッダー、およびSOAP本体に対していくつかの基本的なXMLDsigタイプの操作を実行します。結果のダイジェスト値は、ヘッダーの署名要素に挿入されます。
ロガーに関しては、これも単純なSOAPHandlerです。それまたは署名ハンドラーのいずれかが排他的に使用される場合、結果は同じであり、バイト内容がインライン化されたMTOMメッセージです。私が行った唯一の進歩は、ロギングにMessageHandlerを使用することでした。これにより、(バイトコンテンツがインライン化されていても)SOAPエンベロープを出力し、MTOM分離を維持することができました。したがって、実際には解決策ではありませんが、SOAPメッセージの変更を下位レベルで行う必要があることを示しています。これは私をチューブの道へと導いてくれます。
アップデート2
以下は、MessageHandler
アプローチの例です。生のHTTPダンプには複数の部分からなるメッセージが含まれているのに対し、実際の出力はbase64にインライン化されていることがわかります。この実装と実装の唯一の違いSOAPHandler
は、実際のHTTPリクエストが単一部分のインラインMTOMメッセージに変更されることです。
java - MTOM/SSL: Java 経由で MTOM および SSL を使用して Web サービスにアクセスするとハングが発生する
JAXB とクライアント プロキシを使用して Web サービスを正常に呼び出し、MTOM を使用してバイナリ データを送信する Web サービス クライアントを Java で作成しました。
サービスには SSL が必要になりました。SSL 接続を提供するようにクライアント コードを更新した後、バイナリ アタッチメントを必要としない呼び出しを正常に行うことができますが、バイナリ アタッチメントを必要とする呼び出しはハングします。サービスからの応答はありません。最終的にクライアントがタイムアウトします。
どうすればこれを機能させることができますか? SSL を使用するときに MTOM を有効にするには、何か特別なことをする必要がありますか? このサイトとウェブを検索しましたが、これに関する他のレポートはありません。
サーバー側でネットワーク パケットを監視していた人から少し情報を得ました。私は完全に理解していないので言い換えます.TLSが開始され、データが転送されると彼は言いますが、TLS暗号化ハンドシェイクに再び入り、失速します。彼は、MTOM 用に生成された別個の TLS セッションがあるかどうか疑問に思っています。私のアプリケーションは、すでに TLS セッションが確立されていると考えており、必要な証明書の初期交換を行っていません。それはすべて低レベルのライブラリ コードにあり、ソースがないため、それをチェックする方法がわかりません。
私はWebサービスとSSLに非常に慣れていません。
Web サービスを作成するコードは次のとおりです。
要求を行うには、返されたサービス オブジェクトでメソッドを呼び出します。
SSLHelper は、証明書のセットアップを処理する独自のクラスです。その部分は問題ではないと思うので、そのセットアップ コードはここには含めません。(同じ SSL 構成で他のリクエストを行うことができるので、これは問題ではないと想定しています。)
MTOM 呼び出しの場合、メソッドは次のように指定されたフィールド (適切なセッターを含む) を持つ要求クラスのインスタンスである引数を取ります。
このクラスを初期化するには、次のようにします。
DataHandler と FileDataSource は javax.activation パッケージにあります。
最後に一つだけ。サービスの所有者は、MTOM を使用してこの要求を正常に呼び出すことができますが、以下を使用して SSL を有効にしています。
同じJVM内で、複数のキーストアを使用してさまざまなWebサービスに接続しているため、それはできません。
wcf - WCF カスタム MessageEncoder を使用したマルチパート メッセージの解析
MIME マルチパート結果をバイナリ データ (実際には PDF ファイル) で返す SOAP サービスに WCF クライアントを作成しています。カスタム メッセージ エンコーダーを使用します。
リクエストをシングルパート形式にしてもサービスは問題ないようで、結果を返すことができます。私が見ることができる結果には2つの問題があります。
- マルチパート メッセージの最初の部分のみを返すようです。
- 返されたデータをカスタム エンコーダーでデコードできません。
MTOM バインディングを利用しようとしましたが、それは要求を台無しにします。content-type に「boundary」パラメータを追加できないため、サーバーはリクエストを理解できません。
私が欲しいのは基本的なテキストの SOAP 要求だと思いますが、応答は MTOM スタイルでデコードされます。ただし、それを設定する方法がわかりません。
私が見つけた最も近い解決策はこれです: http://blogs.msdn.com/b/carlosfigueira/archive/2011/02/16/using-mtom-in-a-wcf-custom-encoder.aspx
しかし、それは私のプロジェクトにとって非常に侵略的な変更のようです。
java - SOAPHandler の使用時に MTOM が機能しない
Mtom を使用してファイルを転送しようとしましたが、SoapHandler を使用してクライアントの署名を検証するまで、かなりうまく機能しています。SoapHandler はすべてのメッセージを保持し、base64 エンコードに変更します。そのため、巨大なファイルを取得しようとすると、Jvm がヒープ サイズの例外をスローします。この問題を解決する方法を知っていますか?