web-dev-qa-db-ja.com

WSDL URLを内部マシン名からパブリックに変更するにはどうすればよいですか?

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を使用するにはどうすればよいですか?

42
Victor

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>

そして、それはそれでした。この問題が修正されたことが明確になっていれば、これははるかに単純な検索でした。多分私は十分によく見えなかった。

67
Victor

ブログの投稿 メタデータアドレスのリクエストヘッダーの使用
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でこれを試したことはありません。

0
Doobi