4

VS2010にSilverlight5プロジェクトがあり、Webアプリのデータベース接続文字列を変更するのとほぼ同じように、構成に基づいて構成ファイルを変更したいと考えています。

私のServiceReferences.ClientConfigは次のようになります。

<configuration>
<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IWcfPortal" closeTimeout="00:10:00"
                openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
                maxBufferSize="25000000" maxReceivedMessageSize="25000000" />
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint name="WcfCslaService" address="http://localhost:22/Services/WcfSlPortal.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWcfPortal"
            contract="WcfPortal.IWcfPortal" />
    </client>
</system.serviceModel>

My ServiceReferences.MyConfig.ClientConfigファイル(右クリックで低速チーターで自動追加、変換を追加)は次のようになります。

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<system.serviceModel>
    <client>
        <endpoint name="WcfCslaService" address="http://192.168.0.0:22/Services/WcfSlPortal.svc"
                  binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWcfPortal" contract="WcfPortal.IWcfPortal"
                  xdt:Transform="Replace" />
    </client>
</system.serviceModel>

私の問題は、ノード全体を置き換える代わりに(この同じソリューションのweb.configで行っているように)、変換が行われないことです。クリーン/リビルド、手動で.xapファイルを削除、一度に1つのプロジェクトをビルドしてみました。silverlightのproject\binフォルダーを調べて、xapファイルを解凍すると、すべてのClientConfigファイルが含まれるようになり、メインの構成ファイルは変更されません。また、「xdt:Transform」に下線を引くxapファイルに、「「http://schemas.microsoft.com/XML-Document-Transform:Transform」属性が宣言されていません」というエラーがあります。

ServiceReferences.MyConfig.ClientConfigを右クリックすると、[変換のプレビュー]が正確に表示されます(IPアドレスが更新された同じサービス)。もう1つのクレイジーなことは、これは以前は機能していたことであり、それを壊すために何をしたのかわかりません(リポジトリにコミットする直前に壊れました)。遅いチーターをアンインストールして再インストールしたり、再起動したりしました。

この変換を機能するように修正する方法を知っている人はいますか?

4

2 に答える 2

2

あなたが本当にやろうとしているのがアドレスを置き換えることだけであるなら、あなたはこのようなことを試みるかもしれません(注、私はSlowCheetah自体を使用していませんが、おそらくこの間接的なアプローチは問題を解決するのに十分な洞察を与えるでしょう)。組み込みの変換メカニズムを使用してBeforeBuildAfterBuildMSBuildターゲットにフックしています。

ServiceReferences.ClientConfig.Template私はのようなものを持っています

<configuration>
  <system.serviceModel>
    <!-- ... -->
    <client>
      <endpoint
        name="Mine"
        address="http://localhost:8080/SomeService.svc"
        binding="basicHttpBinding"
        bindingConfiguration="..."
        contract="..."/>
    </client>
  </system.serviceModel>
</configuration>

そして、アドレスを置き換えるために、私は変換を使用します

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.serviceModel>
    <client>
      <endpoint
        xdt:Locator="Match(name)"
        xdt:Transform="SetAttributes(address)"
        name="Mine" 
        address="http://SomethingElse/Services/SomeService.svc"/>

ノード全体を置き換えようとしている場合、私はそれを試していませんが、苦痛を伴いながら、不要な属性をすべて削除してから、新しい属性を追加することができます。

本物を作成する変換を開始するためServiceReferences.ClientConfigに、Silverlight.csprojファイルに次のものがあります。

  <Target Name="BeforeClean">
    <Delete Files="ServiceReferences.ClientConfig" />
    <Message Importance="High" Text="***** Deleted generated ServiceReferences.ClientConfig" />
  </Target>
  <Target Name="BeforeBuild" Condition="Exists('ServiceReferences.$(Configuration).ClientConfig')">
    <!-- this is the file that ultimately we want to populate in a .xap, but this is also not version controlled; effectively it's always generated -->
    <Delete Files="ServiceReferences.ClientConfig" />
    <!-- transform the template -->
    <TransformXml Source="ServiceReferences.Template.ClientConfig" Destination="ServiceReferences.ClientConfig" Transform="ServiceReferences.$(Configuration).ClientConfig" />
    <Message Importance="High" Text="***** Generated ServiceReferences.ClientConfig from ServiceReferences.Template.ClientConfig and ServiceReferences.$(Configuration).ClientConfig" />
  </Target>
  <Target Name="AfterBuild" />

他のいくつかの(おそらくソリューションですでに正しくセットアップされている)「明らかな」チェック事項は次のとおりです。

  • Silverlightプロジェクトのプロパティに正しい.xap名前が付けられ、Silverlightマニフェストファイルが生成されることを確認してください。
  • ClientBinSilverlightアプリのWebホストプロジェクトに上記のプロジェクトの名前が含まれていること、およびWebのPathに配置されていることを確認してください。
  • 2つのプロジェクトの依存関係とビルド順序が正しいことを確認してください
于 2012-08-15T23:56:27.947 に答える
2

助けてくれたキットに感謝します。私はついにこれを調べて、異なる構成を使用していくつかの異なるサーバーにデプロイするための少しの時間を取り、次の解決策を思いつきました。

  1. プロジェクトプロパティのSilverlightアプリケーションセクションで、Webプロジェクトプロパティのビルド出力パスが\ bin \であり、構成固有のフォルダーが[いいえ]に設定されていることを確認します。
  2. Silverlightプロジェクトプロパティのビルド出力パスが\bin\であることを確認してください(これが私の最初の問題でした)
  3. Slow Cheetah(簡単)を使用するか、silverlightプロジェクトのcsproj xmlを変更します(一度実行すると、少し苦痛ですが、悪くはありません-ServiceReferences.ClientConfigファイルの構成固有の変換を可能にするリンクは次のとおりです)。遅いチーターでは、構成固有の変換を右クリックして変換を表示できます。私とキットの両方の変換作業。
  4. xml(上記のリンクから取得)をsilverlightプロジェクト(csproj)ファイルに追加します。これはキットに似ていますが、なぜ彼がコンパイルせず、これがコンパイルされるのかわかりません(これは私の2番目の問題でした)-以下のxml
  5. プロジェクトを再構築してから公開します。.xapには、変換されたServiceReferences.ClientConfigファイルが含まれます。
  6. デプロイメント構成をチーム全体と共有する場合は、MyProject.Publish.Xmlをリポジトリーに追加します
 <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
 <Target Name="BeforeBuild" Condition="Exists('ServiceReferences.$(Configuration).ClientConfig')">
     <Move SourceFiles="ServiceReferences.ClientConfig" DestinationFiles="ServiceReferences.Build.ClientConfig" />
    <TransformXml Source="ServiceReferences.Build.ClientConfig" Destination="ServiceReferences.ClientConfig" Transform="ServiceReferences.$(Configuration).ClientConfig" />
 </Target>
 <Target Name="AfterBuild" Condition="Exists('ServiceReferences.Build.ClientConfig')">
     <Delete Files="ServiceReferences.ClientConfig" />
    <Move SourceFiles="ServiceReferences.Build.ClientConfig" DestinationFiles="ServiceReferences.ClientConfig" />
 </Target>
于 2012-09-25T16:02:29.397 に答える