2010-04-13 16 views
6

के साथ काम नहीं कर रहा है। मैंने अभी .NET 4 में अपग्रेड किया है और मेरा एएसपी.NET चार्ट नियंत्रण अब प्रदर्शित नहीं होता है।एएसपी.NET चार्टिंग कंट्रोल अब .NET 4

.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 दृश्य नामक एक MVC क्षेत्र फ़ोल्डर में है कि में है, इसलिए यह स्पष्ट रूप से है जहां पथ का परिवर्तन आ रहा है।

मैंने जो कुछ किया है, वह सिस्टम.Web.DataVisualization असेंबली को 3.5 से 4.0 तक स्विच करना है।

किसी भी मदद की बहुत सराहना की।

उत्तर

1

अपने जवाब के लिए धन्यवाद, लेकिन मुझे नहीं लगता कि मेरा एक IIS6 था/आईआईएस 7 समस्या।

मैं तथ्य यह है कि एक ChartControl पर ImageStorageMode के लिए डिफ़ॉल्ट मान UseImageLocation से UseHttpHandler में बदल गया है करने के लिए यह पता लगाया। मेरे ChartControl में अब कुछ अतिरिक्त विशेषताएं हैं और सभी ठीक काम करते हैं।

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

मैं भी बदलने के लिए ImageLocation जब ChartControl 'में कुछ कोड-पीछे रों DataPoints से अधिक पुनरावृत्ति के रूप में है कि यह भी एक समस्या का कारण गैर रिश्तेदार (/Temp/ जोड़कर) होना ही था।

7

एएसपी.नेट एमवीसी के साथ एएसपी.NET 3.5 से एएसपी.NET 4.0 में अपग्रेड करने के बाद आईआईएस 6 पर हमें यही समस्या थी। आईआईएस 7 पर सब कुछ ठीक काम कर रहा था, लेकिन आईआईएस 6 ने हमें एक समस्या दी।

  • यूआरएल:: /Controller.mvc/Action/1/2
  • 6 IIS: /Controller.mvc/Action/1/2
  • IIS 7

    समस्या यह है कि HttpContext.Current.Request.CurrentExecutionFilePath संपत्ति आईआईएस 6 और आईआईएस 7 में एक अलग परिणाम दे दी थी: /Controller.mvc

कौन सा तरह चार्ट के लिए Urls में हुई:

+०१२३५१६४१०
  • 6 IIS: /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?"); 
} 

जिस तरह से एएसपी.NET UrlRewriting काम कर रहा था, चूंकि चार्ट Img.axd के पथों में अभी भी एमएमसी था, एमवीसी हैंडलर चार्ट हैंडलर के बजाय बुलाया जा रहा था।

  1. ASP.NET 4.0 dll करने के लिए ".mvc" के लिए एक स्पष्ट स्क्रिप्ट मानचित्र जोड़ें
  2. कुछ अतिरिक्त जोड़ें:

    वहाँ 3 तरीके हम इससे निपटने के लिए मिल गया (विवरण के लिए नीचे देखें) थे मार्ग तालिका के लिए मार्गों क्रमपरिवर्तन कवर करने के लिए उपेक्षा

  3. निष्पादित ओवरराइड
  4. () नियंत्रक की और वापस /ChartImg.axd को

एक रीडायरेक्ट में डाल

(1) यह पता चला है कि अगर हमने .mvc के लिए .mvc के लिए .mvc के लिए .mvc के लिए एक स्क्रिप्ट मैप जोड़ा है।> होम निर्देशिका - - हम इसे कैसे बजाय गहरी पथ के रूप में

  • गुण IIS 6.0 प्रबंधक की चाहता था CurrentExecutionFilePath रूट पथ के रूप में गणना जायेगा> विन्यास
  • मैपिंग टैब
  • निष्पादन: c: \ winnt \ microsoft.net \ ढांचे \ v4.0.30319 \ aspnet_isapi.dll, एक्सटेंशन: .mvc

(2) हमने पाया है कि विज्ञापन कुछ मार्ग तालिका प्रविष्टियों को डिंग करना काम करेगा, लेकिन हमें चार्ट Im.NET एमवीसी को पथ Img.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) एक आधार नियंत्रक कि हमारे सभी नियंत्रकों से विरासत बनाकर निष्पादित() हमारे सभी नियंत्रकों पर अधिभावी करके, हम विश्व स्तर पर() इस स्थिति के लिए खाते और/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

अतिरिक्त रूटटेबल। रूट्स। इग्नोर रूट ने हमारे लिए चाल बनाई। – badMonkey

18

जबकि @ माइकल का समाधान सूचनात्मक है कि क्यों समस्या मौजूद है, एक आसान समाधान है। जब आपके नियंत्रकों में मार्गों दर्ज की global.asax.cs में संभाल, आप इस प्रकार, एक contstraint के साथ एक पर ध्यान नहीं दिया मार्ग जोड़ सकते हैं:

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

माइकल फेरेंटे का जवाब उत्कृष्ट है - लेकिन मैं इस समाधान को पर्याप्त रूप से वोट नहीं दे सकता ... चीयर्स केविन –