5

クライアント アプリケーションが Web サービスを使用してサーバーと通信する .NET クライアントであるシステムを開発しています。IP アドレスなどのさまざまな構成オプションを使用してクライアントをデプロイできるようにする必要があります。

<!--<client>
    <endpoint address="https://localhost/services/service1"
        binding="customBinding" bindingConfiguration="ServiceSoapBinding"
        contract="ServiceReference.Service1" name="ServiceImplPort" />
    <endpoint address="https://localhost/services/service2"
        binding="customBinding" bindingConfiguration="ServiceSoapBinding"
        contract="ServiceReference.Service2" name="ServiceImplPort" />
    ...
    ..
</client>-->
<client>
    <endpoint address="https://prod.example.com/services/service1"
        binding="customBinding" bindingConfiguration="ServiceSoapBinding"
        contract="ServiceReference.Service1" name="ServiceImplPort" />
    <endpoint address="https://prod.example.com/services/service2"
        binding="customBinding" bindingConfiguration="ServiceSoapBinding"
        contract="ServiceReference.Service2" name="ServiceImplPort" />
    ...
    ..
</client>

しかし、これが問題の最良の解決策ではないことは明らかです。構成の選択肢が増えるにつれて、少し管理しにくくなります。これを改善するための提案は大歓迎です。

よろしく、 オラ

4

3 に答える 3

2

幸いなことに、この問題には優れた解決策があります。MSBuild.Community.Tasksをダウンロードしてインストールします。

次に、使用例については、次の投稿を確認してください

http://chris.widdowson.id.au/?p=781

http://grahamrhay.wordpress.com/2012/03/16/multiple-config-transforms-at-build-time/

セットアップには 5 分以上かかり、手動で .csproj ファイルを編集することになるという警告

このソリューションは非常にうまく機能します。問題があれば戻ってきてください

于 2012-06-07T14:36:10.723 に答える
1

問題をほぼ解決する wal のアプローチを試しましたが、クリック 1 回の展開で問題が発生しました。wal の回答に対する私のコメントを参照してください。

現在使用しているソリューションは、この投稿で提案されている条件付きコンパイルです。

http://www.codeproject.com/Articles/451734/Visual-Studio-Use-Conditional-Compilation-to-Contr

利点は、クリック 1 回で問題なく動作することとは別に、VS プロジェクト ファイルを微調整したり、サードパーティのコンポーネントを使用したりする必要がないことです。欠点は、エンドポイントを追加/変更する場合、ソース コードを更新する必要があることです。

私たちがしたことは、新しい.settingsファイルをプロジェクトに追加することでした。これは必須ではありませんが、このファイルを微調整する必要があるため、エンドポイント構成を別の設定ファイルに保持することをお勧めします。条件付きコンパイルを使用して、コンパイルが有効になっている構成に基づいて正しいエンドポイントを有効にするように調整されています。

    public ServiceSettings() {
        // // To add event handlers for saving and changing settings, uncomment the lines below:
        //
        // this.SettingChanging += this.SettingChangingEventHandler;
        //
        // this.SettingsSaving += this.SettingsSavingEventHandler;
        //

        // Each method corrsponds to a build version. We call all four methods, because
        // the conditional compilation will only compile the one indicated:
        this.SetLocalApplicationSettings();
        this.SetAS12ApplicationSettings();
    }

    [Conditional("LOCAL")]
    private void SetLocalApplicationSettings()
    {
        this["LoginAddress"] = "https://localhost/services/loginservice";
        this["SettingsAddress"] = "https://localhost/services/settingsservice";
    }

    [Conditional("EXAMPLE")]
    private void SetAS12ApplicationSettings()
    {
        this["LoginAddress"] = "https://example.com/services/loginservice";
        this["SettingsAddress"] = "https://example.com/services/settingsservice";
    }

VS では、エンドポイントごとに 1 つの構成を作成し、[ビルド] タブで適切な条件付きコンパイル シンボル (LOCAL または EXAMPLE) を定義しました。

また、設定ファイルで定義されたエンドポイントを使用するように、VS によって生成された WS クライアント クラスを使用してコードを更新しました。

var client = new SettingsServiceClient("SettingsServiceImplPort",
    ServiceSettings.Default.SettingsAddress);

app.config では、デフォルトの構成 (localhost) とバインド構成を保持して、VS を満足させます。

<system.serviceModel>
  <bindings>
    <customBinding>
      <binding name="SettingsServiceImplServiceSoapBinding">
        <textMessageEncoding messageVersion="Soap12" />
        <httpsTransport />
      </binding>
      <binding name="LoginServiceImplServiceSoapBinding">
        <textMessageEncoding messageVersion="Soap12" />
        <httpsTransport />
      </binding>
    </customBinding>
  </bindings>
  <client>
    <endpoint address="https://localhost/services/settingsservice"
      binding="customBinding" bindingConfiguration="SettingsServiceImplServiceSoapBinding"
      contract="SettingsServiceReference.SettingsService" name="SettingsServiceImplPort" />
    <endpoint address="https://localhost/services/loginservice"
      binding="customBinding" bindingConfiguration="LoginServiceImplServiceSoapBinding"
      contract="LoginServiceReference.LoginService" name="LoginServiceImplPort" />
  </client>
</system.serviceModel>
<applicationSettings>
    <ConfigurationTest.ServiceSettings>
        <setting name="SettingsAddress" serializeAs="String">
            <value>https://localhost/services/settingsservice</value>
        </setting>
        <setting name="LoginAddress" serializeAs="String">
            <value>https://localhost/services/loginservice</value>
        </setting>
    </ConfigurationTest.ServiceSettings>
</applicationSettings>
于 2012-12-11T10:49:56.427 に答える
1

MSI パッケージを使用してアプリケーション (WiX でビルド) を展開し、製品にパッケージ化した XMLPreprocess 実行可能ファイルを呼び出すカスタム アクションを使用して、非常に満足しています。基本的には、XPath と、Excel で管理しているいくつかの XML ファイルを使用して、app/web.config ファイルの再構成を処理します。かなり長い間使用していますが、製品に問題はありません。

ここにリンクがあります:http://xmlpreprocess.codeplex.com/

展開戦略を詳しく説明して、状況に対する具体的な回答を提供していただけると助かります。

編集:これはおそらく内部製品専用であることを追加する必要があります.MSIを外部に提供している場合は、このアプローチを使用したくないでしょう.

于 2012-06-07T16:52:23.043 に答える