روابط سريعة
واحدة من الميزات الرائعة العديدة لأطر العمل مثل بليزر وASP.NET (الذي يعمل عليه) هو القدرة على تقديم محتوى ديناميكي عند أي نقطة نهاية يحتاجها تطبيقك. إذا كنت ترغب في تقديم تنزيلات للملفات التي تم إنشاؤها، فمن السهل القيام بذلك من خلال القليل من التكوين.
لماذا تخدم الملفات الديناميكية؟
في الأساس، لديك خياران كخادم ويب: الرد على طلب بمحتوى ثابت، مثل صفحة HTML أو ملف JPG، أو إنشاء استجابة مخصصة لإرسالها إلى المستخدم. بليزر يعمل على ASP.NET، وبالتالي فإن خادم HTTP المدمج يدعم مجموعة واسعة من الخيارات ويسمح بمرونة كبيرة.
على سبيل المثال، ربما تريد استضافة ملف JSON على
/images/pathname.json
. لا يجب أن يكون هذا ملفًا حرفيًا على القرص؛ يمكن للخادم تفسير هذا الطلب والرد بأي نوع من المحتوى، بما في ذلك شيء غير متوقع مثل ملف PNG. يمكنك الرد على هذا الطلب عن طريق جلب بعض النتائج من واجهة برمجة التطبيقات (API)، وإنشاء استجابة، وإرسال السلسلة مرة أخرى إلى المستخدم.
أو ربما ترغب في إنشاء الملف الفعلي بسرعة. على سبيل المثال، هناك العديد من مكتبات الرسومات المستخدمة لرسم صور مخصصة. يمكنك استخدام واحدة منها لإنشاء صورة والاستجابة لطلب المستخدم بالبيانات، وكلها في الذاكرة.
في الحالة الأخيرة، قد يكون من المنطقي تخزين الاستجابة مؤقتًا عن طريق حفظها على القرص والرد بملف حقيقي في معظم الأوقات. يمكن أن يكون هذا مفيدًا لأجيال الملفات كثيفة الاستخدام للموارد والتي لا تتغير كثيرًا.
إعداده
يعد تقديم مثل هذه الملفات أمرًا مضمنًا وسهل التنفيذ. سوف تحتاج إلى إنشاء صفحة Razor جديدة، وهذا ما بليزر يعمل على. يمكنك القيام بذلك عن طريق النقر بزر الماوس الأيمن في Visual Studio وتحديد Add > Razor Page.
يؤدي القيام بذلك إلى إنشاء ملفين مرتبطين ببعضهما البعض في التسلسل الهرمي:
Name.cshtml
، الذي يتعامل مع جانب HTML للأشياء، و
Name.cshtml.cs
، الذي يتعامل مع النموذج والكود الفعلي. نظرًا لأن هذه لن تكون صفحة ويب فعلية، بل مجرد ملف، فيمكنك تجاهل الصفحة الأولى في أغلب الأحيان.
ومع ذلك، سوف تحتاج إلى تعيين
@page
السمة لمطابقة المكان الذي تريد استضافة هذا الملف فيه. ربما تريد تضمين بعض أحرف البدل، والتي تفعلها باستخدام الأقواس.
في
Name.cshtml.cs
الملف، سترى بعض التعليمات البرمجية الفعلية الممتدة
PageModel
. الوظيفة الرئيسية هنا هي
OnGet()
، والذي ربما تريد التغيير إليه OnGetAsync() إذا كنت تقوم بأي معالجة غير متزامنة.
لديك ثلاثة خيارات رئيسية من هذه الوظيفة. أولاً، يتم إرجاع ملف PhysicalFile، الذي يقرأ حرفيًا الملف الموجود على القرص المحدد بمسار، ويرسله إلى المستخدم بنوع، اختياريًا باسم تنزيل منفصل عن المسار الفعلي.
على الرغم من أنك هنا على الأرجح لإنشاء شيء ما ديناميكيًا، إلا أن هذا قد يكون مفيدًا جدًا للتخزين المؤقت. إذا كانت لديك وظيفة المعالجة الخاصة بك لحفظ النتيجة في ملف، فيمكنك التحقق من وجود هذا الملف قبل معالجته مرة أخرى، وإذا كان موجودًا، فما عليك سوى إرجاع الاستجابة المخزنة مؤقتًا.
الخيار التالي هو إرجاع ملف افتراضي، مع إعطاء مصفوفة بايت. هذا هو ما تريد استخدامه في معظم التطبيقات، لأنه يعمل بالكامل في الذاكرة وينبغي أن يكون سريعًا جدًا.
اعتمادًا على التشفير الذي تحاول استخدامه، قد ترغب في تحويل سلسلة إلى مصفوفة بايت باستخدام التابع
Encoding
فئة مساعد.
Encoding.UTF8.GetBytes(string);
وأخيرًا، يمكنك إرجاع سلسلة محتوى مباشرة، وهو ما يجب عليك استخدامه إذا كنت تريد عرض المحتوى للمستخدم بدلاً من تشغيل التنزيل في متصفحه.
هناك خيارات أخرى غير هذه الثلاثة، لكن الباقي يتضمن الرد باستخدام رموز الحالة، وإعادة التوجيه، والاستجابات غير المصرح بها، وعرض الصفحة نفسها.
خدمة الملفات بناءً على المسارات والمعلمات
بالطبع، لا شيء من هذا مفيد إذا لم تتمكن من الاستجابة للطلبات بناءً على مدخلات المستخدم. يوجد كلا النموذجين من الإدخال في عنوان URL: معلمات التوجيه ومعلمات عنوان URL. معلمات التوجيه هي ما حددته باستخدام أحرف البدل في الصفحة نفسها، وهي المسار الفعلي للملف. معلمات URL اختيارية.
يمكن أن يكون اكتشاف ذلك أمرًا مؤلمًا بعض الشيء، ولكن لحسن الحظ لديك مصحح أخطاء بجانبك، حتى تتمكن من تعيين نقطة توقف في OnGetAsync() وعرض شجرة المتغيرات المحلية بأكملها.
ستجد، تحت this.PageContext.RouteData، هناك RouteValueDictionary الذي يخزن جميع الطرق. لاحظ أن هذا يتضمن مسار الصفحة نفسه، لذلك إذا استخدمته /Download/{param} كمسار، ستكون المعلمة هي الخيار الثاني.
أفضل طريقة لجلب المعلمات هي البحث عنها بواسطة المفتاح:
وبالمثل، تتوفر أيضًا معلمات الاستعلام، ولكن من كائن مختلف. سوف تحتاج إلى الوصول HttpContext.Request.Query، وهو أ QueryValueDictionary يحتوي على معلمات URL، ويعمل بنفس طريقة المسار الأول.
أنت بعد ذلك حر في استخدام هذه المعلمات لإجراء عمليات البحث أو التأثير على المنطق. ومع ذلك، إذا كنت تقوم بتخزين الاستجابات مؤقتًا، فستحتاج إلى التأكد من أن ظروف ذاكرة التخزين المؤقت وعمليات البحث الخاصة بك تتأثر بهذه المعلمات أيضًا، وإلا فقد تواجه مشكلات تتعلق بسلوكيات التخزين المؤقت غير المتوقعة.
(علامات للترجمة) البرمجة (ر) Microsoft