Azureにデプロイした単純なサービスがあります。次の方法でアクセスできます。
http://xxxxxxxxxxxxxxxxxxxxxxx.cloudapp.net/MyTestService.svc
WSDLへのURLは、パブリックDNSではなく内部マシン名を使用します。
svcutil.exe http://rd001520d328923a/MyTestService.svc?wsdl
明らかに、これではマシンの外部からWSDLにアクセスできません。
IISでこれを実行している場合、またはサービスのURLを知っている場合に変更できることがいくつかあります。たとえば、<serviceMetadata>
configでhttpGetUrl
プロパティを指定しますが、絶対URLを含める必要があるため、これは機能しません。相対URLを使用する場合でも、内部マシン名が使用されます。実際の問題は、WSDLにマシン名の付いたURL参照が含まれているため、役に立たないことです。
2つの標準以下の回避策があります。
WSDLを取得し、それを編集してURLを修正してから、アップロードして別のURLからアクセスできるようにすることが推奨されています。
2010年初頭の修正プログラムが利用可能であることがわかりましたが、もっと良い方法があるはずです。
これを解決して、マシン名の代わりにパブリックDNSを使用するにはどうすればよいですか?
OK。私はこれをほぼ1週間見てきました。簡単に入手できないので、ようやく答えを見つけました。これがインデックスに登録され、他の人のために時間を節約できることを願っています。
基本的に、この全体的な動作は、修正プログラムをリリースしたWCF 3.0/3.5の既知の問題です。詳細については、こちらをご覧ください。 FIX:WCF WSDLドキュメントのURIは、ロードバランサーではなく、アクセスできない内部インスタンスを参照しています...
私は調査中にこれに何度か遭遇しましたが、主にAzureに修正プログラムを展開する方法がわからなかったため、2回目の検討はしていませんでした。
さいわい、MSDNフォーラムのMicrosoftモデレーターは、これは.net 4.0で修正されていると指摘しました。これは、修正プログラムを適用する必要がないことを除いて、上記のKB記事で推奨されている「修正」が引き続き適用されることを意味していました。それで、解決策は何ですか?簡単に、以下を設定ファイルに追加します:
<serviceBehaviors>
<behavior name="<name>">
<!-- Other options would go here -->
<useRequestHeadersForMetadataAddress>
<defaultPorts> <!-- Use your own port numbers -->
<add scheme="http" port="81" />
<add scheme="https" port="444" />
</defaultPorts>
</useRequestHeadersForMetadataAddress>
</behavior>
</serviceBehaviors>
そして、それはそれでした。この問題が修正されたことが明確になっていれば、これははるかに単純な検索でした。多分私は十分によく見えなかった。
ブログの投稿 メタデータアドレスのリクエストヘッダーの使用 は
Victor 's answer ですが、デフォルトのポートはオプションであり、省略できることを説明しています:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<useRequestHeadersForMetadataAddress/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
また、コードで動作を有効にする方法も示します。
sh.Description.Behaviors.Add(new UseRequestHeadersForMetadataAddressBehavior());
公開するためにWSDLを生成していますか、それとも別のプロジェクトに参照を追加しようとしていますか?
後者の場合は、「サービス参照の追加」ではなく、WCF ChannelFactoryアプローチを使用することをお勧めします。私はそれがより一貫した制御可能な結果を私に与えると思います。
http://msdn.Microsoft.com/en-us/library/ms734681.aspx
追加する必要があります。Azureでこれを試したことはありません。