【问题标题】:~ Paths resolved differently after upgrading to ASP.NET 4~ 升级到 ASP.NET 4 后路径解析不同
【发布时间】:2011-12-06 05:47:03
【问题描述】:

我们正在将一个大型系统升级到 ASP.NET 4,我们发现了一个奇怪的问题,即解决以 ~ 开头的一些 Ajax 请求的路径的方式。我们的 Ajax 请求使用 Server.Execute,它们执行的页面的路径以 ~ 开头。但是,在 ASP.NET 4 中,似乎此路径解析不正确,将“MyService.aspx/MyMethod”视为 MyService.aspx 是一个文件夹。这与 ASP.NET 3.5 不同。

我创建了一个小样本来说明问题。

我已经设法在一个小样本中重现了这个问题:

~/Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>
<html>
<head runat="server">
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">
        google.load("jquery", "1.6.4");
    </script>
</head>
<body>

<script type="text/javascript">
    $(function () {
        $.ajax({
            type: "POST",
            url: "WebService1.asmx/HelloWorld",
            success: function (msg) {
                alert(msg.text);
            }
        });
    });
</script>

</body>
</html>

WebService1.asmx.cs

public class WebService1 : System.Web.Services.WebService
{
    [WebMethod]
    public string HelloWorld()
    {
        var tw = new StringWriter();
        tw.WriteLine("VirtualPathUtility.ToAbsolute(\"~/Images/Blah.png\"): " + VirtualPathUtility.ToAbsolute("~/Images/Blah.png"));
        tw.WriteLine("VirtualPathUtility.ToAppRelative(\"~/Images/Blah.png\"): " + VirtualPathUtility.ToAppRelative("~/Images/Blah.png"));
            // Hack to use ResolveClientUrl without including a Server.Execute in the sample
        tw.WriteLine("new Image().ResolveClientUrl(\"~/Images/Blah.png\"): " + new Image().ResolveClientUrl("~/Images/Blah.png"));
        return tw.ToString();
    }
}

如果您在 ASP.NET 3.5 和 ASP.NET 4 上运行相同的代码,您将获得不同的输出:

3.5
---------------------------
VirtualPathUtility.ToAbsolute("~/Images/Blah.png"): /MyTest1/Images/Blah.png
VirtualPathUtility.ToAppRelative("~/Images/Blah.png"): ~/Images/Blah.png
new Image().ResolveClientUrl("~/Images/Blah.png"): Images/Blah.png

4.0
---------------------------
VirtualPathUtility.ToAbsolute("~/Images/Blah.png"): /MyTest1/Images/Blah.png
VirtualPathUtility.ToAppRelative("~/Images/Blah.png"): ~/Images/Blah.png
new Image().ResolveClientUrl("~/Images/Blah.png"): ../Images/Blah.png

前两个调用相同,但ResolveClientUrl 调用的行为不同。注意:我们实际上并没有像这样调用ResolveClientUrl,它位于Server.Execute'd 的ASPX 页面内,我这样做只是为了保持样本量小 - 问题似乎是一样的。

那么...这是一个错误吗?有什么方法可以使这项工作与 ASP.NET 4 中的工作相同,以避免必须四处移动以使路径正常工作?

【问题讨论】:

    标签: .net asp.net ajax webforms asp.net-4.0


    【解决方案1】:

    在 ASP.NET 4.0 中看起来像 this may be a deliberate change (bug fix?),因此可以正确返回路径,以便浏览器能够解释它们,例如。

    /MyFolder/MyPage.aspx/Something/Something
    

    在 ASP.NET 中,URL 不正确,因为它们基于 /MyFolder/MyPage.aspx

    我认为 ASP.NET 3.5 的行为从来都不是正确的,它只是我们使用的,因为它就是这样,所以它现在已经坏了。

    我现在的解决方案是将 asmx 文件上移一层,这样它们就比要写入内容的页面高一层。这很糟糕,并且仅当您的页面位于文件夹中时才有效,但它比重写它的工作原理更容易!

    【讨论】:

    • 这是我第一行链接到的文章 ;-) 我们最终移动了我们的服务(幸运的是,所有调用它们的文件都在一个子文件夹中,否则这将不起作用)。可能不应该是一个兼容性开关:-(
    猜你喜欢
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    相关资源
    最近更新 更多