0

WSE3 Web サービスを WCF に移行しています。ただし、クライアントは WSE3 クライアントです。

すべてのオペレーション コントラクトは、MessageContractクラスのインスタンスを返します。これは 2 つの操作で機能しますが、同じサービス コントラクトの 1 つの操作では何らかの理由で失敗します。エラーは次のとおりです。

The signature or decryption was invalid.

WCF トレース ファイルを調べると、次のことがわかりました。

The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation 'MyOperationName'. End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected. Found element 'MyOperationName' from namespace 'urn:MyProject:MyModule:2006:04:MyAuthorizationModule'.

私の観察では、XmlRoot(属性を使用する代わりにMessageContract) 属性を使用して応答クラスを装飾すると、この例外は発生しません。ただし、応答オブジェクトはデシリアライズできません。つまり、入力トレースで XML 応答を確認できますが、期待される XML 構造が一致しないため、nullクライアント側でサービス コールが返されます。

このクラスには、属性で装飾された別のクラスのインスタンスを返すMessageContractパブリック プロパティ ( ) が 1 つだけあります。このクラス ( で装飾されている) には、プロパティを持つエンティティ クラスのオブジェクトのを与えるプロパティがあります。MessageBodyMemberXmlRootxmlRootCollectionXmlElement

チェック/検証する必要があるのはどれですか? 必要に応じて、クラスのコード スニペットを提供できます。

4

1 に答える 1

0

応答で使用した MessageContract には問題はありませんでした。問題は、OperationContract への入力パラメーターにありました。

古い W​​SE3 Web サービス プロキシ メソッド ( WebMethod)を調べOperationContractて、WCF サービスでそのためのOparationContractを作成したところ、作成した はパラメーターを受け入れませんでした。

この問題を調査する際に、 を使用しsvcutil.exeて、古い WSE3 サービスの WSDL から .NET クラスを作成しました。具体的に調べたところ、へのリクエスト パラメータとして使用されるOperationContractを作成する必要があることがわかりました。だから私はなしで作成しました。使ってみたら問題が解決しました。MessageContractOperationContractMessageContractMessageBodyMember

明らかに、OperationContract署名を ASMXWebMethod署名と比較すると、入力パラメーターを導入したため一致しません。しかし、これは機能します。方法と理由はわかりません。誰かがなぜそれが機能するのかを説明してくれれば素晴らしいでしょう。

于 2011-06-15T08:15:22.073 に答える