Webサービスを参照するコードがあり、そのWebサービスのアドレスを動的(データベース、構成ファイルなどから読み取る)にして、簡単に変更できるようにしたい。これの主な用途の1つは、マシン名とIPアドレスが異なる複数の環境に展開することです。Webサービスの署名は、他の場所にあるすべてのデプロイメントで同じになります。
Visual Studioの「Web参照の追加」ウィザードに甘やかされたばかりかもしれませんが、これは比較的簡単なことのようです。
Webサービスを参照するコードがあり、そのWebサービスのアドレスを動的(データベース、構成ファイルなどから読み取る)にして、簡単に変更できるようにしたい。これの主な用途の1つは、マシン名とIPアドレスが異なる複数の環境に展開することです。Webサービスの署名は、他の場所にあるすべてのデプロイメントで同じになります。
Visual Studioの「Web参照の追加」ウィザードに甘やかされたばかりかもしれませんが、これは比較的簡単なことのようです。
Web参照を生成し、ソリューションエクスプローラーでWeb参照をクリックするとき。プロパティペインに次のようなものが表示されます。
値をdynamicに変更すると、app.configにエントリが追加されます。
詳細については、CodePlexの記事をご覧ください。
これを本当に動的に設定する場合は、呼び出しているプロキシ クラスのインスタンスの .Url フィールドを設定する必要があります。
プログラム内から .config ファイルの値を設定します。
混乱です;
次のアプリケーション起動まで読み取れない場合があります。
インストールごとに 1 回だけ実行する必要がある場合は、他のポスターに同意し、.config ファイルと動的設定を使用します。
これが古い質問であることは承知していますが、私たちの解決策はここにあるものよりもはるかに簡単です。VS2010 以降での WCF 呼び出しに使用します。文字列 URL は、アプリの設定または別のソースから取得できます。私の場合、ユーザーがサーバーを選択するドロップダウンリストです。TheService は、VS 追加サービス参照を通じて構成されました。
private void CallTheService( string url )
{
TheService.TheServiceClient client = new TheService.TheServiceClient();
client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url);
var results = client.AMethodFromTheService();
}
私はこの問題に数日間苦労しましたが、ついに電球がカチッと音を立てました。実行時に Web サービスの URL を変更できるようにするための鍵は、部分的なクラス宣言で行ったコンストラクターのオーバーライドです。上記の、URL の動作を動的に設定することも行う必要があります。
これは基本的に Web サービス ラッパーを作成し、ある時点で Web サービスをリロードする必要がある場合に、サービス参照の追加を介して作業を失うことはありません。部分クラスに関する Microsoft のヘルプでは、この構造体の理由の一部は Web サービス ラッパーを作成することであると特に述べています。 http://msdn.microsoft.com/en-us/library/wa80x488(v=vs.100).aspx
// Web Service Wrapper to override constructor to use custom ConfigSection
// app.config values for URL/User/Pass
namespace myprogram.webservice
{
public partial class MyWebService
{
public MyWebService(string szURL)
{
this.Url = szURL;
if ((this.IsLocalFileSystemWebService(this.Url) == true))
{
this.UseDefaultCredentials = true;
this.useDefaultCredentialsSetExplicitly = false;
}
else
{
this.useDefaultCredentialsSetExplicitly = true;
}
}
}
}
URLの動作を「動的」に変更します。
Web サービス メソッドとその下にある公開されたクラスが変更されない限り、それはかなり簡単です。Visual Studio 2005 (およびそれ以降) では、Web 参照を追加すると、この URL を持つ app.config (または Web アプリの場合は web.config) セクションが作成されます。目的の URL を反映するように app.config ファイルを編集するだけです。
私たちのプロジェクトでは、環境の種類 (開発、テスト、運用) ごとに app.config エントリにコメントを付けるだけの簡単なアプローチでした。そのため、目的の環境タイプのエントリのコメントを外します。特別なコーディングは必要ありません。
静的と動的の違いについてのメモです。
データベースからURLをフェッチする場合は、手動でWebサービスプロキシクラスのURLプロパティに割り当てることができます。これは、Webメソッドを呼び出す前に実行する必要があります。
構成ファイルを使用する場合は、プロキシクラスのURLの動作を動的に設定できます。
間違いなく Url プロパティを使用する方法です。app.config、データベース、または 3 番目の場所に設定するかどうかは、構成のニーズによって異なります。Web サービスの場所を変更したときにアプリを再起動したくない場合があります。バックエンドをスケーリングするロード バランサーがない可能性があります。Web サービスのバグにホット パッチを適用している可能性があります。実装にもセキュリティ構成の問題がある可能性があります。それが実稼働データベースのユーザー名とパスワードであろうと、ws セキュリティ認証情報であろうと。職務を適切に分離することで、より複雑な構成設定を行うことができます。
プロキシで生成されたクラスにラッパー クラスを追加すると、ラッパー クラスを作成して Web メソッドを呼び出すたびに、何らかの統一された方法で Url プロパティを設定できます。
私にとって WebService への参照は
サービスリファレンス
.
とにかくとても簡単です。誰かが言ったように、web.config ファイルの URL を変更するだけです。
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="YourServiceSoap" />
</basicHttpBinding>
</bindings>
<client>
**** CHANGE THE LINE BELOW TO CHANGE THE URL ****
<endpoint address="http://10.10.10.100:8080/services/YourService.asmx"
binding="basicHttpBinding" bindingConfiguration="YourServiceSoap"
contract="YourServiceRef.YourServiceSoap" name="YourServiceSoap" />
</client>
ソリション エクスプローラーを開く
Web サービスを右クリックし、URL 動作を動的に変更します
ソリューション エクスプローラーで [すべてのファイルを表示] アイコンをクリックします。
Web リファレンスで、Reference.cs ファイルを編集します。
コンストラクターの変更
public Service1() {
this.Url = "URL"; // etc. string variable this.Url = ConfigClass.myURL
}