2010-04-13 5 views
6

Ich habe gerade auf .NET 4 aktualisiert und mein ASP.NET Chart Control wird nicht mehr angezeigt.ASP.NET Chart Control funktioniert nicht mehr mit .NET 4

Für .NET 3.5, die HTML von der Steuerung erzeugt verwendet wie folgt aussehen:

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

und jetzt, für .NET 4, sieht es wie folgt aus (beachten Sie die Änderung im Quellpfad):

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

Die Grafik ist in einer MVC-Teilansicht, die in einem MVC-Gebiet Ordnern namens „Statistik“ und eine MVC Ordner Ansichten „Zusammenfassung“ (dh „/ Regionen/Statistik/Ansichten/Summary“) genannt wird, so Dies ist offensichtlich, wo die Veränderung des Pfades herkommt.

Alles, was ich getan habe, ist die System.Web.DataVisualization Assembly von 3,5 bis 4,0 zu wechseln.

Jede Hilfe sehr geschätzt.

Antwort

1

Vielen Dank für Ihre Antworten, aber ich glaube nicht, mine IIS6 war/IIS7-Problem.

Ich verfolgte sie auf die Tatsache, dass der Standardwert für ImageStorageMode auf einem ChartControlUseImageLocation-UseHttpHandler geändert hat. Mein ChartControl hat jetzt einige zusätzliche Attribute und alles funktioniert gut.

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

Ich hatte auch die ImageLocation zu ändern Nicht-Verhältnis zu sein (durch /Temp/ Zugabe), wie das auch ein Problem verursacht wird, wenn über die ChartControl ‚s DataPoints in einigen Code-Behind-Iteration.

7

Wir hatten das gleiche Problem auf IIS 6 nach dem Upgrade von ASP.NET 3.5 auf ASP.NET 4.0 mit ASP.NET MVC. Alles funktionierte auf IIS 7 gut, aber IIS 6 gab uns ein Problem.

Das Problem war, dass die HttpContext.Current.Request.CurrentExecutionFilePath Eigenschaft ein anderes Ergebnis in IIS gab 6 und IIS 7:

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

die in Urls für die Charts wie Folge:

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

Die ChartHttpHandler eine Funktion da drin hat, dass der Pfad der HttpContext.Current.Request.CurrentExecutionFilePath berechnet basierend off:

private static string GetHandlerUrl() 
{ 
    string str = Path.GetDirectoryName(HttpContext.Current.Request.CurrentExecutionFilePath ?? "").Replace(@"\", "/"); 
    if (!str.EndsWith("/", StringComparison.Ordinal)) 
    { 
     str = str + "/"; 
    } 
    return (str + "ChartImg.axd?"); 
} 

Die Art, wie das ASP.NET-UrlRewriting funktionierte, da die Pfade zu ChartImg.axd immer noch .mvc enthielten, wurde anstelle des Chart-Handlers der MVC-Handler aufgerufen.

gab es 3 Möglichkeiten, wie wir gefunden, damit umzugehen (siehe unten):

  1. eine explizite Skriptzuordnung hinzufügen Für „.mvc“ der ASP.NET 4.0 dll
  2. einige zusätzliche hinzufügen ignorieren Routen der Routentabelle zu decken Permutationen
  3. die() des Controllers ausführen außer Kraft setzen und in eine Umleitung setzen zurück zu /ChartImg.axd

(1) Stellt sich heraus, dass, wenn wir eine Skriptzuordnung für .mvc über IIS 6.0 für .mvc die Anforderung hinzugefügt.CurrentExecutionFilePath würde als Root-Pfad berechnet bekommen, wie wir es statt wollte als den tieferen Pfad

  • IIS 6.0-Manager
  • Eigenschaften -> Home-Verzeichnis -> Konfiguration
  • Mappings Registerkarte
  • Executable: c: \ winnt \ microsoft.net \ Framework \ v4.0.30319 \ aspnet_isapi.dll, Erweiterung: .mvc

(2) Wir, dass die Anzeige gefunden Einige Routing-Tabelleneinträge würden funktionieren, aber wir mussten alle möglichen Tiefen in den Pfaden berücksichtigen, damit ASP.NET MVC die Datei ChartImg.axd ignoriert, wenn sie tief im Pfad und nicht im Stamm eingebettet wäre:


(3) durch das Überschreiben der Execute() auf alle Steuerungen durch einen Basis-Controller machen, dass alle unsere Steuerungen von erben, könnten wir global überschreiben die() Führen Sie für diese Situation zu erklären und zu/ChartImg umleiten. 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

die zusätzliche RouteTable.Routes.IgnoreRoute hat den Trick für uns gemacht. – badMonkey

18

Während @ Michaels Lösung ist informativ, warum th Ist ein Problem vorhanden, gibt es eine einfachere Lösung. Wenn die Routen in Ihrem Controller Registrierung Griff in global.asax.cs, könnten Sie eine ignoriert Route mit einem contstraint hinzufügen, wie folgt:

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

Michael Ferrante's Antwort ist ausgezeichnet - aber ich kann diese Lösung nicht genug stimulieren ... Prost Kevin –