ASP.NET Строя диаграмму Управления, больше не работающего с.NET 4

Я только что обновил до.NET 4, и мое Управление Диаграммой ASP.NET больше не отображается.

Для.NET 3.5, HTML, произведенный управлением раньше, был похож на это:

<img id="20_Chart" src="/ChartImg.axd?i=chart_5f6a8fd179a246a5a0f4f44fcd7d5e03_0.png&amp;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&amp;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.

Любая справка значительно ценится.

6
задан Oundless 13 April 2010 в 17:05
поделиться

2 ответа

У нас была такая же проблема в 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:

  • URL: /Controller.mvc/Action/1/2
  • IIS 6 : /Controller.mvc/Action/1/2
  • IIS 7: /Controller.mvc

В результате были получены URL-адреса для диаграмм, например:

  • IIS 6: / Controller .mvc / Action / 1 / ChartImg.axd? i = chart _...
  • IIS 7: /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" в dll ASP.NET 4.0
  2. Добавить некоторые дополнительные маршруты игнорирования в таблица маршрутов для покрытия перестановок
  3. Переопределите Execute () контроллера и поместите перенаправление обратно на /ChartImg.axd

(1). Оказывается, что если мы добавили карту сценария для .mvc через IIS 6.0 для .mvc Request.CurrentExecutionFilePath будет рассчитываться как корневой путь, как мы хотели, а не как более глубокий путь

  • Диспетчер IIS 6.0
  • Свойства -> Домашний каталог -> Конфигурация
  • Вкладка сопоставлений
  • Исполняемый файл: c: \ winnt \ microsoft.net \ framework \ v4.0.30319 \ aspnet_isapi.dll, Extension: .mvc

(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;
           }
       }
    }
8
ответ дан 8 December 2019 в 03:38
поделиться

Хотя решение @Michael информативно о том, почему существует эта проблема, есть более простое решение. При регистрации маршрутов в обработчике контроллеров в файле global.asax.cs вы можете добавить игнорируемый маршрут с ограничением, как показано ниже:

protected void Application_Start() {
    ...
    RouteTable.Routes.Ignore("{*pathInfo}", new { pathInfo = @"^.*(ChartImg.axd)$" });
    ...
}
18
ответ дан 8 December 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: