在web.config中使用web.config变量

时间:2010-08-05 09:40:55

标签: asp.net web-config

我想在web.config中定义一个变量,我可以在web.config文件(以及其他配置文件)中的多个位置使用。通过示例解释可能更容易......

的web.config

<?xml version="1.0"?>
<configuration>
    <appSettings>
        <add key="AuthServiceEndPoint" value="any_old_name_i_like"/>
    </appSettings>
    <system.web>

    ...

    <system.serviceModel>
        <client>
            <endpoint
                address="net.tcp://localhost/AuthService"
                binding="netTcpBinding"
                contract="MyServices.Contracts.IAuthService"
                name="#{AppSettings.AuthServiceEndPoint}"
                bindingConfiguration="netTcpBindingConfig"
            />

        </client>
    </system.serviceModel>
</configuration>

windsor.config

<?xml version="1.0" encoding="utf-8" ?>
<castle>
    <components>

        ...

        <component
            id="AuthProvider"
            service="MyServices.Client.IAuthProvider, MyServices.Client"
            type="MyServices.Client.AuthProvider, MyServices.Client"
            lifestyle="transient">
            <parameters>
                <endpoint>#{AppSettings.AuthServiceEndPoint}</endpoint>
            </parameters>
        </component>

    </components>
</castle>

这可能吗?


修改(更多信息)

我已经能够从windsor.config文件访问AppSettings(实际上是由city windsor和自定义XmlInterpreter处理的。

真正的问题是我可以在web.config中执行此操作吗?

<?xml version="1.0"?>
<configuration>
    <appSettings>
        <add key="AuthServiceEndPoint" value="any_old_name_i_like"/>
    </appSettings>
    <system.web>

    ...

    <system.serviceModel>
        <client>
            <endpoint
                address="net.tcp://localhost/AuthService"
                binding="netTcpBinding"
                contract="MyServices.Contracts.IAuthService"
                name="#{AppSettings.AuthServiceEndPoint}"
                bindingConfiguration="netTcpBindingConfig"
            />

        </client>
    </system.serviceModel>
</configuration>

即 - 从我的web.config文件的其他部分访问<appSettings>中的变量。

4 个答案:

答案 0 :(得分:0)

不是我能想到的。您可以在global.asax.cs中使用C#而不是xml文件进行配置。

或者,让构建过程编辑的web.config替换所有这些值。 FinalBuilder有一个neato“编辑XML文件”操作,它使用XPath做得很好,而FinalBuilder 确实有变量。问题解决了。这就是我在工作中构建的方法。

答案 1 :(得分:0)

离开我的头顶,我想知道你是否可以用T4做到这一点?我想也许你可以定义一个解析Web-Template.config并输出Web.config的模板?当然,这仅适用于单个文件。

答案 2 :(得分:0)

您可以使用NAnt或MSBuild。您确实需要单独的配置文件,但是在构建项目时,它们可以自动对Web.config和其他配置文件进行转换。

答案 3 :(得分:0)

我再次回答我自己的问题:-S

我通过编写NetTcpServiceLocator来解决这个问题......

public interface INetTcpServiceLocator
{
    EndpointAddress GetAddress(Type serviceType);
}

...以及自定义配置节处理程序,它还实现了上述接口并读入以下配置节...

<services>
    <service contract="My.Services.TestService.Contracts.ITestService" address="net.tcp://localhost/TestService" />
</services>

然后我为每个服务创建了一个代理......

public class TestServiceProxy : ITestService
{
    public SomeInformation GetSomeInformation(SomeParams @params)
    {
        using (var factory = new NetTcpServiceFactory<ITestService>())
        {
            var service = factory.Service;
            return service.GetSomeInformation(@params);
        }
    }
}

我的控制器依赖于服务,该服务依赖于ITestService。所有这些都与Castle Windsor和使用属性依赖注入相结合。

因此,我的控制器调用它的服务,后者又调用ITestService(在这种情况下是一个代理,它从自定义部分处理程序获取它的端点)。

自定义部分处理程序(也是INetTcpServiceLocator)具有“perWebRequest”的windsor生活方式,因此它被框架调用,web.config被读入内存中的数组。调用服务代理时,它只会根据合同类型提取相关端点。

这都是由合同类型驱动的,所以不再需要web.config中的任何变量。

我已经选择了基于代码的解决方案,因为我没有在本地使用构建过程,只有当我将代码提交给subversion时,构建过程才会在构建服务器上启动。