2010-04-13 5 views
6

방금 ​​.NET 4로 업그레이드했고 ASP.NET 차트 컨트롤이 더 이상 표시되지 않습니다. .NET 3.5ASP.NET 차트 컨트롤이 .NET 4에서 더 이상 작동하지 않습니다.

는, 컨트롤에 의해 생성 된 HTML은 다음과 같이하는 데 사용 : .NET 4,

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

와 지금, 그것은 (소스 경로의 변화를주의) 다음과 같습니다 :

<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 지역 폴더에있는 MVC 부분보기에 이것은 분명히 경로의 변화가 어디서 오는지입니다.

내가 한 모든 작업은 System.Web.DataVisualization 어셈블리를 3.5에서 4.0으로 전환하는 것입니다.

도움을 주시면 감사하겠습니다.

답변

1

감사합니다,하지만 난 광산은 IIS6 생각하지 않습니다/IIS7 문제.

ChartControl에있는 ImageStorageMode의 기본값이 UseImageLocation에서 UseHttpHandler으로 변경되었습니다. 내 ChartControl에는 이제 몇 가지 추가 속성이 있으며 모두 정상적으로 작동합니다.

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

나는 또한 ChartControlDataPoints 일부 코드 숨김에서 반복 할 때 그 또한 문제의 원인으로 ImageLocation이 ( /Temp/을 추가하여)이 아닌 상대적으로 변경했다.

7

ASP.NET 3.5에서 ASP.NET MVC로 ASP.NET 4.0으로 업그레이드 한 후 IIS 6에서 이와 동일한 문제가 발생했습니다. IIS 7에서는 모든 것이 잘 작동했지만 IIS 6에서는 문제가 발생했습니다.

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

    문제는 HttpContext.Current.Request.CurrentExecutionFilePath 속성 IIS 6 IIS 7에서 다른 결과를 주었다이었다

    : 같은 차트의 URL 결과 /Controller.mvc

617,451,515,

  • 6 IIS : /Controller.mvc/Action/1/ChartImg.axd?i=chart_...
  • 7 IIS : /ChartImg.axd?i=chart_... 오프 HttpContext.Current.Request.CurrentExecutionFilePath 기초하여 경로를 계산 ChartHttpHandler가있는 기능을 가지고있다

:

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

ChartImg.axd에 대한 경로가 여전히 .mvc로되어 있기 때문에 ASP.NET UrlRewriting이 작동하는 방식으로 MVC 처리기가 Chart 처리기 대신 호출되었습니다.

  • 이 몇 가지 추가 추가

    1. 는 ASP.NET 4.0 DLL에 ".mvc"에 대한 명시 적 스크립트 맵을 추가

      우리가 그것을 처리하는 것으로 3 가지 방법 (자세한 내용은 아래 참조)이 있었다 (

    2. 가 실행을 무시
    3. 순열을 덮 경로 테이블에 경로를 무시) 컨트롤러 및

    /ChartImg.axd 다시 리디렉션 넣어

    (1) IIS 6.0을 통해 .mvc에 대한 스크립트 맵을 .mvc 요청에 추가하면이 점을 알 수 있습니다.> 홈 디렉토리 - - 우리가 대신

    • 6.0 관리자에게
    • 속성 IIS 깊은 경로로의 그것을 원하는 방법 CurrentExecutionFilePath는 루트 경로로 계산 얻을 것이다> 구성
    • 매핑 탭
    • 실행 파일 : C를 : \ WINNT \ microsoft.net \ 프레임 워크 \ v4.0.30319 \ aspnet_isapi.dll을, 확장 : .mvc

    (2) 우리는 그 광고를 발견

    일부 경로 테이블 엔트리가 작동 할 수도 있지만 경로에서 가능한 모든 깊이를 고려해야 만 ChartImg.axd가 루트가 아닌 경로에 깊이 삽입 된 경우 ASP.NET MVC가 무시하도록 할 수 있습니다.

    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}"); 
    
    (가) 우리의 모든 컨트롤러에서 상속 기본 컨트롤러를함으로써 우리의 모든 컨트롤러에() 실행 오버라이드 (override)

    (3), 우리는 전 세계적으로이 (가)이 상황을 설명 및/ChartImg로 리디렉션 실행 오버라이드 (override) 할 수있다. 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

    추가 RouteTable.Routes.IgnoreRoute가 우리를 속였습니다. – badMonkey

    18

    @ Michael의 해결책은 왜 th 문제가 존재하면 더 간단한 해결책이 있습니다. 당신의 컨트롤러의 경로를 등록 global.asax.cs 취급 할 때, 다음과 같이는 contstraint과 무시 경로를 추가 할 수 있습니다 귀하의 답변

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

    Michael Ferrante의 대답은 훌륭합니다.하지만이 솔루션을 충분히 투표 할 수는 없습니다 ... 환호 케빈 –

    관련 문제