web-dev-qa-db-ja.com

WCF:WSDL:importなしで単一のWSDLドキュメントを生成する方法

問題に困っています... WCFサービスから単一のwsdlドキュメントを生成する方法を見つけようとしています。つまり、外部ドキュメントへのリンクがありません。 FlatWsdl を使用してすべてのxsd:importリンクを削除しましたが、生成されたwsdlにはwsdl:import宣言を介した外部wsdlドキュメントへのリンクが含まれています。

<wsdl:import namespace="http://myurl/mynamespace"  
             location="http://myserver/myservice.svc?wsdl=wsdl0"/>  

このドキュメントには実際にはすべてのインライン化されたxsdスキーマが含まれているので、単一のwsdlを持つために、この外部wsdlドキュメントもインライン化する方法はありますか?

どんな助けにも感謝します。

21
D_Guidi

(編集:FlatWSDLに関する以前の回答は削除されました。あなたが指摘したように、wsdl:importではなくxsd:importを削除することでした。)

このブログ記事を見てください: WCFで生成されたWSDLを制御

"... 1つのターゲット名前空間URIに対して常に1つのWSDLが生成されます..."

ServiceContract、DataContract、ServiceBehaviorなどの名前空間は異なりますか?

13
Vizu

これを.net 4.5(ベータ)でネイティブに実行できるようになりました。単一のwsdlドキュメントですべてを出力するようにサービスに指示するためのオプション(?wsdlではなく?singleWsdl)があります。新しいものの詳細はこちら: http://msdn.Microsoft.com/en-us/library/dd456789(v = vs.110).aspx

19
Irwin

単一のWSDLファイルを作成する拡張機能があるWCFExtrasプロジェクトを使用することもできます。

WCFExtras

Soapヘッダーサポート、WSDLドキュメントなどを含む、便利なWCF拡張機能のコレクション。

WCFプラットフォームは非常に拡張性が高く、コア製品の一部ではない機能を簡単に追加できます。このプロジェクトには、WCFベースのプロジェクトで必要な拡張機能がいくつか含まれています。

  • WCFのSOAPヘッダーサポート
  • ソースコードXMLコメントからのドキュメント
  • オーバーライドSOAPアドレスロケーションURL
  • 古いSOAPツールとの互換性を高めるための単一のWSDLファイル。

http://wcfextras.codeplex.com/

4
Jochen

私の問題はエンドポイント定義にありました。これはtempuri.org名前空間にあり、bindingNamespaceをエンドポイント宣言に追加すると問題が解決します。助けてくれてありがとう:)

2
D_Guidi

これは遅い答えですが、いくつかのWCFサービスで同じ問題が発生しました。以前の回答のように.NET 4.5を使用している場合は?singleWSDLを使用しますが、.NET 4.5をターゲットにしていない場合は、web.configに以下を追加して問題を修正します...

<useRequestHeadersForMetadataAddress>
  <defaultPorts>
    <add port="80" scheme="http" />
    <add port="443" scheme="https" />
  </defaultPorts>
</useRequestHeadersForMetadataAddress>

これはあなたの行動に入ります。そうすれば、すべての参照がMyServerではなくMyURLを参照するため、WSDLをフラット化する必要がなくなりました。

これが同様の問題を持つ他の人を助けることを願っています。

1
Jim

いくつかの追加の動作などを追加する必要があります。

こちらの記事をご覧ください。

http://my-tech-talk.blogspot.com/2008/07/adding-flatwsdl-to-wcf-webservice.html

http://blogs.thinktecture.com/cweyer/archive/2007/05/10/414840.aspx

これを実現する方法はいくつかあります。

マーク

1
marc_s

上記のジムの回答に加えて、C#コードを使用してWCF ServiceHostを直接構成する場合:

using System.ServiceModel.Configuration;

serviceHostを設定する場合:

UseRequestHeadersForMetadataAddressBehavior urh = new UseRequestHeadersForMetadataAddressBehavior();
serviceHost.Description.Behaviors.Add(urh);

この情報をオンラインで簡単に見つけるのに苦労しました。うまくいけば、同様の状況で誰かを助けます。

0
James Heliker