asp.net-mvc-3 - SlowCheetah - 使用转换后的链接配置文件来共享配置元素

标签 asp.net-mvc-3 web-config slowcheetah

我正在尝试做什么

目前,我们的解决方案中的多个项目中有重复的 WCF 配置设置。我想将 WCF 配置值存储在一个文件中,然后可以根据需要从多个项目中引用该文件。配置文件必须可转换,以允许在不同环境中使用不同的值。

我尝试过的

我做了一些研究,其他人也尝试过使用 SlowCheetah 和链接文件进行类似的操作。这就是我尝试做的事情。值得注意的是,我们的解决方案包含很多项目,一些 MVC3、一些控制台应用程序和一些类库。

  1. 我创建了一个 Wcf.Client.config 文件,将其添加到公共(public)类库,并使用 SlowCheetah 添加转换
  2. 我想在 MVC3 项目中引用此文件,因此我创建了指向配置文件的链接
  3. 在 MVC3 项目的 web.config 文件中,我添加了一个包含客户端元素的组,其 configSource 属性设置为“Wcf.Client.config”
  4. 我已将链接配置文件的“复制到输出目录”属性设置为“如果较新则复制”
  5. 我还向链接文件添加了转换(我不确定这是否有效,但它成功链接了文件)

问题

我对本地和开发环境进行了转换。不幸的是,当我在开发人员配置中运行 Web 应用程序(或发布它)时,不会选择转换。查看发布的文件,我可以看到我放置在Web项目根目录中的链接文件已成功转换,但是,它是从bin文件夹中读取的,并且bin文件夹中的文件不是 转变了。

我实际上在问什么?

我真正想知道的是,我做错了什么?有没有人尝试过我上面描述的方法并使其发挥作用?或者如果失败了,是否有人找到了另一种共享转换后的配置文件的方法?

一些代码

我创建了一个非常简单的 test project希望这能比我漫无目的的解释更好地解释我正在努力做的事情。随意看看。如果您构建或发布它,您将看到 MVC3 项目的 bin 文件夹中的 Wcf.Client.config 文件尚未转换。

最佳答案

我在这个answer中找到了合适的解决方案.

我已完成以下步骤:

1) 我在解决方案目录中创建了配置。我命名为 CommonSettings.config

2) 我添加了转换配置 CommonSettings.Debug.configCommonSettings.Debug.config 和源配置(因为 Microsoft 的构建任务无法写入源由于某种原因文件)CommonSettings.Source.config

3).然后在公共(public)类库(所有需要 CommonSettings.config 的项目都引用的类库)中,我通过添加以下行来编辑项目文件:

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />

<Target Name="BeforeBuild">
    <CallTarget Targets="TransformCommonSettings" />
</Target>

<Target Name="TransformCommonSettings">
    <ItemGroup>
        <ConfigsToTransform Include="..\CommonSettings.config" />
    </ItemGroup>

    <TransformXml 
        Source="@(ConfigsToTransform->'%(RelativeDir)%(Filename).Source%(Extension)')"
        Destination="%(FullPath)"
        Transform="%(RelativeDir)%(Filename).$(Configuration)%(Extension)"
        Condition="Exists('%(RelativeDir)%(Filename).$(Configuration)%(Extension)')" /> 
</Target>

4) 然后我将 CommonSettings.config 作为链接添加到我的 Web 应用程序(以及一些 Windows 应用程序和测试)中。在属性窗口中,我将“构建操作”设置为“内容”,将“复制到输出目录”设置为“始终复制” 5) 在注册 commonSettings 部分后,在我的 Web.config 文件中添加了以下行:

<commonSettings configSource="bin\CommonSettings.config" />

6) 对于测试项目和控制台/Windows 应用程序,我在 App.config 中设置了适当的值:

<commonSettings configSource="CommonSettings.config" />

这里路径中没有 bin,因为 App.configCommonSettings.config 都被复制到输出目录。

现在,在构建我选择的配置后,CommonSettings.config 已正确转换,并将正确的版本复制到输出目录。

好的一点是,您不需要 SlowCheetah 扩展,它可以在您的构建服务器上运行,如果您包含任务 .dll,这对我来说是完美的:)

一个问题是,当您只是运行一个项目(按 F5)时,转换将不会运行。我必须将此构建任务添加到我的所有项目中,这使构建过程减慢了大约一秒钟,但对我来说这是可以接受的。

关于asp.net-mvc-3 - SlowCheetah - 使用转换后的链接配置文件来共享配置元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10228609/

相关文章:

c# - 为什么 ConfigurationManager.GetSection "system.webServer/handlers"不可用?

asp.net - SlowCheetah 未在 CI 服务器上生成转换后的配置文件

asp.net - 如何转换类似web.config的log4net配置?

javascript - 将 JavaScript 传递给局部 View

javascript - 我如何在 javascript 中包含 mvc3 razor 变量?

iis-7 - 网址路由不起作用?

c# - 为 3 种不同的环境转换 app.config

asp.net-mvc-3 - 以下语句的等效 Razor 语法?

jquery - 使用 asp.net mvc 3 时如何将 jQuery load() 加载到动态创建的元素中?

c# - 从 web.config 按名称读取 WCF 服务终结点地址