我们正在将一个大型系统升级到ASP.NET 4,并且我们发现了一个奇怪的问题,即我们的一些Ajax请求解决了以~
开头的路径的方式。我们的Ajax请求使用Server.Execute,它们执行的页面包含以〜开头的路径。但是,在ASP.NET 4中,似乎错误地解决了此路径,将“MyService.aspx / MyMethod”视为MyService.aspx是一个文件夹。这与ASP.NET 3.5不同。
我已经创建了一个小样本来显示问题。
我设法在一个小样本中重现了这个问题:
<%@ 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>
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中的相同,以避免移动东西以使路径正常工作?
答案 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文件向上移动一级,因此它们的级别高于其内容所写的页面。这是一个令人讨厌的问题,只有当你的页面在一个文件夹中时才有效,但它比重写它的工作方式更容易!