2010-12-30 16 views
1

複数のデータコントラクトを使用するWCFで公開されているサービス契約がいくつかあります。サービスはAdobe Flexで使用されます。私は、Flexがサーバーで生成されたWSDLを消費するという多くの問題に遭遇しました。私はhereの手順を使用して、WSDLを1つのファイルに圧縮しました(問題があれば、WcfExtrasではなくFlatWsdlを使用していました)。WCF:すべてのデータ変換で同じ名前空間を使用する必要がありますか?

VS2010の独自のwsdl.exeツールを使用してメタデータを抽出すると、エラーが発生します。具体的には、私は次のエラーを取得しています:

1) Schema validation warning: Schema item 'complexType' named 
    'ArrayOfKeyValueOfSomeKeySomeValuep1alXzIb' from namespace 
    'http://schemas.microsoft.com/2003/10/Serialization/Arrays' is invalid. 
    Namespace 'http://My/Wcf/Namespace' is not available to be referenced 
    in this schema. 

2) Schema validation warning: Schema item 'complexType' named 'MyComplexType' 
    from namespace 'http://My/Wcf/Namespace' is invalid. Namespace 
    'http://schemas.datacontract.org/2004/07/My.Real.Namespace' is not available 
    to be referenced in this schema. 

を今、私のWSDLによってインポートされていない辞書(「ArrayOfKeyValueOf ...」)型が明らかに外部スキーマで定義されているが、。 SomeKeyとSomeValueにはMy/Wcf/Namespaceのdatacontract名前空間があります。

MyComplexTypeに関しては、私がDatacontract-namespaceを自分のサービス、サーバー、およびバインディングで使用されているのと同じ名前空間に変更すると、error(2)がなくなります。なぜ私は理解できません。

私は何を求めていることは二つの質問に沸く:

1)どのように私は私のWSDLに外部スキーマのインポートディレクティブを追加することができますか?私はコンテナの周りにラッパークラスを書くことを提案するいくつかのソリューションをオンラインで見た。これは私が本当に避けたいものです。

2)本当にすべてのデータ集計を単一の名前空間に入れる必要がありますか?私はそれに技術的な異論はありませんが、すべてのdatacontractsの名前空間を変更するのは非常に面倒です。おそらくこれを達成するための自動化された方法がありますか?

TIA!

+0

これはあなたの質問には答えませんが、これらのサービスがAdobe Flexでのみ使用できるように設計されている場合は、Webサービスから切り替えて、WebORBまたはFlourineFXを使用してAMFプロトコルに移行することを強くお勧めします。それ以外に、ServiceCaptureのようなツールを使用して、どのデータが前後に送信されているか把握していますか?サービスを利用するためのFlexコードは何ですか? – JeffryHouser

+0

私はこれが一つの方法だと考えていますが、かなり再設計されています。ご覧のように、サービスはもともとはC#で消費されることを意図していましたが、最近ではFlexへ移行しました。また、サードパーティの開発者が他の開発者とやりとりできるよう、標準的な方法でサービスを公開したいと考えています。 – telewin

+0

私はキャプチャツールを使用していません。あなたはそこに何が見えますか?私はWSDLの外観を知っていて、wsdl.exeは壊れていると主張しています。あなたは、ワイヤを盗聴することでさらなる洞察が得られると思いますか? Flexでサービスをどのように消費するかについては、Flexの「Webサービスのイントロスペクション」機能を使用したかったのです。言い換えれば、私たちは単純なWebサービスとしてサービスを利用したいと考えています。 – telewin

答えて

0

だから、誰がFlexクライアントからWCF(BasicHttpBinding)サーバにアクセスすると、同じ問題に遭遇し念のために:

1)いいえ、すべてDataContractsが同じ名前空間(ただし、すべてのServiceContractsである必要はありません、サービス実装、およびバインディングdoは同じ名前空間になければなりません!)。

2)問題の重大さは、各xsd:schemaが参照するすべての名前空間に対して "xsd:import namespace"を持つことをFlexが期待していることです。それは自動的にFlexがフェッチしようとします。このタグに自動生成schemaLocation属性を追加するので、

<xsd:import namespace="http://schemas.datacontract.org/2004/07/SomeNamespace" /> 

は、WCFでこれを行う方法があるように思えません:このインポートの形式でなければなりませんこのschemaLocation。唯一の回避策は、XMLレベルでWSDLを手動で操作することです(たとえば、メタデータを取得するためのRESTエンドポイントを公開するなど)。

MSDN WCFフォーラムのYaron Navehに感謝します。ディスカッションはhttp://social.msdn.microsoft.com/Forums/en/wcf/thread/b9429e30-e4d5-454f-9fbd-bae39990ff33にあります。

+0

FlexからWCF SOAPサービスを使用しようとすると、同様の問題が発生しました。あなたの答えを少しはっきりさせることができますか?これらのインポートで単に 'schemaLocation'属性が存在するだけでFlexが壊れてしまうのですか?それがないと参照されたスキーマをどのように見つけることができますか? –

+0

@マッティ:確かに、WCFによって追加されたschemaLocationはFlexを破ります。問題は、すべてが外部のスキーマを参照する必要がないように、すべてがすでにWSDL内に埋め込まれていることです(「フラットWSDL」を使用する必要があります)。最終的に私たちのためにWSDLを修正する小さなプログラムを書きました(インポートを変更します)。 – telewin

+0

@Matti:上記の「インポートの変更」を明確にするために、私たちは ''ノード内の各スキーマに対して、他のすべてのスキーマと 'http://schemas.microsoft.com 'のインポートを追加します/ http:// schemas.microsoft.com/2003/10 /シリアライゼーション/配列]、および[http:// schemas.datacontract.org/2004/07/System]を使用します。各システムスキーマ(すなわち、「http:// schemas.datacontract.org/2004/07/System'を含むスキーマ)に対して、「http:// schemas.microsoft.com/2003/10/Serialization」のインポートを追加します。 – telewin

関連する問題