4

我在 VS 2010 中有一个 silverlight 5 项目,并希望根据我的配置更改其配置文件,就像更改 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>

我的 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 文件,一次构建一个项目。如果我查看我的 silverlight project\bin 文件夹并解压缩我的 xap 文件,它最终会包含所有 ClientConfig 文件,并且主配置文件保持不变。我的 xap 文件中也有一个错误,在“xdt:Transform”下划线显示“未声明 'http://schemas.microsoft.com/XML-Document-Transform:Transform' 属性”。

如果我右键单击 ServiceReferences.MyConfig.ClientConfig,Preview Transform 它会准确地向我显示它应该做什么(具有更新 IP 地址的相同服务)。另一个疯狂的事情是,这以前是有效的,我不知道我做了什么来破坏它(在我去提交回购之前就坏了)。我已经卸载并重新安装了慢速猎豹,重新启动等。

任何人都知道如何修复这个转换工作?

4

2 回答 2

2

感谢 Kit 的帮助。我终于有一点时间来研究这个问题,并使用不同的配置部署到几个不同的服务器上,并提出了以下解决方案:

  1. 确保 Web 项目属性构建输出路径为 \bin\,并且在项目属性的 Silverlight 应用程序部分中将配置特定文件夹设置为否
  2. 确保 Silverlight 项目属性构建输出路径是 \bin\ (这是我的第一个问题)
  3. 使用 Slow Cheetah(简单)或修改 silverlight 项目的 csproj xml(有点痛苦,但一次完成后还不错 - 这是允许您为 ServiceReferences.ClientConfig 文件进行配置特定转换的链接)。使用慢速猎豹,您可以通过右键单击配置特定的转换来查看您的转换。我的和 Kit 的转换工作。
  4. 将 xml(取自上述链接)添加到 silverlight 项目 (csproj) 文件中。它类似于 Kit 的,但不确定为什么他不会编译而这个会(这是我的第二个问题) - 下面的 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 回答
2

如果您真正想做的只是替换地址,那么您可能会尝试这样的事情(注意,我没有使用 SlowCheetah 本身,但也许这种间接方法会给您足够的洞察力来解决问题)。我正在使用内置的转换机制并连接到BeforeBuildMSBuildAfterBuild目标。

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"/>

如果您尝试替换整个节点,我还没有尝试过,但是虽然很痛苦,但您可能可以删除所有不需要的属性,然后添加新属性。

为了启动创建 real 的转换,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 清单文件。
  • 确保 Silverlight 应用程序的 Web 主机项目包含上述项目的名称,并且将其放置在ClientBinPath in Web 中
  • 确保两个项目的依赖关系和构建顺序正确
于 2012-08-15T23:56:27.947 回答