【问题标题】:IIS doesn't correctly substitute "~" in VS2012 ASP.NET web siteIIS 无法正确替换 VS2012 ASP.NET 网站中的“~”
【发布时间】:2012-08-20 13:41:41
【问题描述】:

我的 ASP.NET 站点是从 Visual Studio 2012 中的 Web 表单模板生成的。我在母版页中有此代码:

<asp:PlaceHolder runat="server">
    <%: Styles.Render("~/Content/themes/base/css", "~/Content/css") %>
    <%: Scripts.Render("~/bundles/modernizr") %>
</asp:PlaceHolder>

当我从 VS 运行我的网站时,一切正常。当我将它部署到服务器时,无法加载 css 文件,因为上面的代码解析为

<link href="/Content/themes/base/css?v=UM624qf1uFt8dYtiIV9PCmYhsyeewBIwY4Ob0i8OdW81" rel="stylesheet" type="text/css" />
<link href="/Content/css?v=tMLDfv3u-lElLSOX_gsfU7tfsfKPoY_vJBePC7KLa6U1" rel="stylesheet" type="text/css" />
<script src="/bundles/modernizr?v=EuTZa4MRY0ZqCYpBXj_MhJfFJU2QBDf0xGrV_p1fHME1" type="text/javascript"></script>

所有路径都从域的根目录开始计算,而我的站点部署在子文件夹下,例如http://MyDomain.com/MySyte/。显然,波浪号运算符~ 处理不当。在所有其他地方,例如 hrefs,它已被正确替换,并且导航在已部署的站点中工作正常。

另一个例子。对于母版页中的此代码

<asp:ScriptManager runat="server" AjaxFrameworkMode="Explicit">
    <Scripts>
        <asp:ScriptReference Name="MsAjaxBundle" />
        <asp:ScriptReference Name="jquery" />
        ...
    </Scripts>
</asp:ScriptManager>

我有这个 html 输出

<script src="/bundles/MsAjaxJs?v=eYkLZimNY09iWQvWpdPDkxCLGwdMBLWkJ4bU5r3y6GU1" type="text/javascript"></script>
<script src="Scripts/jquery-1.6.2.min.js" type="text/javascript"></script>

所以 jquery 的路径是正确的和相对的,而 MsAjaxBundle 导致了一些绝对路径。

我认为这种行为是一个错误。我该如何解决?

更新:

  • Windows 7 x64
  • IIS 7.5
  • ASP.NET 应用程序目标框架 4.5
  • IIS 应用程序池框架 4.0

【问题讨论】:

    标签: asp.net iis relative-path virtual-path


    【解决方案1】:

    波浪号是来自应用程序根目录的参考点。您的MySyte 目录很可能只是您网站之外的一个文件夹,并未配置为应用程序。

    您需要将您的目录配置为 IIS 中的应用程序。对于 IIS 7.x 和 8,您可以右键单击 MySyte 文件夹并选择转换为应用程序并选择适当的 AppPool。

    【讨论】:

    • 上下文菜单中没有“转换为应用程序”条目。我的网站有 AppPool,我已经为它更改了框架版本。我认为这意味着我的网站已经是 IIS 的应用程序?
    • @Mikhail 你在使用 IIS 6 吗? (Windows Server 2003)?
    【解决方案2】:

    问题是由我们的代理服务器引起的,它实际上将http://MyDomain/MySite/ 转发到http://InternalDomain:InternalPort/。而对于那个内部域应用程序根目录实际上是一个站点根目录。

    【讨论】:

      【解决方案3】:

      使用回答功能,因为我不能评论(没有足够的权限),但要感谢操作员在正常的 asp 页面中使用的语法。

      <asp:PlaceHolder runat="server">
          <%: Styles.Render("~/Content/themes/base/css", "~/Content/css") %>
          <%: Scripts.Render("~/bundles/modernizr") %>
      </asp:PlaceHolder>
      

      【讨论】:

        猜你喜欢
        • 2017-12-11
        • 2011-06-12
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-06
        • 2013-02-20
        相关资源
        最近更新 更多