Мы обновляем большую систему до 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
, как это, это внутри страницы ASPX, которая Server.Execute
'd, я просто сделал это, чтобы сохранить небольшой размер выборки - проблема, похоже, та же.
Итак ... Это ошибка? Можно ли как-нибудь заставить эту работу работать так же, как в ASP.NET 4, чтобы избежать необходимости перемещать ее так, чтобы пути работали правильно?