9

ServerA でホストされている WCF サービスがあります。これは、インターネットに直接アクセスできないサーバーであり、インターネットでルーティングできない IP アドレスを持っています。

このサービスは、SSL 暗号化と復号化を処理し、暗号化されていない要求を特定のポートで ServerA に転送する BIGIP によって処理されます (現時点では実際には負荷分散は行われませんが、将来的には追加される可能性があります)。

つまり、クライアントはhttps://www.OurDomain.com/ServiceUrlを介してサービスを呼び出し、BIGIP デバイスを介してhttp://SeverA:85/ServiceUrlのサービスにアクセスします。

https://www.OurDomain.com/ServiceUrlで公開されている WSDL を参照すると、WSDLに含まれるすべてのアドレスはhttp://SeverA:85/ServiceUrlベース アドレスに基づいています。

ホスト ヘッダー設定を使用してドメインを設定できることがわかりましたが、問題は、これでドメインが整理される一方で、まだ間違ったスキームを使用していることです。つまり、http://www.OurDomain.comを使用することになります。 /ServiceUrlを https にする必要があります。

また、そのサーバーでホストされている他のサービス (asmx ベース) があるため、ホスト ヘッダーの設定に問題がありました。そのため、サーバー上に別のサイトを作成し (ポート 82 などを使用)、その上のホストヘッダー。ここで、http/https の問題に加えて、WSDL にはすべての URL にポート番号が含まれており、BigIP はポート 443 (SSL 用) で動作するため、問題があります。

ホストヘッダーを実装するよりも柔軟なソリューションはありますか? 理想的には、柔軟性とサポートのしやすさを維持する必要があります。

助けてくれてありがとう…</p>

4

5 に答える 5

6

これは本質的に、完全な答えを提供するためにいくつかの個別のソリューションを含む複数の部分からなる問題です。基本的に、F5 の後ろに座ることには 3 つの問題があります。

  1. アドバタイズされたサービス エンドポイントのホスト名。
  2. データ コントラクトを記述する xsd:import されたスキーマへのリンクのホスト名
  3. あなたが説明するhttp/httpsの問題。

解決策 1 と 2 を見つけたので、ホスト ヘッダーを変更します (ホスト ヘッダー以外の方法でこれにアプローチできますが、ここでそれを説明する必要はありません)。番号 3 はもう少しトリッキーで、より多くのコードが必要です (ここに書き出すには多すぎます)。

簡単に言えば、IContractBehavior と IWsdlExportExtension の両方を実装する ContractBehavior を作成する必要があるということです。

実装する必要がある重要な部分は、IWsdlExportExtension.ExportEndpoint です。このメソッド内で、すべての WsdlPort 拡張機能を反復処理する必要があります。SoapAddressBinding 型の拡張機能が見つかったら、SoapAddressBinding.Location プロパティを、https プロトコル指定子を含む新しい Uri に置き換える必要があります。xsd インポート アドレスとスキーマ リンクについても、同様の作業を行う必要があります。

サービスが WS-Addressing も使用している場合は、wsdl に書き出す追加のアドレスを処理するために同様のことを行う必要があります。

CodePlex ( http://wcfextras.codeplex.com/ )で入手できる WsdlExtras プロジェクトに基づいて、最終的に作成したコードを作成しました。WsdlExtras で使用されるメソッドは、追加する必要がある可能性のある余分なビットの優れたベースを提供します (メモリから、WS-Addressing ビットを扱っていないと思います)。確認したい部分は、「SOAP アドレス ロケーション URL のオーバーライド」です。

于 2009-04-17T13:49:49.390 に答える
1

Mark Allanson のおかげで、私は yossi dahan が経験したのとまったく同じシナリオを経験しました。

ステップ1。WCFExtras.dll (http://www.codeplex.com/WCFExtras/)をダウンロードします。
ステップ2。プロジェクトへの参照を追加します。
step3. サンプル サーバー アプリで提案されているように、コードの作成に時間を無駄にしないでください。
step4. web.config を開き、以下のコードを入力します。

  <system.net>
     <settings>
        <httpWebRequest useUnsafeHeaderParsing="true" />
     </settings>
  </system.net>


<system.serviceModel>
<services>
  <service behaviorConfiguration="ServiceBehaviorName" name="ServiceName">
    <endpoint address="" behaviorConfiguration="ServiceEndpointBehaviorName" binding="basicHttpBinding" contract="IServiceName">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="ServiceEndpointBehaviorName">
      <wsdlExtensions location="https://sslLoadBalancer/ServiceName.svc"/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehaviorName">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<extensions>
  <behaviorExtensions>
    <!-- Declare that we have an extension called WSDL Extras-->
    <add name="wsdlExtensions" type="WCFExtras.Wsdl.WsdlExtensionsConfig, WCFExtras, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </behaviorExtensions>
</extensions>
        </system.serviceModel>


step5. また、この URL で参照を追加すると機能しないことに注意することも重要です"https://sslLoadBalancer/ServiceName.svc"。常に次のように参照を追加することを忘れないでください。"https://sslLoadBalancer/ServiceName.svc?wsdl"このようにして、アプリケーションへの参照を追加できます。

それだけです...それでも機能しない場合はお知らせください。完全なweb.configファイルを貼り付けます..

ありがとう

于 2013-11-21T10:21:40.417 に答える
0

エンドポイントのアドレス属性をWSDLに表示するURLに設定してから、実際のUriをリッスンするエンドポイントにlistenUri属性を追加すると、うまくいくという素晴らしいヒントが得られました。

テストページのURLは影響を受けません(つまり、ListenUriで指定されたアドレスが引き続き表示されます)が、WSDL内で正しいURL(アドレスで指定されたもの)が設定されます。

ただし、最も厄介なのは、質問を投稿した直後にこれを試したところ、コンソールアプリでセルフホスティングしている場合にのみ、IIS内で機能させることができなかったということです。今日自分自身をチェックすると、それが実際に機能することがわかりました。だから今、なぜそれが以前はうまくいかなかったのかわかりません。

その間に行ったことは、WSDLに必要なアドレスを構成から配置するサービス記述を変更する単純なカスタム動作を構築することです。明らかに、それに対するサポートが組み込まれている場合は、はるかに優れているので、来週、これについてさらに調査する時間をとることを願っています。

于 2009-03-30T13:16:52.913 に答える
0

既存のサービスの上に SSL を追加する場合は、WCF クライアントのバインドのセキュリティ モードにも影響する可能性がありますが、これは簡単にオーバーライドできます。

WSDL の場合は、ファイルをダウンロードして、URL を好きなように変更し、手動でファイルとして公開してみませんか?

于 2009-03-28T05:57:42.033 に答える