2010-04-13 26 views
6

Acabo de actualizar a .NET 4 y mi ASP.NET Chart Control ya no se muestra.ASP.NET Charting Control ya no funciona con .NET 4

para .NET 3.5, el HTML producido por el control utilizado para tener este aspecto:

<img id="20_Chart" src="/ChartImg.axd?i=chart_5f6a8fd179a246a5a0f4f44fcd7d5e03_0.png&amp;g=16eb7881335e47dcba16fdfd8339ba1a" alt="" style="height:300px;width:300px;border-width:0px;" /> 

y ahora, para .NET 4, se ve así (tenga en cuenta el cambio en la ruta de origen):

<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;" /> 

el gráfico está en una vista parcial MVC que está en una carpeta de MVC zona llamada "Estadísticas" y un MVC Vistas carpeta llamada "Resumen" (es decir, "/ áreas/Estadísticas/Vistas/resumen"), por lo esto es, obviamente, de donde viene el cambio de camino.

Todo lo que he hecho es cambiar el ensamblado System.Web.DataVisualization de 3.5 a 4.0.

Cualquier ayuda muy apreciada.

Respuesta

1

Gracias por sus respuestas, pero no creo que el mío era un IIS6/Problema IIS7.

tracé al hecho de que el valor predeterminado para ImageStorageMode en un ChartControl ha cambiado de UseImageLocation a UseHttpHandler. Mi ChartControl ahora tiene algunos atributos adicionales y todo funciona bien.

<asp:Chart ... ImageStorageMode="UseImageLocation" ImageLocation="/Temp/ChartPic_#SEQ(300,3)"> 

que tenía que cambiar también la ImageLocation a ser no pariente (añadiendo /Temp/) como que también causó un problema cuando la iteración en la ChartControl 's DataPoints de alguna de código subyacente.

7

Tuvimos este mismo problema en IIS 6 después de actualizar de ASP.NET 3.5 a ASP.NET 4.0 con ASP.NET MVC. Todo funcionaba bien en IIS 7, pero IIS 6 nos dio un problema.

El problema era que la propiedad HttpContext.Current.Request.CurrentExecutionFilePath dio un resultado diferente en IIS 6 y IIS 7:

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

que dio lugar a las URL de los gráficos como:

  • IIS 6: /Controller.mvc/Action/1/ChartImg.axd?i=chart_...
  • IIS 7: /ChartImg.axd?i=chart_...

El ChartHttpHandler tiene una función en la que hay que calcula la ruta con sede fuera del 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?"); 
} 

La forma en que funcionaba la UrlRewriting de ASP.NET, ya que las rutas a ChartImg.axd todavía tenían .mvc en ellas, el manejador de MVC se invocaba en lugar del manejador de gráfico.

había 3 maneras que encontramos para tratar con él (ver más abajo para más detalles):

  1. Añadir un mapa de la escritura explícita para ".mvc" al ASP.NET 4.0 DLL
  2. Agregue un poco adicional ignorar rutas a la tabla de rutas para cubrir permutaciones
  3. anular el Ejecutar() del controlador y poner en una redirección de nuevo a /ChartImg.axd

(1) Resulta que si agregamos un mapa de script para .mvc a través de IIS 6.0 para .mvc, la Solicitud.CurrentExecutionFilePath conseguiría calculado como la ruta de raíz lo que queríamos en lugar de como el camino más profundo

  • Administrador de IIS 6.0
  • Propiedades -> Directorio Inicio -> Configuración
  • Asignaciones pestaña
  • ejecutable: C: \ WINNT \ microsoft.net \ Framework \ v4.0.30319 \ aspnet_isapi.dll, Extensión: .mvc

(2) Se encontró que el anuncio Algunas entradas de la tabla de rutas funcionarían, pero tuvimos que dar cuenta de todas las profundidades posibles en las rutas para que ASP.NET MVC ignorase el ChartImg.axd si estaba profundamente incrustado en la ruta y no en la raíz:

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) reemplazando el Execute() en todos nuestros controladores haciendo un controlador de base que todos nuestros controladores heredan de, podríamos globalmente anular el Execute() para dar cuenta de esta situación y redirigir a/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; 
      } 
     } 
    } 
+1

el RouteTable.Routes.IgnoreRoute adicional hizo el truco para nosotros. – badMonkey

18

Mientras que la solución de @Michael es informativa sobre por qué th existe un problema, hay una solución más simple. Al registrar las rutas en los controladores de manejar en global.asax.cs, se podría añadir una ruta ignorada con un contstraint, de la siguiente manera:

protected void Application_Start() { 
    ... 
    RouteTable.Routes.Ignore("{*pathInfo}", new { pathInfo = @"^.*(ChartImg.axd)$" }); 
    ... 
} 
+1

La respuesta de Michael Ferrante es excelente, pero no puedo votar esta solución lo suficiente ... aplaude a Kevin –

Cuestiones relacionadas