Я только что обновил до.NET 4, и мое Управление Диаграммой ASP.NET больше не отображается.
Для.NET 3.5, HTML, произведенный управлением раньше, был похож на это:
<img id="20_Chart" src="/ChartImg.axd?i=chart_5f6a8fd179a246a5a0f4f44fcd7d5e03_0.png&g=16eb7881335e47dcba16fdfd8339ba1a" alt="" style="height:300px;width:300px;border-width:0px;" />
и теперь, для.NET 4, это похоже на это (обратите внимание на изменения в исходном пути):
<img id="20_Chart" src="/Statistics/Summary/ChartImg.axd?i=chart_5f6a8fd179a246a5a0f4f44fcd7d5e03_0.png&g=16eb7881335e47dcba16fdfd8339ba1a" alt="" style="height:300px;width:300px;border-width:0px;" />
Диаграмма находится в частичном представлении MVC, которое находится в папке MVC Area под названием "Статистика" и папке MVC Views под названием "Сводка" (т.е. "/Areas/Statistics/Views/Summary"), таким образом, это, очевидно, откуда изменения пути происходят.
Все, что я сделал, должно переключить Систему. Сеть. Блок DataVisualization от, 3.5 к 4,0.
Любая справка значительно ценится.
У нас была такая же проблема в IIS 6 после обновления с ASP.NET 3.5 до ASP.NET 4.0 с помощью ASP. .NET MVC. На IIS 7 все работало нормально, но с IIS 6 возникла проблема.
Проблема заключалась в том, что свойство HttpContext.Current.Request.CurrentExecutionFilePath давало другой результат в IIS 6 и IIS 7:
/Controller.mvc/Action/1/2
/Controller.mvc/Action/1/2
/Controller.mvc
В результате были получены URL-адреса для диаграмм, например:
/ Controller .mvc / Action / 1 / ChartImg.axd? i = chart _...
/ChartImg.axd?i=chart _...
ChartHttpHandler имеет функцию, которая вычисляет путь, основанный на HttpContext.Current.Request.CurrentExecutionFilePath:
private static string GetHandlerUrl()
{
string str = Path.GetDirectoryName(HttpContext.Current.Request.CurrentExecutionFilePath ?? "").Replace(@"\", "/");
if (!str.EndsWith("/", StringComparison.Ordinal))
{
str = str + "/";
}
return (str + "ChartImg.axd?");
}
То, как работало ASP.NET UrlRewriting, поскольку пути к ChartImg.axd все еще содержали .mvc, обработчик MVC вызывался вместо Обработчик графиков.
Мы нашли 3 способа справиться с этим (подробности см. Ниже):
(1). Оказывается, что если мы добавили карту сценария для .mvc через IIS 6.0 для .mvc Request.CurrentExecutionFilePath будет рассчитываться как корневой путь, как мы хотели, а не как более глубокий путь
(2) Мы обнаружили, что добавление некоторых записей в таблицу маршрутов будет работать, но мы должны были учитывать все возможные глубины в путях чтобы заставить ASP.NET MVC игнорировать ChartImg.axd, если он был глубоко встроен в путь, а не в корень:
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.IgnoreRoute("{a}/{resource}.axd/{*pathInfo}");
RouteTable.Routes.IgnoreRoute("{a}/{b}/{resource}.axd/{*pathInfo}");
RouteTable.Routes.IgnoreRoute("{a}/{b}/{c}/{resource}.axd/{*pathInfo}");
RouteTable.Routes.IgnoreRoute("{a}/{b}/{c}/{d}/{resource}.axd/{*pathInfo}");
(3) Путем переопределения Execute () на всех наших контроллерах путем создания базы Контроллер, от которого наследуются все наши контроллеры, мы могли бы глобально переопределить Execute () для учета этой ситуации и перенаправить на /ChartImg.axd
public partial class MyController: Controller
{
protected override void Execute(RequestContext cc)
{
// the url for chartimg.axd to be in the application root. /Controller.mvc/Action/Param1/ChartImg.axd gets here first,
// but we want it to go to /ChartImg.axd, in which case the IgnoreRoute does work and the chart http handler does it's thing.
if (cc.HttpContext.Request.Url.AbsoluteUri.Contains("ChartImg.axd"))
{
var url = new UriBuilder(cc.HttpContext.Request.Url);
url.Path = "/ChartImg.axd";
cc.HttpContext.Response.Redirect(url.ToString());
return;
}
}
}
Хотя решение @Michael информативно о том, почему существует эта проблема, есть более простое решение. При регистрации маршрутов в обработчике контроллеров в файле global.asax.cs вы можете добавить игнорируемый маршрут с ограничением, как показано ниже:
protected void Application_Start() {
...
RouteTable.Routes.Ignore("{*pathInfo}", new { pathInfo = @"^.*(ChartImg.axd)$" });
...
}