2012-08-10 13 views
6

मेरे पास एक साधारण सरल ASP.MVC व्यू के साथ एक प्रदर्शन समस्या है।किसी पृष्ठ पर Url.Action पर पहला कॉल धीमा है

यह एक लॉग-ऑन पेज है जो लगभग तुरंत होना चाहिए, लेकिन इसमें लगभग आधा सेकंड लग रहा है।

बहुत खुदाई के बाद ऐसा लगता है कि समस्या पहली बार Url.Action पर कॉल करती है - यह लगभग 450ms (MiniProfiler के अनुसार) ले रही है लेकिन यह बहुत धीमी लगती है।

Url.Action पर आने वाली कॉल < 1ms ले रही हैं, जो कि मैं अपेक्षा करता हूं उससे अधिक है।

यह लगातार है कि मैं Url.Action("action", "controller") या Url.Action("action") का उपयोग करता हूं, लेकिन ऐसा नहीं लगता है कि अगर मैं Url.Content("~/controller/action") का उपयोग करता हूं। यह तब होता है जब मैं Html.BeginForm("action") पर कॉल करता हूं।

क्या किसी को यह पता है कि इसका क्या कारण है?

एक खुदाई source में पता चलता है कि RouteCollection.GetVirtualPath अपराधी हो सकता है, के रूप में है कि Url.Action और Html.BeginForm दोनों आम है। हालांकि, निश्चित रूप से इस जगह पर इस्तेमाल किया जाता है? मेरा मतलब है, ½ एक सेकंड बहुत धीमी है।

मेरे पास 20 या तो कस्टम मार्ग हैं (यह कुछ विरासत वेबफॉर्म पृष्ठों के साथ काफी बड़ा ऐप है) लेकिन फिर भी समय बहुत धीमा प्रतीत होता है।

कोई विचार इसे ठीक करने के लिए कैसे करें?

उत्तर

5

समस्या मिली, और यह रूटिंग टेबल (चीयर्स किरिल) के साथ है।

string[] controllers = GetListOfValidControllers(); 

routes.MapRoute(
    name: GetRouteName(), 
    url: subfolder + "/{controller}/{action}/{id}", 
    defaults: new { action = "Index", id = UrlParameter.Optional }, 
    constraints: new { controller = "(" + string.Join("|", controllers) + ")" }); 

ऐसा नहीं है कि the Regex check is very slow पता चला है, दर्दनाक धीमी:

असल में हम है कि कुछ इस तरह दिखाई मार्गों के बहुत सारे है। तो मैंने इसे IRouteConstraint के कार्यान्वयन के साथ बदल दिया जो इसके बजाय HashSet के खिलाफ बस जांचता है।

routes.IgnoreRoute(
    url: "{*allaspx}", 
    constraints: new { allaspx = new RegexConstraint(@".*\.as[pmh]x(/.*)?") }); 
: - इस तरह कॉल के बहुत सारे सहित (क्योंकि हम विरासत वेबफ़ॉर्म पृष्ठों है)

routes.MapRoute(
    name: GetRouteName(), 
    url: subfolder + "/{controller}/{action}/{id}", 
    defaults: new { action = "Index", id = UrlParameter.Optional }, 
    constraints: new { controller = new HashSetConstraint(controllers) }); 

मैं भी कुछ भी और अधिक जटिल के लिए RegexConstraint mentioned in that linked article प्रयोग किया है:

तब मैं मानचित्र मार्ग कॉल बदल

वे दो सरल परिवर्तन पूरी तरह से समस्या को ठीक करते हैं; Url.Action और Html.BeginForm अब एक नगण्य समय लें (यहां तक ​​कि बहुत से मार्गों के साथ)।

1

ऐसा लगता है कि आपकी समस्या विचारों को संकलित कर रही है। आपको निर्माण पर विचारों को प्रीकंपाइल करने की आवश्यकता है और यह समस्या चली जाएगी। details here

+0

यह दृश्यों को पूर्ववत नहीं करता है, जो कि निर्माण के बाद उन्हें संकलित करता है ताकि आपको रन टाइम त्रुटियों के बजाय बिल्ड त्रुटियां मिलें। इसके अलावा इससे कोई फर्क नहीं पड़ता - मैं अभी भी पहले 'Url.Action' कॉल पर 450ms या तो देख रहा हूं। – Keith

+0

ASPNet_Compiler.exe के साथ उचित प्रीकंपिलेशन संभव है (http://msdn.microsoft.com/en-us/library/ms229863(v=vs.80).aspx देखें) लेकिन इसके बिना भी समय मैं ' यूआरएल।एक्शन 'पागल हैं - यह लगभग हर बार पृष्ठ चलने पर नियंत्रक कार्यों को खोजने के लिए पूर्ण प्रतिबिंब कर रहा है। – Keith

+0

क्या आप अपने रजिस्टर रूट्स (global.asax से) दिखा सकते हैं? यह आपके समय पर लाभ उठा सकता है। –

1
public class RegexConstraint : IRouteConstraint, IEquatable<RegexConstraint> 
    { 
    Regex regex; 
    string pattern; 

    public RegexConstraint(string pattern, RegexOptions options = RegexOptions.CultureInvariant | RegexOptions.Compiled | RegexOptions.IgnoreCase) 
    { 
     regex = new Regex(pattern, options); 
     this.pattern = pattern; 
    } 

    public bool Match(System.Web.HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     object val; 
     values.TryGetValue(parameterName, out val); 
     string input = Convert.ToString(val, CultureInfo.InvariantCulture); 
     return regex.IsMatch(input); 
    } 

    public string Pattern 
    { 
     get 
     { 
      return pattern; 
     } 
    } 

    public RegexOptions RegexOptions 
    { 
     get 
     { 
      return regex.Options; 
     } 
    } 

    private string Key 
    { 
     get 
     { 
      return regex.Options.ToString() + " | " + pattern; 
     } 
    } 

    public override int GetHashCode() 
    { 
     return Key.GetHashCode(); 
    } 

    public override bool Equals(object obj) 
    { 
     var other = obj as RegexConstraint; 
     if (other == null) return false; 
     return Key == other.Key; 
    } 

    public bool Equals(RegexConstraint other) 
    { 
     return this.Equals((object)other); 
    } 

    public override string ToString() 
    { 
     return "RegexConstraint (" + Pattern + ")"; 
    } 
} 
+0

यह एक और उपयोगी कार्यान्वयन है, मैं http://samsaffron.com/archive/2011/10/13/optimising-asp-net-mvc3- रूटिंग से एक का उपयोग कर रहा था – Keith

संबंधित मुद्दे