4

我们有一个站点,其中 CSS 和 JavaScript 分别捆绑到/Content//Scripts/目录中。这两者也是单独域中虚拟目录的映射目标,用于静态资源(因此不提供 cookie)。

问题在于,在我们的生产环境中, wherecompilation -> debug设置为 false(因此启用了捆绑和缩小),相对 URL 工作正常并从捆绑系统提供服务,但静态域 URL(使用指向相同的虚拟目录位置)产量HTTP 404 errors

有没有办法配置 IIS 以允许捆绑适用于此虚拟目录的内容?我的愿景是必须为静态域创建一个单独的虚拟 MVC 项目,以便它识别捆绑,但想看看是否有更好的解决方案。

以下是 IIS 的当前处理顺序:

  1. 接收对(捆绑的)资源的传入请求,例如[static domain]/Content/all.css
  2. 运行任何 HTTP 处理程序,例如捆绑(如果可用)(在静态域的这种情况下没有)
  3. 跟随虚拟目录并提供资源(如果可用),即搜索([main domain]/Content/all.css

因为这个文件在文件系统上并不真正存在,所以HTTP 404引发了 an 。理想情况下, step 2应该在 step 3之后运行。

非常感谢。

4

2 回答 2

2

我做了一些实验并设法解决了它。不起作用的是将静态站点的根目录指向主网站的同一个根目录,因为web.config文件是共享的 - 对静态站点所做的任何更改(即禁用会话状态)也适用于主网站。

最后,有效的方法如下:

  • 让静态域指向文件系统上的单独根文件夹。
  • 保持静态站点上的虚拟目录 (/Content//Scripts/) 指向它们在主站点上的相应位置。
  • .htaccess由于我们使用 Helicon 的 URL-rewriter 进行缓存清除,因此使用与主站点中使用的相同规则创建一个准系统文件;把它放在静态站点的根目录中。
  • global.asax文件从主网站复制到静态网站的根目录。这不可能是捷径。
  • /bin/文件夹的内容从主网站复制到静态网站。
    • IIS 中指向/bin/主网站上的文件夹的虚拟目录将不起作用。
    • 在文件系统中创建指向主网站文件夹的快捷方式/bin/也不起作用。
  • 在 IIS 中,确保静态站点使用自己的应用程序池,并且已针对 .NET 4.0 集成管道模式进行了配置。这样 MVC 4 捆绑就可以工作了。
  • web.config使用添加创建一个准系统UrlRoutingModule

这是我们web.config的静态站点:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <customErrors mode="Off">
        </customErrors>
        <sessionState mode="Off" />
        <pages enableSessionState="false" enableViewState="false" enableViewStateMac="false" renderAllHiddenFieldsAtTopOfForm="false" />
    </system.web>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <modules runAllManagedModulesForAllRequests="true">
            <remove name="ScriptModule" />
            <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        </modules>
        <urlCompression doStaticCompression="true" doDynamicCompression="true" />
        <security>
            <requestFiltering allowDoubleEscaping="True" />
        </security>
        <tracing>
            <traceFailedRequests>
                <add path="*">
                    <traceAreas>
                        <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
                    </traceAreas>
                    <failureDefinitions timeTaken="00:00:00" statusCodes="200" />
                </add>
            </traceFailedRequests>
        </tracing>
        <!-- Cache static content for a month, only enable on UAT or Live -->
        <staticContent>
            <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00"/>
        </staticContent>
    </system.webServer>
</configuration>

主要思想是捆绑需要在静态站点上启用和运行 ASP.NET MVC4,因为捆绑是在考虑虚拟目录之前由 IIS 评估的(而且似乎没有办法扭转这种情况)。

于 2013-02-04T23:44:28.990 回答
2

在 css 文件中创建具有相对路径的 url,例如:

div.loader {
    background-image: url("../grail/images/loader.gif");
}

在 js 文件中使用母版页中的隐藏文件:

@Html.Hidden("HiddenCurrentUrl",  Url.Content("~"))

在包中而不是 CssRewriteUrlTransform 使用您的自定义 IItemTransform

public class VirtualCssRewriteUrlTransform : IItemTransform
{
    private CssRewriteUrlTransform wrapper;

    public VirtualCssRewriteUrlTransform ()
    {
        this.wrapper = new CssRewriteUrlTransform();
    }

    public string Process(string includedVirtualPath, string input)
    {
        var result = this.wrapper.Process(includedVirtualPath, input);
        // if virtual directory exists
        if (HttpRuntime.AppDomainAppVirtualPath != "/")
        {
            result = result.Replace(@"url(/", @"url(" + HttpRuntime.AppDomainAppVirtualPath + @"/");
        }

        return result;
    }
}
于 2014-02-13T14:20:39.327 回答