web-dev-qa-db-ja.com

再コンパイルせずに.NETでWebサービスアドレスを動的に切り替えるにはどうすればよいですか?

Webサービスを参照するコードがあり、そのWebサービスのアドレスを動的に変更して(データベース、構成ファイルなどから読み取る)、簡単に変更できるようにします。これの主な用途の1つは、マシン名とIPアドレスが異なる複数の環境に展開することです。 Webサービスの署名は、他の場所にあるすべての展開で同じになります。

たぶん、Visual Studioの「Web参照の追加」ウィザードに甘やかされているだけかもしれません。しかし、これは比較的簡単なことのようです。

58
stames

Web参照を生成し、ソリューションエクスプローラーでWeb参照をクリックすると。プロパティペインに次のようなものが表示されます。

Web Reference Properties

値を動的に変更すると、app.configにエントリが追加されます。

CodePlexの記事 に詳細があります。

52
Eric Schoonover

これを本当に動的に設定する場合は、呼び出しているプロキシクラスのインスタンスの.Urlフィールドを設定する必要があります。

プログラム内から.configファイルの値を設定します。

  1. 混乱です;

  2. 次のアプリケーションが起動するまで読み取られない場合があります。

インストールごとに1回だけ行う必要があるのであれば、他の投稿者に同意し、.configファイルと動的設定を使用します。

30
Brad Bruce

これは古い質問であることは知っていますが、私たちの解決策はここにあるものよりもはるかに簡単です。 VS2010以降でのWCF呼び出しに使用します。文字列urlは、アプリの設定または別のソースから取得できます。私の場合、ユーザーがサーバーを選択するのはドロップダウンリストです。 TheServiceはVS add service referenceを通じて構成されました。

private void CallTheService( string url )
{
   TheService.TheServiceClient client = new TheService.TheServiceClient();
   client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url);
   var results = client.AMethodFromTheService();
}
16
rwg

私は数日間この問題に苦労し、ついに電球をクリックしました。実行時に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;
            }
        }
    }
}
6

URLの動作を「 動的 」に変更します。

5
Gulzar Nazim

Webサービスメソッドと基になる公開クラスが変更されない限り、それはかなり簡単です。 Visual Studio 2005(およびそれ以降)では、Web参照を追加すると、このURLを持つapp.config(またはwebアプリの場合はweb.config)セクションが作成されます。必要なことは、app.configファイルを編集して目的のURLを反映することだけです。

このプロジェクトでは、単純なアプローチとして、環境の種類(開発、テスト、実稼働)ごとにapp.configエントリをコメント化するだけでした。そのため、目的の環境タイプのエントリのコメントを外します。特別なコーディングは必要ありません。

4
cruizer

静的と動的の違いについてのみ注意してください。

  • 静的:Webサービスを呼び出すたびにURLプロパティを設定する必要があります。これは、Webサービスがプロキシクラスコンストラクターにある場合のベースURLであるためです。
  • 動的web.configファイルに特別な設定キーが作成されます。デフォルトでは、プロキシクラスはこのキーからURLを読み取ります。
2
stefano m

データベースからURLを取得する場合は、WebサービスプロキシクラスのURLプロパティに手動で割り当てることができます。これは、Webメソッドを呼び出す前に実行する必要があります。

構成ファイルを使用する場合は、プロキシクラスのURLの動作を動的に設定できます。

2
Aaron Fischer

間違いなくUrlプロパティを使用する方法です。 app.config、データベース、または3番目の場所のいずれで設定するかは、構成のニーズによって異なります。 Webサービスの場所を変更したときにアプリを再起動したくない場合があります。バックエンドをスケーリングするロードバランサーがない場合があります。 Webサービスのバグをホットパッチしている可能性があります。実装にもセキュリティ構成の問題がある可能性があります。本番データベースのユーザー名とパスワード、またはwsセキュリティ認証情報であるかどうか。適切に職務を分離することで、より複雑な構成設定を行うことができます。

プロキシ生成クラスの周りにラッパークラスを追加すると、ラッパーメソッドを作成してWebメソッドを呼び出すたびに、統一された方法でUrlプロパティを設定できます。

1
mspmsp

私にとって、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>
0
djciko

solition Explorerを開きます

webサービスを右クリックし、URLの動作を動的に変更します

ソリューションエクスプローラーで[すべてのファイルを表示]アイコンをクリックします

webリファレンスでReference.csファイルを編集します

建設業者を変更する

public Service1() {
        this.Url = "URL"; // etc. string  variable this.Url = ConfigClass.myURL
      }
0
mesutpiskin