同じ SOAP Web サービスを提供するために任意の数のサーバーが必要になるというシナリオがあります。1 セットのプロキシ クラスを生成し、実行時に異なるサーバーを指す場所を提供できるようにしたいと考えています。wsdl:port
残念ながら、ノード (の子) のように見えます。wsdl:service
) では、特定のサーバーのアドレスをハードコーディングする必要があります。これにより、URL がプロキシ クラスに焼き付けられるようです。生成されたプロキシ クラスを手動で編集するか、コード生成を変更することで、これを変更できる可能性があることはわかっていますが、実際にはそうした方法に頼りたくないのです。この問題を解決するためのより良い方法が必要だと感じています。サービスが存在する場所からインターフェイス定義を分離したいだけです。私は VS2008 と C#.NET を使用していますが、それが役立つ場合は、この問題に対する言語に依存しない (SOAP または WSDL 固有の) 一般的な解決策が最善です。
8 に答える
いいえ、.NET では実行時に URL を変更できます。
Service svc = new Service ();
svc.url = "Value read from config. file or some such"
output = svc.method (input);
WebReference (WCF 以前) を使用して Web サービスにアクセスしている場合は、作成後に Web サービス プロキシ クラスに Url プロパティを設定するだけです。
WCF の場合、デフォルトを使用するのではなく、別のエンドポイント アドレスをプロキシ クラス コンストラクターに指定できます (考えられる他の解決策の中でも特に)。
Web サーバーの負荷を分散してから、負荷分散された IP アドレスの DNS エントリを作成してみませんか... 基本的に Web ファームを作成します。これにより、静的 IP アドレスではなくホスト名を参照できるようになり、ロード バランサーまたは Web サーバーの IP アドレスを変更する必要がある場合は、1 回の変更で済みます。さらに、冗長性とパフォーマンス制御が可能になります。
最も簡単な解決策は、 HAProxyなどのソフトウェアロードバランサーを使用することです。より多くのコストで、 Big-IPなどのハードウェアソリューションを使用できます。
ここでは、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>
これについての新しいアイデアが得られることを願っています。
プロジェクトに Web 参照を追加すると、Web サービスのアドレスがアプリケーション/Web アプリケーションの .config ファイルに配置されます。もちろん、サービスが同一であると仮定すると、構成ファイルでこの設定を変更して、別の Web サービスの場所を指すようにすることができます。
- これはスケーリングのためですか (各サーバーは同じデータを提供します)、または
- 各サーバーで同じ API の異なるデータを取得するには?
2 の場合は、上記のようにして、コード内のサービス URL を変更するだけです。
1 の場合、ラウンド ロビン DNS を使用できます (たとえば、コマンド ラインで type を使用すると、複数のサーバーが表示されますnslookup www.google.com
)。
クライアント プロキシには、実行時に設定できる URL プロパティがあります。簡単にするために、wsdl.exe ユーティリティに/appsettingurlkey
キーがあります。クライアント プロキシを生成すると、そのコンストラクターが appSettings のキーをチェックし、それに応じてサービス URL を設定します。WCFにもこの機能があると思います。
ただし、@Matt に同意し、長期的には負荷分散を最良のソリューションと見なすことをお勧めします。