使用Microsoft的xml文档转换来转换web.config正在添加不需要的空格

时间:2010-05-27 16:00:55

标签: visual-studio-2010 deployment transform xslt xml-document-transform

我正在使用XML-Document-Transform转换我的web.config文件以便部署到登台服务器。不幸的是,它并没有完全按照指定进行转换,而是在元素的文本中添加了一些空格。然后,这个空白被我使用的Castle Windsor配置和轰炸应用程序拾取。

以下是一个例子:

的web.config:

<configuration>
  <castle>
    <properties>
      <serverUrl>http://test</serverUrl>
    <properties>
    <components>
      <component id="MyService">
        <parameters>
          <Url>#{serverUrl}/MyService.asmx</Url>
        </parameters>
      </component>
    </components>
  <castle>
<configuration>

web.staging.config:

<configuration>
  <castle>
    <properties>
      <serverUrl xdt:Transform="Replace">http://staging</serverUrl>
    <properties>
  <castle>
<configuration>

输出web.config:

<configuration>
  <castle>
    <properties>
      <serverUrl>http://staging
      </serverUrl>
    <properties>
    <components>
      <component id="MyService">
        <parameters>
          <Url>#{serverUrl}/MyService.asmx</Url>
        </parameters>
      </component>
    </components>
  <castle>
<configuration>

正如您所看到的那样,通过转换已将更多空格插入serverUrl元素。

不幸的是,在将serverUrl插入到创建无效网址的服务的Url时,Castle会包含空格。

其他人遇到过这个?任何人都有一个仍然使用新的Microsoft转换方法的解决方案,但不会导致插入额外的空格?

恕我直言,这是变换过程中的一个错误,虽然Castle也可能忽略了空白。

非常感谢,Rob

2 个答案:

答案 0 :(得分:2)

这在Visual Studio 2010 SP1中已得到修复,并且是Microsoft.Web.Publishing.Tasks.dll和相关* .target文件的问题。如果您使用的是未安装Visual Studio SP1但正在使用MsBuild的构建服务器,则应确保复制这些文件。

要解决此问题,请将安装了SP1的计算机上的所有内容从C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web复制到构建服务器上的同一目录。

答案 1 :(得分:1)

此问题也会影响applicationSettings,但我可以按照您的建议修剪空白区域来解决这个问题。这是我的Settings.cs文件。

internal sealed partial class Settings
{
    public override object this[string propertyName]
    {
        get
        {
            // trim the value if it's a string
            string value = base[propertyName] as string;
            if (value != null)
            {
                return value.Trim();
            }

            return base[propertyName];
        }
        set { base[propertyName] = value; }
    }
}

我担心这对Castle的问题没有帮助,但也许它会帮助别人!