【发布时间】: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