6

http エンドポイント経由でアクセスできる WCF Web サービスがあります。これで、このサービスは https を介してロード バランサーで公開されます。クライアントは svcutil.exe を介して .Net で作成されますが、Java クライアントには WSDL も必要です。

私が理解していることは次のとおりです。

  • 内部的には、Web サービスは http サービスであり、何も変更する必要はありません。アドレスは、WSDL ..?wsdl を含む http://myserver.com/example.svc です
  • 外部的には、サービスはアドレスhttps://loadbalancer.com/example.svc および WSDL ..?wsdlを持つhttpsサービスとして表示される必要があります。

他の投稿から、ロード バランサーの問題は次の動作構成で解決できることがわかりました。

    <behavior>
      <!-- To avoid disclosing metadata information, set the value below to false before deployment -->
      <serviceMetadata httpGetEnabled="true"/>
      <useRequestHeadersForMetadataAddress>
        <defaultPorts>
          <!-- Use your own port numbers -->
          <add scheme="http" port="81" />
          <add scheme="https" port="444" />
        </defaultPorts>
      </useRequestHeadersForMetadataAddress>
    </behavior>

この回避策を使用すると、両方の URL がサービスのヘルプ ページに解決されますが、 https ://loadbalancer.com/example.svc を呼び出すと、ページからhttp://loadbalancer.com/example.svc?wsdl に移動します。http を https に置き換えると、wsdl をロードできますが、内部リンクはすべてhttpsではなくhttpです。

httpsGetEnabled="true" に切り替えようとすると、多くの https 関連の問題が発生します。サーバー自体が http しか認識していないため、これが役立つかどうかはわかりません。

したがって、私の問題は、負荷分散された URL の https です。WSDL メタデータに http ではなく https を表示するように WCF に指示できますか? また、どのようにすればよいですか?

4

2 に答える 2

1

私は以前にこの問題を抱えていましたが、修正は SoapExtensionReflector メソッド名: ReflectDescription をほとんどオーバーライドしていました。

using System.Web.Services.Description;
namespace LoadBalancer
{
    public class HttpsSoapExtensionReflector : SoapExtensionReflector
    {
        public override void ReflectMethod()
        {
            //no-op
        }

    public override void ReflectDescription()
    {
        ServiceDescription description = ReflectionContext.ServiceDescription; 
        foreach (Service service in description.Services)
        {
            foreach (Port port in service.Ports)
            {
                foreach (ServiceDescriptionFormatExtension extension in port.Extensions)
                {
                    SoapAddressBinding binding = extension as SoapAddressBinding;
                    if (null != binding)
                    {
                        binding.Location = binding.Location.Replace("http://", "https://");//Updating the soap address binding location to use https
                    }
                }
            }
        }            

    }
    }
}

上記のクラスを新規または既存の dll プロジェクト (私の例では dll 名は LoadBalancer) に作成したら、次のようにサーバーの Web 構成から新しい拡張機能を呼び出すだけです。

<webServices>
  <soapExtensionReflectorTypes>
    <add type="LoadBalancer.HttpsSoapExtensionReflector, LoadBalancer"/>
  </soapExtensionReflectorTypes>
</webServices>

LoadBalancer の下にある場合は、先に進んでバインディングの場所を変更し、HTTPS URL を使用して WSDL を生成します。SoapUI および Visual Studio からサービス参照を追加してテストされました (app.config は https を反映します)。ありがとう

于 2016-12-20T21:53:39.937 に答える
-1

いいえ、http ではなく WSDL メタデータで https を表示するように WCF に指示する方法はありません。私たちの解決策は、http と https の両方のエンドポイントバインディングを作成し、着信リクエストが http または https であるかどうかを確認し、着信リクエストのタイプによって使用されるエンドポイントバインディングを決定することです。

于 2014-10-16T09:21:36.450 に答える