如何在开发期间管理从子域服务静态内容

时间:2011-11-06 23:11:36

标签: asp.net asp.net-mvc subdomain static-content asp.net-mvc-4

我想从生产中的子域开始提供静态内容。在Visual Studio中保持平滑的开发体验的同时,最好的方法是什么?到目前为止,我不必担心URL,我只会使用:

<script src="@Url.Content("~/Scripts/jquery.someScript.js")" type="text/javascript"></script>

当我在本地时,它会自动映射到http://localhost/myApp/Scripts/jquery.someScript.js,当我投入生产时,它会自动映射到http://www.myDomain.com/Scripts/jquery.someScript.js。我不需要做任何事情来管理URL。

我的第一直觉是在我的web.config中使用一些AppSettings并指定HostName和StaticHostName,但这会破坏我对Url.Content的使用。

解决此问题的最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

某处,您需要使用配置设置来指示在给定环境中需要哪种行为(我想您可以使用IsDebuggingEnabled属性,但自定义配置设置更灵活。)

我可以想到两种可能的技巧。

选项1

您可以为UrlHelper编写自己的扩展方法,以获取相关的配置设置。然后,您的视图代码将与配置知识隔离开来,例如:

<script src="@Url.StaticContent("~/Scripts/jquery.someScript.js")" type="text/javascript"></script>

这是一个示例实现(未经测试):

public static class UrlHelperExtensions
{
    public static string StaticContent(this UrlHelper urlHelper, string contentPath)
    {
        if (!VirtualPathUtility.IsAppRelative(contentPath))
        {
            throw new ArgumentException("Only use app relative paths");
        }

        // TODO: Further checks required - e.g. the path "~" passes the above test

        if (UseRemoteServer)
        {
            // Remove the initial "~/" from the content path
            contentPath = contentPath.Substring(2);
            return VirtualPathUtility.Combine(RemoteServer, contentPath);
        }

        return urlHelper.Content(contentPath);
    }

    private static string RemoteServer
    {
        get
        {
            // TODO: Determine based on configuration/context etc
            return null;
        }
    }

    private static bool UseRemoteServer
    {
        get
        {
            return !string.IsNullOrWhiteSpace(RemoteServer);
        }
    }
}

选项2

另一种方法可能是使用Combres之类的东西,但可以通过转换Combres的XML配置文件来修改每个环境的配置。