〜升级到ASP.NET 4后路径解析不同

时间:2011-10-12 15:17:20

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

我们正在将一个大型系统升级到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'的ASPX页面内,我这样做是为了保持样本小 - 问题看起来是一样的。< / p>

所以......这是一个错误吗?有什么方法可以让我的工作与ASP.NET 4中的相同,以避免移动东西以使路径正常工作?

1 个答案:

答案 0 :(得分:0)

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

/MyFolder/MyPage.aspx/Something/Something

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

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

我现在的解决方案是将asmx文件向上移动一级,因此它们的级别高于其内容所写的页面。这是一个令人讨厌的问题,只有当你的页面在一个文件夹中时才有效,但它比重写它的工作方式更容易!