2011-02-18 7 views
5

मेरे पास वर्तमान में एक .net mvc3 एप्लिकेशन है जो एकाधिक स्थानों में समान विचारों को प्रबंधित करने के लिए ज़िम्मेदार है जो समान नियंत्रकों का उपयोग करते हैं जैसे site1/v1/views/index.cshtml और site1/v2/views/index.cshtmlएमवीसी रेजर ViewEngine थ्रेड-सुरक्षित नहीं है?

तरह से है कि यह नियंत्रित किया जाता है एक CustomControllerFactory कि DefaultControllerFactory से और CreateController विधि में विरासत में बनाने के द्वारा है, मौजूदा दृश्य इंजन स्पष्ट और है कि मौजूदा यूआरएल पर आधारित दृश्य स्थान स्वरूपों निर्दिष्ट करता है एक नए कस्टम viewEngine जोड़ें।

site1.com/v1/index.cshtml पर उपयोगकर्ता भूमि, viewengine को देखते स्थानों निर्दिष्ट करेगा हैं:

string versionDirectory = "v1"; 
ViewLocationFormats = new[]{ versionDirectory + "/Views/{0}.cshtml", 
          "/Views/{0}.cshtml", 
          "~/Shared/{0}.cshtml" 
          }; 

समस्या यह है कि मैं कर रहा हूँ यह है कि एक से अधिक उपयोगकर्ता एक ही समय में मोटे तौर पर विभिन्न पृष्ठों पर लैंड करता है, तो सभी उपयोगकर्ताओं एक ही दृश्य देखेंगे।

Initially i thought this was related to caching, लेकिन स्पष्ट रूप से कस्टम viewEngine में usecache = false सेट करने के बाद, ऐसा लगता है इस ViewEngines class not being thread safe के साथ क्या करना अधिक मिल गया है लगता है।

क्या किसी के पास कोई भी विचार है कि मैं एक ही परिणाम कैसे पूरा कर सकता हूं, लेकिन एक अलग तरीके से? पहले से

धन्यवाद।

+0

यकीन नहीं तुम ऐसा कैसे कर रहे हैं, लेकिन सभी अनुरोधों को भर में किसी भी स्थिर वस्तुओं साझा कर रहे हैं - जो आपकी समस्या से संबंधित हो सकती ... – Buildstarted

उत्तर

9

व्यूइंजिन संग्रह एक स्थिर संग्रह है और इस प्रकार इसके मूल्य अनुरोधों पर साझा किए जाते हैं। आप जो करने का प्रयास कर रहे हैं वह संभव है, लेकिन जिस तरह से आप इसे कर रहे हैं वह सही नहीं है।

एक आसान दृष्टिकोण एक कस्टम व्यू इंजन लिखना है जो RazorViewEngine से प्राप्त होता है और FindView विधि को ओवरराइड करता है। प्रति विधि एक बार कहा जाता है कि विधि। अपने कार्यान्वयन में, कॉल बेस। ढूँढें और फिर आपको आवश्यक साइट जानकारी को शामिल करने के लिए परिणाम (यदि यह शून्य नहीं है) को संशोधित करें।

स्कॉट हैनसेलमैन का एक ब्लॉग पोस्ट है जो एक कस्टम व्यू इंजन के माध्यम से विचारों के लिए किसी अन्य स्थान को देखने का एक उदाहरण दिखाता है। http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

+0

धन्यवाद! यह काम करता है – kfegen

+0

FYI करें कि पोस्ट में स्रोत यह करने में एक प्रमुख उत्पादन बग है, वहाँ पर उनके विचार इंजन के एक अद्यतन संस्करण है: https://bitbucket.org/shanselman/mobileviewengines/src/48310997a453/Helpers/MobileCapableRazorViewEngine.cs परवाह किए बिना मूल पोस्ट और नई कड़ी मैं प्रदान की मुझे समझ नहीं यह स्थिर था के रूप में अनुरोध scoped है कि मैं गलती से सोचा http करने का विरोध किया base.ViewLocationFormats संग्रह संशोधित करने के लिए मेरे गरीब विकल्प को सुलझाने के लिए महत्वपूर्ण थे। –

1

निर्मित दृश्य इंजन धागा सुरक्षित हैं। आपकी समस्या कैशिंग या आपका कस्टम व्यू-इंजन है। दूसरे उत्तर में लिंक में कैशिंग टिप्पणियों की जांच करें।

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