2

同じ SOAP Web サービスを提供するために任意の数のサーバーが必要になるというシナリオがあります。1 セットのプロキシ クラスを生成し、実行時に異なるサーバーを指す場所を提供できるようにしたいと考えています。wsdl:port残念ながら、ノード (の子) のように見えます。wsdl:service) では、特定のサーバーのアドレスをハードコーディングする必要があります。これにより、URL がプロキシ クラスに焼き付けられるようです。生成されたプロキシ クラスを手動で編集するか、コード生成を変更することで、これを変更できる可能性があることはわかっていますが、実際にはそうした方法に頼りたくないのです。この問題を解決するためのより良い方法が必要だと感じています。サービスが存在する場所からインターフェイス定義を分離したいだけです。私は VS2008 と C#.NET を使用していますが、それが役立つ場合は、この問題に対する言語に依存しない (SOAP または WSDL 固有の) 一般的な解決策が最善です。

4

8 に答える 8

2

いいえ、.NET では実行時に URL を変更できます。

Service svc = new Service ();
svc.url = "Value read from config. file or some such"
output = svc.method (input);
于 2008-12-11T21:17:10.017 に答える
2

WebReference (WCF 以前) を使用して Web サービスにアクセスしている場合は、作成後に Web サービス プロキシ クラスに Url プロパティを設定するだけです。

WCF の場合、デフォルトを使用するのではなく、別のエンドポイント アドレスをプロキシ クラス コンストラクターに指定できます (考えられる他の解決策の中でも特に)。

于 2008-12-11T21:19:34.503 に答える
2

Web サーバーの負荷を分散してから、負荷分散された IP アドレスの DNS エントリを作成してみませんか... 基本的に Web ファームを作成します。これにより、静的 IP アドレスではなくホスト名を参照できるようになり、ロード バランサーまたは Web サーバーの IP アドレスを変更する必要がある場合は、1 回の変更で済みます。さらに、冗長性とパフォーマンス制御が可能になります。

于 2008-12-11T21:46:36.117 に答える
0

最も簡単な解決策は、 HAProxyなどのソフトウェアロードバランサーを使用することです。より多くのコストで、 Big-IPなどのハードウェアソリューションを使用できます。

于 2009-01-13T20:44:31.073 に答える
0

ここでは、WSDLのURLを決定する方法に関するヒントを示します。ポートを変更するだけですが、もちろんそれをより高度にすることは可能です。

public class PortChangeReflector : SoapExtensionReflector
{     
    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 (binding != null && !binding.Location.Contains("8092"))
                    {
                        binding.Location = binding.Location.Replace("92", "8092");
                    }
                }
            }
        }
    }
}

それをに入れてAdd_Code、次の参照をweb.configに追加します。

<webServices>
     <soapExtensionReflectorTypes>
          <add type="Dev.PortChangeReflector,App_Code"/>
     </soapExtensionReflectorTypes>
</webServices>

これについての新しいアイデアが得られることを願っています。

于 2009-03-17T12:41:25.757 に答える
0

プロジェクトに Web 参照を追加すると、Web サービスのアドレスがアプリケーション/Web アプリケーションの .config ファイルに配置されます。もちろん、サービスが同一であると仮定すると、構成ファイルでこの設定を変更して、別の Web サービスの場所を指すようにすることができます。

于 2008-12-11T20:57:47.573 に答える
0
  1. これはスケーリングのためですか (各サーバーは同じデータを提供します)、または
  2. 各サーバーで同じ API の異なるデータを取得するには?

2 の場合は、上記のようにして、コード内のサービス URL を変更するだけです。

1 の場合、ラウンド ロビン DNS を使用できます (たとえば、コマンド ラインで type を使用すると、複数のサーバーが表示されますnslookup www.google.com)。

于 2008-12-12T06:54:00.960 に答える
0

クライアント プロキシには、実行時に設定できる URL プロパティがあります。簡単にするために、wsdl.exe ユーティリティに/appsettingurlkeyキーがあります。クライアント プロキシを生成すると、そのコンストラクターが appSettings のキーをチェックし、それに応じてサービス URL を設定します。WCFにもこの機能があると思います。

ただし、@Matt に同意し、長期的には負荷分散を最良のソリューションと見なすことをお勧めします。

于 2008-12-11T22:00:29.850 に答える