سؤال

حاولت جوجل هذا وظهرت قصيرة قليلا، لذلك ربما يمكن لشخص ما أن يلقي بعض الضوء على الموضوع.

لأغراض إعادة كتابة URL في ASP.NET، أود أن أعلن جميع الصور وغيرها من الموارد في طلبي باستخدام سمة RunAT = "Server" للاستفادة من بناء جملة مسار خادم "~ / الصور". يصعب تصحيح الأخطاء على Locahost بشكل خاص عند استخدام المسارات النسبية (عند استخدام إعادة كتابة URL). أعلم أنني أستطيع تعديل الملفات المضيفة إلى التغلب على هذه المشكلة إلى حد ما، ولكن هذا غير ممكن بسبب حجم المشاريع التي نعمل عليها.

تعلن عناصر تحكم HTML إلى خادم RunAT عادة ما تضيف عادة إلى العارض لتمكين استمرار البيانات، ولكن هذا لن يكون ذا صلة بالصور، أو أنا مخطئ فيما يتعلق بهذا ...؟

أدرك أيضا أن هناك مزيدا من الضوابط لمحرك وقت تشغيل ASP للوقاية والتعامل معها، ولكن هل هذا حقا استنزاف أداء خطير ...؟

هل هناك نفقات جادة في إعلان الصور بهذه الطريقة، وإذا كان الأمر كذلك، فهل يمكن لشخص ما أن يفسر المكان الذي سيأتي فيه الجزء الأكبر من الأداء بالضبط.

شكرا لك مقدما.

هل كانت مفيدة؟

المحلول

على افتراض أنك تطلب الاختلافات بين:

1) <img runat="server" EnableViewState="false" src="~/images/img.png" />

و

2) <img src='<%= ResolveUrl ("~/images/img.png") %>' />

للبناء 1)، رمز الفعلي الذي تم إنشاؤه (أكثر أو أقل) هو:

System.Web.UI.HtmlControls.HtmlImage __ctrl;
__ctrl = new System.Web.UI.HtmlControls.HtmlImage();
this._bctrl_1 = __ctrl;
__ctrl.EnableViewState = false;
__ctrl.Src = "~/image.png";

ثم يتم إضافة __ctrl إلى شجرة التحكم:

__parser.AddParsedSubObject(this._bctrl_1); // _bctrl_1 is __ctrl from above

سيتم نشر أي حدث في دورة حياة الصفحة (INIT، LOAD ...) إلى عنصر التحكم هذا، وسيتم استدعاء RenderControl للحصول على HTML من IT، يتم استدعاء DELLIVEURL () للحصول على عنوان URL الفعلي، وأخيرا، التخلص () سيتم استدعاؤها أيضا.

الآن، في حالة 2)، لا تتم إضافة عنصر التحكم إلى والديه الطريقة العادية، ولكن بدلا من ذلك، تحصل على شيء مثل هذا:

__ctrl.SetRenderMethodDelegate(new System.Web.UI.RenderMethod(this.__RenderTree));

وهو ما يطرح مندوبا سيتم استدعاؤه عند وقته وقت تقديمu003Cimg> وبعد في __Rendertree الجزء الذي يكتب العلامة التي نهمها هي:

__output.Write("\n<img src='");
__output.Write( ResolveUrl ("~/image.png") );
__output.Write("' />\n");

لذلك، نعم، هناك "الكثير" من التعليمات البرمجية التي يتم تشغيلها في 1) التي لا تعمل في 2). الآن، فيما يتعلق بالتأثير في وقت التنفيذ الفعلي، أعتقد أن هذا ليس كبيرا من الصفقة. لقد اختبرت صفحة فارغة مع أي شيء سوى علامة / عنصر تحكم IMG والفرق بينهما في عدة أشواط في حدود -0.5ms / + 0.5ms لكل طلب. لا يذكر تماما.

نصائح أخرى

هناك مهم نسبيا حتى الآن على افتراض أنك قمت بإيقاف تشغيل جميع ViewState Marlarky. ومع ذلك مطلق من المحتمل أن تكون التكلفة غير مستقرة للمستخدم الفردي.

النظر في ارتباط يصف سلسلة من عناصر HTML، يتم التعامل معها ك "عنصر تحكم حرفي بسيط" الذي يرسل بكفاءة عالية للغاية إلى الاستجابة في النقطة المناسبة في تقدم الصفحة.

قارن ذلك بجميع العناصر نفسها التي يتم إنشاؤها كعناصر تحكم كاملة مع جميع إنشاء الكائنات وتحليل عنصر النمط والتحقق من الصحة وما إلى ذلك وإنشاء الحالة المحلية. ثم يتم تشغيل التعليمات البرمجية لاتخاذ الحالة المحلية وتقديمها إلى حد كبير نفس علامة HTML المستخدمة لتحديدها في صفحة ASP.NET في المقام الأول.

من الواضح من حيث الذاكرة و CPU باستخدام الكثير من RunAT = "Server" ستذهب إلى أكثر تكلفة. في حالة فردية، ربما تكون هذه ليست مشكلة ولكن بالنسبة للموقع بنشاط كبير، فقد يكون الأمر كذلك.

إذا كنت تقوم بتطوير تطبيق سيتم وضعه في بعض الدليل الظاهري في موقع أكبر، فاستخدم المسارات النسبية لصورك.

إذا كنت تقوم بتطوير تطبيق موجود في موقع خاص به، فعندئذ في مشروع أو خصائص الموقع تعديل المسار الظاهري في فئة Server Web Developer فقط "/". بهذه الطريقة عندما تصحيح الأخطاء ليس لديك اسم / myProjectName / جزء في عنوان URL. سيتيح لك ذلك استخدام مسار مطلق لبعض الأصول أو مجلد الصور.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top