ابدأ باستخدام خدمات Azure السحابية (الكلاسيكية) وASP.NET

نظرة عامة

هام

تم الآن إهمال Cloud Services (كلاسيكي) للعملاء الجدد وسيتم استبعادها في 31 أغسطس 2024 لجميع العملاء. ينبغي أن تستخدم عمليات النشر الجديدة نموذج النشر الجديد القائم على Azure Resource Manager ‏‏Azure Cloud Services (الدعم الموسع).

يوضح لك هذا البرنامج التعليمي كيفية إنشاء تطبيق .NET متعدد المستويات مع واجهة أمامية ASP.NET Model-View-Controller (MVC) ونشره في خدمة سحابة Azure. يستخدم التطبيق Azure SQL Databaseوخدمة Azure Blobوخدمة Azure Queue. يمكنك تنزيل مشروع Visual Studio من معرض التعليمات البرمجية لشبكة مطوري Microsoft (MSDN).

يوضح البرنامج التعليمي كيفية بناء وتشغيل التطبيق محلياً، وكيفية نشره على Azure وتشغيله في السحابة، وكيفية بنائه من الصفر. يمكنك البدء بالبناء من الصفر ثم إجراء الاختبار وتوزيع الخطوات بعد ذلك إذا كنت تفضل ذلك.

تطبيق إعلانات Contoso

التطبيق هو لوحة نشرة إعلانية. يقوم المستخدمون بإنشاء إعلان عن طريق إدخال نص وتحميل صورة. يمكنهم رؤية قائمة بالإعلانات التي تحمل صوراً مصغرة، ويمكنهم رؤية الصورة كاملة الحجم عند تحديد إعلان لعرض التفاصيل.

صورة توضح قائمة الرسائل الإعلانية

يستخدم التطبيق نمط العمل الذي يركز على قائمة الانتظار لإيقاف تحميل العمل المكثف لوحدة المعالجة المركزية لإنشاء صور مصغرة لعملية الخلفية.

بنية بديلة: خدمة التطبيقات وWebJobs

يوضح هذا البرنامج التعليمي كيفية تشغيل كل من الواجهة الأمامية والخلفية في خدمة Azure السحابية. البديل هو تشغيل الواجهة الأمامية في خدمة تطبيقات Azure واستخدام ميزة WebJobs للواجهة الخلفية. للحصول على برنامج تعليمي يستخدم WebJobs، راجع بدء الاستخدام مع SDK WebJobs Azure. للحصول على معلومات حول كيفية اختيار الخدمات التي تناسب السيناريو الخاص بك، راجع مقارنة خدمة تطبيقات Azure والخدمات السحابية والأجهزة الظاهرية.

أهداف التعلم

  • كيفية تمكين الجهاز الخاص بك لتطوير Azure عن طريق تثبيت SDK Azure.
  • كيفية إنشاء مشروع الخدمة السحابية Visual Studio مع دور ويب MVC ASP.NET ودور عامل.
  • كيفية اختبار مشروع الخدمة السحابية محلياً، باستخدام المحاكي Azure Storage.
  • كيفية نشر مشروع سحابي إلى خدمة Azure السحابية واختباره باستخدام حساب تخزين Azure.
  • كيفية تحميل الملفات وتخزينها في خدمة Azure Blob.
  • كيفية استخدام خدمة Azure Queue للاتصال بين المستويات.

المتطلبات الأساسية

يفترض البرنامج التعليمي أنك تفهم المفاهيم الأساسية حول خدمات Azure السحابية مثل دور الويب ومصطلحات دور العامل. كما يفترض أنك تعرف كيفية العمل مع ASP.NET MVC أو مشاريع نماذج ويب في Visual Studio. يستخدم التطبيق نموذج MVC، ولكن معظم البرنامج التعليمي ينطبق أيضاً على نماذج ويب.

يمكنك تشغيل التطبيق محليا دون اشتراك Azure، ولكنك تحتاج إلى واحد لنشر التطبيق على السحابة. في حالة عدم امتلاك اشتراك بعد، يمكنك تفعيل مزايا المشترك MSDN أو الاشتراك في حساب مجاني.

تعليمات البرنامج التعليمي العمل مع أي من المنتجات التالية:

  • Visual Studio 2013
  • Visual Studio 2015
  • Visual Studio 2017
  • Visual Studio 2019

إذا لم يكن لديك أحدها، فقد يتم تثبيت Visual Studio تلقائياً عند تثبيت SDK Azure.

تصميم التطبيق

يخزن التطبيق الإعلانات في قاعدة بيانات SQL، باستخدام Entity Framework Code First لإنشاء الجداول والوصول إلى البيانات. بالنسبة لكل إعلان، تخزن قاعدة البيانات عنواني URL، أحدهما للصورة كاملة الحجم والآخر للصورة المصغرة.

هذه صورة لبطاقة إعلانية

عندما يقوم مستخدم بتحميل صورة، تخزن الواجهة الأمامية قيد التشغيل في دور ويب الصورة في نقطة Azure،كما تخزن معلومات الإعلان في قاعدة البيانات مع عنوان URL يشير إلى النقطة. في الوقت نفسه، فإنها تكتب رسالة إلى قائمة انتظار Azure. تقوم عملية الواجهة الخلفية قيد التشغيل في دور عامل باستطلاعات رأي قائمة الانتظار بشكل دوري بحثاً عن رسائل جديدة. عند ظهور رسالة جديدة، يقوم دور العامل بإنشاء صورة مصغرة لتلك الصورة وتحديث حقل قاعدة بيانات عنوان URL المصغر لهذا الإعلان. يوضح الرسم التخطيطي التالي كيفية تفاعل أجزاء التطبيق.

الرسم التخطيطي الذي يوضح كيفية تفاعل أجزاء التطبيق.

إعداد بيئة التطوير

للبدء، عليك إعداد بيئة التطوير الخاصة بك باستخدام Visual Studio وعدة تطوير البرامج من Azure.

إشعار

استناداً إلى عدد تبعيات عدة تطوير البرامج الموجودة بالفعل على جهازك، قد يستغرق تثبيت عدة تطوير البرامج وقتاً طويلاً، يتراوح بين عدة دقائق ونصف ساعة أو أكثر.

تنزيل وتشغيل الحل المكتمل

  1. قم بتنزيل الحل المكتمل وفك ضغطه.

  2. ابدأ تشغيل Visual Studio.

  3. من القائمة ملف اختر فتح مشروع، انتقل إلى حيث قمت بتحميل الحل، ثم افتح ملف الحل.

  4. لإنشاء الحل، اضغط على CTRL+SHIFT+B.

    بشكل افتراضي، يستعيد Visual Studio تلقائيا محتوى حزمة NuGet، والذي لم يتم تضمينه في ملف .zip . إذا لم تقم الحزم باستعادة، قم بتثبيتها يدوياً عن طريق الانتقال إلى مربع الحوار إدارة حزم NuGet للحل والنقر فوق الزر استعادة في أعلى اليمين.

  5. في "مستكشف الحلول"، تأكد من تحديد ContosoAdsCloudService كمشروع بدء التشغيل.

  6. إذا كنت تستخدم Visual Studio 2015 أو أعلى، قم بتغيير سلسلة الاتصال SQL Server في ملف تطبيق Web.configإلى مشروع ContosoAdsWeb وفي ملف ServiceConfiguration.Local.cscfg إلى مشروع ContosoAdsCloudService. في كل حالة، غيّر "(localdb)\v11.0" إلى "(localdb)\MSSQLLocalDB".

  7. لتشغيل التطبيق، اضغط على CTRL+F5.

    عند تشغيل مشروع خدمة سحابية محلياً، يستعديVisual Studio محاكي حساب Azure ومحاكي تخزينAzure تلقائياً. يستخدم محاكي الحساب موارد الكمبيوتر لمحاكاة دور الويب وبيئات دور العامل. يستخدم محاكي التخزين قاعدة بيانات LocalDB SQL Server Express لمحاكاة التخزين السحابي على Azure.

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

    هندسة إعلانات Contoso 1

  8. حدد Create an Ad.

  9. أدخل بعض بيانات الاختبار وحدد صورة .jpg لتحميلها، ثم حدد إنشاء.

    توضح الصورة إنشاء صفحة

    ينتقل التطبيق إلى صفحة الفهرس، ولكنه لا يعرض صورة مصغرة الإعلان الجديد لأن هذه المعالجة لم تحدث بعد.

  10. انتظر لحظة ثم قم بتحديث صفحة الفهرس لمشاهدة الصورة المصغرة.

    صفحة الفهرس

  11. حدد تفاصيل الإعلان لمشاهدة الصورة بالحجم الكامل.

    صفحة التفاصيل

لقد تم تشغيل التطبيق بالكامل على الكمبيوتر المحلي الخاص بك، مع عدم وجود اتصال إلى السحابة. يخزّن محاكي التخزين بيانات قائمة الانتظار والنقاط في قاعدة بيانات LocalDB SQL Server Express، كما يخزن التطبيق بيانات الإعلان في قاعدة بيانات LocalDB أخرى. أنشأ "رمز إطار عمل الكيان أولاً" تلقائياً قاعدة بيانات الإعلان في المرة الأولى التي حاول فيها تطبيق الويب الوصول إليها.

في القسم التالي، يمكنك تكوين الحل لاستخدام موارد سحابة Azure لقوائم الانتظار والكائنات الثنائية كبيرة الحجم وقاعدة بيانات التطبيق عند تشغيلها في السحابة. إذا أردت متابعة التشغيل محلياً ولكن باستخدام موارد التخزين وقاعدة البيانات السحابية، فيمكنك القيام بذلك. إنها مجرد مسألة إعداد سلسلة الاتصال، والتي ترى كيفية القيام بها.

نشر التطبيق على Azure

يمكنك القيام بالخطوات التالية لتشغيل التطبيق في السحابة:

  • أنشئ خدمة Azure السحابية.
  • إنشاء قاعدة بيانات في Azure SQL Database.
  • إنشاء حساب تخزين Azure.
  • تكوين الحل لاستخدام قاعدة البيانات الخاصة بك عند تشغيله في Azure.
  • تكوين الحل لاستخدام حساب التخزين Azure عند تشغيله في Azure.
  • توزيع المشروع إلى خدمة Azure السحابية.

أنشئ مشروع خدمة Azure السحابية

خدمة سحابة Azure هي البيئة التي يعمل فيها التطبيق.

  1. في المستعرض، افتح مدخل Azure.

  2. حدد Create a resource > Compute > Cloud Service.

  3. في مربع إدخال اسم نظام أسماء المجالات (DNS)، أدخل بادئة عنوان URL للخدمة السحابية.

    يجب أن يكون عنوان URL هذا فريداً. تتلقى رسالة خطأ إذا كانت البادئة التي تختارها قيد الاستخدام بالفعل.

  4. حدد مجموعة موارد جديدة للخدمة. حدد إنشاء جديد ثم اكتب اسما في مربع إدخال مجموعة الموارد، مثل CS_contososadsRG.

  5. حدد المنطقة التي تريد توزيع موردك فيها.

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

  6. حدد إنشاء.

    في الصورة التالية، يتم إنشاء خدمة سحابية باستخدام CSvccontosoads.cloudapp.net URL.

    صورة تعرض الخدمة السحابية الجديدة

إنشاء قاعدة بيانات في Azure SQL Database

عند تشغيل التطبيق في السحابة، فإنه يستخدم قاعدة بيانات مستندة إلى السحابة.

  1. في مدخل Microsoft Azure، حدد Create a resource > Databases > SQL Database.

  2. في المربع "اسم قاعدة البيانات"، أدخل contosoads.

  3. في مجموعة الموارد، اختر استخدام موجود وحدد مجموعة الموارد المستخدمة للخدمة السحابية.

  4. في الصورة التالية، حدد Server - Configure required settings and Create a new server.

    انتقل إلى خادم قاعدة البيانات

    بدلاً من ذلك، إذا كان اشتراكك يحتوي بالفعل على خادم، يمكنك تحديد هذا الخادم من القائمة المنسدلة.

  5. في المربع اسم الملقم، أدخل csvccontosodbserver.

  6. أدخل "اسم تسجيل الدخول"و"كلمة المرور"للمسؤول.

    إذا حددت "إنشاء خادم جديد"، فلن تقوم بإدخال اسم وكلمة مرور موجودين هنا. إنك تُدخِل اسم جديد وكلمة مرور جديدين تقوم بتعريفها الآن لاستخدامها لاحقاً عند الوصول إلى قاعدة البيانات. إذا قمت بتحديد خادم قمت بإنشائه مسبقا، يطالبك المدخل بكلمة المرور إلى حساب المستخدم الإداري الذي قمت بإنشائه بالفعل.

  7. اختر "الموقع" نفسه الذي اخترته للخدمة السحابية.

    عندما تكون الخدمة السحابية وقاعدة البيانات في مراكز بيانات مختلفة (مناطق مختلفة)، يزداد زمن الانتقال وتتحمل رسوما على النطاق الترددي خارج مركز البيانات. عرض النطاق الترددي داخل مركز البيانات مجاني.

  8. تحقق من السماح لخدمات Azure بالوصول إلى الخادم.

  9. حدد تحديد للخادم الجديد.

    خادم جديد

  10. اختر "Create".

أنشئ حساب خدمة في Azure

يوفر حساب تخزين Azure موارد لتخزين بيانات قائمة الانتظار والبيانات النقطية في السحابة.

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

  1. في مدخل Microsoft Azure، حدد Create a resource > Storage > account - blob, file, table, queue.

  2. في المربع "الاسم"، أدخل بادئة عنوان URL.

    هذه البادئة بالإضافة إلى النص الذي تراه أسفل المربع هو عنوان URL الفريد لحساب التخزين الخاص بك. إذا كانت البادئة التي تدخلها قيد الاستخدام بالفعل من قبل شخص آخر، فاختر بادئة مختلفة.

  3. تعيين "نموذج التوزيع" إلى "كلاسيكي".

  4. تعيين القائمة المنسدلة "النسخ المتماثل" إلى تخزين المكرر محلياً.

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

  5. في مجموعة الموارد، حدد Use existing وحدد مجموعة الموارد المستخدمة للخدمة السحابية.

  6. قم بتعيين القائمة المنسدلة "الموقع" إلى نفس المنطقة التي اخترتها للخدمة السحابية.

    عندما تكون الخدمة السحابية وحساب التخزين في مراكز بيانات مختلفة (مناطق مختلفة)، يزداد زمن الانتقال وتتحمل رسوما للنطاق الترددي خارج مركز البيانات. عرض النطاق الترددي داخل مركز البيانات مجاني.

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

  7. اختر "Create".

    أنشئ حساب تخزين جديد

    في الصورة، يتم إنشاء حساب تخزين باستخدام عنوان URL csvccontosoads.core.windows.net.

تكوين الحل لاستخدام قاعدة البيانات في Azure SQL Database عند تشغيله في Azure

يحتوي كل من مشروع ويب ومشروع دور العامل على سلسلة اتصال قاعدة البيانات الخاصة به، ويحتاج كل منهما إلى الإشارة إلى قاعدة البيانات في قاعدة بيانات Azure SQL عند تشغيل التطبيق في Azure.

يمكنك استخدام تحويل Web.config لدور الويب وإعداد بيئة خدمة السحابة لدور العامل.

إشعار

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

  1. في مشروع ContosoAdsWeb، افتح ملف تحويل Web.Release.config لملف التطبيق Web.config، حذف كتلة التعليق الذي يحتوي على <connectionStrings> عنصر ولصق التعليمات البرمجية التالية في مكانه.

    <connectionStrings>
        <add name="ContosoAdsContext" connectionString="{connectionstring}"
        providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
    

    اترك الملف مفتوحاً للتحرير.

  2. في مدخل Microsoft Azure، اختر SQL Databases في الجزء الأيمن، وحدد قاعدة البيانات التي أنشأتها لهذا البرنامج التعليمي، ثم حدد Show سلسلة الاتصال s.

    إظهار سلاسل الاتصال

    يعرض المدخل سلاسل الاتصال، مع عنصر نائب لكلمة المرور.

    سلسلة الاتصال

  3. في ملف تحويل Web.Release.config، احذف {connectionstring} والصق في مكانه سلسلة الاتصال ADO.NET من مدخل Azure.

  4. في سلسلة الاتصال التي قمت بلصقها في ملف تحويل Web.Release.config، استبدل {your_password_here} بكلمة المرور التي قمت بإنشائها لقاعدة بيانات SQL الجديدة.

  5. حفظ الملف.

  6. حدد سلسلة الاتصال وانسخها (دون علامات الاقتباس المحيطة) لاستخدامها في الخطوات التالية لتكوين مشروع دور العامل.

  7. في مستكشف الحلول، ضمن الأدوار في مشروع الخدمة السحابية، انقر بزر الماوس الأيمن فوق ContosoAdsWorker ثم حدد خصائص.

    لقطة شاشة تبرز خيار قائمة الخصائص.

  8. اختر علامة التبويب الإعدادات.

  9. تغيير "تكوين الخدمة" إلى "السحابة".

  10. حدد الحقل "قيمة"ContosoAdsDbConnectionString الإعداد، ثم الصق سلسلة الاتصال التي قمت بنسخها من المقطع السابق من البرنامج التعليمي.

    سلسلة اتصال قاعدة البيانات لدور العامل

  11. احفظ تغييراتك.

تكوين الحل لاستخدام حساب التخزين Azure عند تشغيله في Azure

يتم تخزين سلاسل اتصال حساب تخزين Azure لكل من مشروع دور الويب ومشروع دور العامل في إعدادات البيئة في مشروع الخدمة السحابية. لكل مشروع، هناك مجموعة منفصلة من الإعدادات لاستخدامها عند تشغيل التطبيق محليا وعند تشغيله في السحابة. يمكنك تحديث إعدادات بيئة السحابة لكل من مشاريع دور الويب والعامل.

  1. في مستكشف الحلول، انقر بزر الماوس الأيمن فوق ContosoAdsWeb ضمن Roles في مشروع ContosoAdsCloudService، ثم حدد Properties.

    صورة تعرض خصائص

  2. اختر علامة التبويب الإعدادات. في مربع القائمة المنسدلة تكوين الخدمة، اختر Cloud.

    التكوين السحابي

  3. حدد إدخال StorageConnectionString، وترى زر علامة الحذف (...) في الطرف الأيسر من السطر. اختر زر علامة الحذف لفتح مربع الحوار إنشاء سلسلة اتصال التخزين.

    افتح مربع إنشاء سلسلة اتصال

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

    إنشاء سلسلة اتصال التخزين

  5. احفظ تغييراتك.

  6. اتبع نفس الإجراء الذي استخدمته لسلسلة StorageConnectionString الاتصال لتعيين Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString سلسلة الاتصال.

    تستخدم سلسلة الاتصال هذه لتسجيل الدخول.

  7. اتبع نفس الإجراء الذي استخدمته لدور ContosoAdsWeb لتعيين كل من سلاسل الاتصال لدور ContosoAdsWorker. لا تنسَ تعيين "تكوين الخدمة" إلى السحابة.

يتم تخزين إعدادات بيئة الدور التي قمت بتكوينها باستخدام واجهة مستخدم Visual Studio في الملفات التالية في مشروع ContosoAdsCloudService:

  • ServiceDefinition.csdef - يعرف أسماء الإعدادات.
  • ServiceConfiguration.Cloud.cscfg - يوفر القيم عند تشغيل التطبيق في السحابة.
  • ServiceConfiguration.Local.cscfg - يوفر القيم عند تشغيل التطبيق محلياً.

على سبيل المثال، يتضمن ServiceDefinition.csdef التعريفات التالية:

<ConfigurationSettings>
    <Setting name="StorageConnectionString" />
    <Setting name="ContosoAdsDbConnectionString" />
</ConfigurationSettings>

ويتضمن ملف ServiceConfiguration.Cloud.cscfg القيم التي أدخلتها لهذه الإعدادات في Visual Studio.

<Role name="ContosoAdsWorker">
    <Instances count="1" />
    <ConfigurationSettings>
        <Setting name="StorageConnectionString" value="{yourconnectionstring}" />
        <Setting name="ContosoAdsDbConnectionString" value="{yourconnectionstring}" />
        <!-- other settings not shown -->

    </ConfigurationSettings>
    <!-- other settings not shown -->

</Role>

<Instances> يحدد الإعداد عدد الأجهزة الظاهرية التي يقوم Azure بتشغيل رمز دور العامل عليها. يتضمن قسم "الخطوات التالية" ارتباطات لمزيد من المعلومات حول توسيع نطاق الخدمة السحابية،

نشر المشروع في Azure

  1. في "مستكشف الحلول"، انقر بزر الماوس الأيمن فوق مشروع سحابة ContosoAdsCloudService ثم حدد "نشر".

    نشر القائمة

  2. في خطوة تسجيل الدخول من معالج نشر تطبيق Azure، حدد التالي.

    خطوة تسجيل الدخول

  3. في خطوة الإعدادات للمعالج، حدد التالي.

    خطوة الإعدادات

    الإعدادات الافتراضية في علامة التبويب "متقدمة" مناسبة لهذا البرنامج التعليمي. للحصول على معلومات حول علامة التبويب المتقدمة، راجع نشر معالج تطبيقات Azure.

  4. في خطوة Summary ، حدد Publish.

    خطوة موجزة

    يتم فتح إطار سجل نشاط Azure في Visual Studio.

  5. اختر أيقونة السهم إلى اليمين لتوسيع تفاصيل النشر.

    قد يستغرق التوزيع ما يصل إلى 5 دقائق أو أكثر لإكماله.

    نافذة سجل نشاط Azure

  6. عند اكتمال حالة النشر، حدد عنوان URL لتطبيق الويب لبدء تشغيل التطبيق.

  7. يمكنك الآن اختبار التطبيق عن طريق إنشاء وعرض وتحرير بعض الإعلانات، كما فعلت عندما قمت بتشغيل التطبيق محلياً.

إشعار

عند الانتهاء من اختبار، حذف أو إيقاف الخدمة السحابية. حتى إذا كنت لا تستخدم الخدمة السحابية، فإنها تتراكم عليها رسوم بسبب حجز موارد الجهاز الظاهري لها. وإذا تركتها قيد التشغيل، يمكن لأي شخص يعثر على عنوان URL إنشاء الإعلانات وعرضها. في مدخل Azure، انتقل إلى علامة التبويب "نظرة عامة" للخدمة السحابية، ثم انقر فوق الزر "حذف" أعلى الصفحة. إذا كنت ترغب فقط في منع الآخرين مؤقتاً من الوصول إلى الموقع، فانقر فوق "إيقاف" بدلاً من ذلك. وفي هذه الحالة، ستستمر المصاريف في التراكم. يمكنك اتباع إجراء مشابه لحذف قاعدة بيانات SQL وحساب التخزين عندما لا تكن بحاجة إليها.

إنشاء التطبيق من البداية

إذا كنت لا تزال بحاجة إلى تنزيل التطبيق المكتمل، فقم بذلك الآن. انسخ الملفات من المشروع الذي تم تنزيله إلى المشروع الجديد.

يتضمن إنشاء تطبيق إعلانات Contoso الخطوات التالية:

  • إنشاء حل Visual Studio للخدمة السحابية.
  • تحديث وإضافة حزم NuGet.
  • تعيين مراجع المشروع.
  • تكوين سلاسل اتصال.
  • إضافة ملفات التعليمات البرمجية.

بعد إنشاء الحل، ستراجع التعليمات البرمجية الفريدة لمشاريع الخدمة السحابية ونقطة Azure وقوائم الانتظار.

إنشاء حل Visual Studio للخدمة السحابية

  1. في Visual Studio، اختر "مشروع جديد" من القائمة "ملف".

  2. في الجزء الأيمن من مربع الحوار "مشروع جديد"، قم بتوسيع Visual C#‎ واختر قوالب "السحابة"، ثم اختر قالب خدمة Azure السحابية.

  3. قم بتسمية المشروع والحل ContosoAdsCloudService، ثم حدد OK.

    مشروع جديد

  4. في مربع الحوار خدمة Azure السحابية الجديدة، أضف دور ويب ودور عامل. تسمية دور الويب ContosoAdsWeb، واسم دور العامل ContosoAdsWorker. (استخدم رمز القلم الرصاص في الجزء الأيمن لتغيير الأسماء الافتراضية للأدوار.)

    مشروع خدمة سحابية جديدة

  5. عندما ترى مربع الحوار New ASP.NET Project لدور الويب، اختر قالب MVC، ثم حدد Change Authentication.

    تغيير المصادقة

  6. في مربع الحوار تغيير المصادقة ، اختر بلا مصادقة، ثم حدد موافق.

    عدم المصادقة

  7. في مربع الحوار New ASP.NET Project ، حدد OK.

  8. في Solution Explorer، انقر بزر الماوس الأيمن فوق الحل الحالي (وليس أحد المشروعات)، وحدد "إضافة مشروع جديد".

  9. في مربع الحوار إضافة مشروع جديد، اختر Windows ضمن Visual C#‎ في الجزء الأيمن، ثم حدد قالب مكتبة الفئات .

  10. قم بتسمية المشروع ContosoAdsCommon، ثم حدد OK.

    عليك الرجوع إلى سياق Entity Framework ونموذج البيانات من كل من مشاريع دور الويب ودور العامل. كبديل، يمكنك تعريف الفئات المرتبطة ب EF في مشروع دور الويب والمرجع إلى هذا المشروع من مشروع دور العامل. ولكن في النهج البديل، سيكون لمشروع دور العامل الخاص بك إشارة إلى تجميعات الويب التي لا يحتاجها.

تحديث وإضافة حزم NuGet

  1. افتح مربع الحوار إدارة حزم NuGet للحل.

  2. في الجزء العلوي من النافذة، حدد "تحديثات".

  3. ابحث عن حزمة WindowsAzure.Storage ، وإذا كانت في القائمة، فحددها وحدد مشاريع الويب والعاملين لتحديثها، ثم حدد تحديث.

    يتم تحديث مكتبة عميل التخزين بشكل متكرر أكثر من قوالب مشروع Visual Studio، لذلك قد تجد أن الإصدار في مشروع تم إنشاؤه حديثا يحتاج إلى تحديث.

  4. في الجزء العلوي من النافذة، حدد "مستخدم جديد".

  5. العثور على حزمة EntityFramework NuGet وتثبيته في جميع المشاريع الثلاثة.

  6. العثور على حزمة Microsoft.WindowsAzure.ConfigurationManager NuGet، وثبته في مشروع دور العامل.

تعيين مراجع المشروع

  1. في مشروع ContosoAdsWeb، عين مرجع إلى مشروع ContosoAdsCommon. انقر بزر الماوس الأيمن فوق مشروع ContosoAdsWeb، ثم حدد المراجع - إضافة مراجع. في مربع الحوار إدارة المراجع، حدد الحل – المشاريع في الجزء الأيمن، وحدد ContosoAdsCommon، ثم حدد موافق.

  2. في مشروع ContosoAdsWorker، عيّن مرجع إلى مشروع ContosoAdsCommon.

    يحتوي ContosoAdsCommon على نموذج بيانات Entity Framework وفئة السياق، والتي تستخدم كلا من الواجهة الأمامية والخلفية.

  3. في مشروع ContosoAdsWorker، عيّن المرجع إلى System.Drawing.

    يتم استخدام هذا التجميع من قبل الواجهة الخلفية لتحويل الصور إلى صور مصغرة.

تكوين سلاسل اتصال

في هذا المقطع، يمكنك تكوين تخزين Azure وسلاسل اتصال SQL لاختبارها محلياً. تشرح إرشادات التوزيع السابقة في البرنامج التعليمي كيفية إعداد سلاسل الاتصال عند تشغيل التطبيق في السحابة.

  1. في مشروع ContosoAdsWeb، افتح التطبيق ملف Web.config وأدرِج العنصر التالي connectionStrings بعد العنصر configSections.

    <connectionStrings>
        <add name="ContosoAdsContext" connectionString="Data Source=(localdb)\v11.0; Initial Catalog=ContosoAds; Integrated Security=True; MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    

    إذا كنت تستخدم Visual Studio 2015 أو أعلى، استبدل "v11.0" ب "MSSQLLocalDB".

  2. احفظ تغييراتك.

  3. في مشروع ContosoAdsCloudService، انقر بزر الماوس الأيمن فوق ContosoAdsWeb ضمن Roles، ثم حدد Properties.

    صورة خصائص الدور

  4. في نافذة خصائص ContosoAdsWeb [الدور]، حدد علامة التبويب الإعدادات، ثم حدد إضافة إعداد.

    دع "تكوين الخدمة" مُعيّن إلى "كل التكوينات".

  5. إضافة إعداد يسمى StorageConnectionString. تعيين "النوع" إلى "سلسلة الاتصال"، وعيّن "القيمة" إلى UseDevelopmentStorage =true.

    سلسلة اتصال جديدة

  6. احفظ تغييراتك.

  7. اتبع نفس الإجراء لإضافة سلسلة اتصال تخزين في خصائص دور ContosoAdsWorker.

  8. أثناء وجودك في نافذة خصائص [الدور] ContosoAdsWorker، أضف سلسلة الاتصال أخرى:

    • الاسم: ContosoAdsDbConnectionString

    • النوع: سلسلة

    • القيمة: لصق سلسلة الاتصال نفسها التي استخدمتها لمشروع دور الويب. (المثال التالي خاص ببرنامج Visual Studio 2013. لا تنس تغيير مصدر البيانات إذا قمت بنسخ هذا المثال وكنت تستخدم Visual Studio 2015 أو إصداراً أعلى.)

      Data Source=(localdb)\v11.0; Initial Catalog=ContosoAds; Integrated Security=True; MultipleActiveResultSets=True;
      

إضافة ملفات التعليمات البرمجية

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

لإضافة ملفات إلى مشروع أو مجلد، انقر بزر الماوس الأيمن فوق المشروع أو المجلد وحدد إضافة - عنصر موجود. حدد الملفات التي تريدها ثم حدد إضافة. إذا سئل عما إذا كنت تريد استبدال الملفات الموجودة، فحدد نعم.

  1. في مشروع ContosoAdsCommon، احذف الملف Class1.cs وأضِف في مكانه ملفات Ad.cs وContosoAdscontext.cs من المشروع الذي تم تحميله.

  2. في مشروع ContosoAdsWeb، أضِف الملفات التالية من المشروع الذي تم تحميله.

    • Global.asax.cs.
    • في المجلد طرق العرض\المشتركة: _Layout.cshtml.
    • في المجلد طرق العرض\الصفحة الرئيسية:Index.cshtml.
    • في المجلد "وحدات التحكم": AdController.cs.
    • في المجلد "طرق العرض\الإعلان" (أنشئ المجلد أولاً): خمسة ملفات .cshtml.
  3. في مشروع ContosoAdsWorker، أضف WorkerRole.cs من المشروع الذي تم تنزيله.

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

تشرح المقاطع التالية التعليمات البرمجية المتعلقة بالعمل مع بيئة Azure، النقاط وقوائم الانتظار. لا يشرح هذا البرنامج التعليمي كيفية إنشاء وحدات تحكم MVC وطرق العرض باستخدام التدعيم، أو كيفية كتابة التعليمات البرمجية ل Entity Framework التي تعمل مع قواعد بيانات SQL Server، أو أساسيات البرمجة غير المتزامنة في ASP.NET 4.5. للحصول على معلومات حول هذه الموضوعات، انظر المصادر التالية:

ContosoAdsCommon - Ad.cs

يعرف ملف Ad.cs مجموعة لفئات الأقسام الإعلانية وفئة كيان POCO لمعلومات الإعلان.

public enum Category
{
    Cars,
    [Display(Name="Real Estate")]
    RealEstate,
    [Display(Name = "Free Stuff")]
    FreeStuff
}

public class Ad
{
    public int AdId { get; set; }

    [StringLength(100)]
    public string Title { get; set; }

    public int Price { get; set; }

    [StringLength(1000)]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [StringLength(1000)]
    [DisplayName("Full-size Image")]
    public string ImageURL { get; set; }

    [StringLength(1000)]
    [DisplayName("Thumbnail")]
    public string ThumbnailURL { get; set; }

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime PostedDate { get; set; }

    public Category? Category { get; set; }
    [StringLength(12)]
    public string Phone { get; set; }
}

ContosoAdsCommon - ContosoAdsContext.cs

تحدد فئة ContosoAdsContext استخدام فئة Ad في مجموعة DbSet، والتي يخزنها Entity Framework في قاعدة بيانات SQL.

public class ContosoAdsContext : DbContext
{
    public ContosoAdsContext() : base("name=ContosoAdsContext")
    {
    }
    public ContosoAdsContext(string connString)
        : base(connString)
    {
    }
    public System.Data.Entity.DbSet<Ad> Ads { get; set; }
}

هناك اثنان من الدوالِ الإنشائية للفئة. يتم استخدام أولها من قبل مشروع ويب، ويحدد اسم سلسلة اتصال التي يتم تخزينها في ملف Web.config. يتيح لك المنشئ الثاني المرور في سلسلة الاتصال الفعلية المستخدمة من قبل مشروع دور العامل، لأنه لا يحتوي على ملف Web.config. لقد رأيت سابقا مكان تخزين هذه سلسلة الاتصال. لاحقا، سترى كيف تسترد التعليمات البرمجية سلسلة الاتصال عند إنشاء مثيل لفئة DbContext.

ContosoAdsWeb - Global.asax.cs

التعليمات البرمجية التي يتم استدعاؤها من Application_Start الأسلوب بإنشاء حاوية نقاط "الصور" وقائمة انتظار "الصور" إذا لم تكن موجودة بالفعل. تضمن هذه التعليمة البرمجية أنه كلما كنت تستخدم حساب تخزين جديدا أو تستخدم محاكي التخزين على كمبيوتر جديد، تقوم التعليمات البرمجية تلقائيا بإنشاء حاوية الكائن الثنائي كبير الحجم المطلوبة وقائمة الانتظار.

تحصل التعليمات البرمجية على الوصول إلى حساب التخزين باستخدام سلسلة اتصال التخزين من ملف .cscfg.

var storageAccount = CloudStorageAccount.Parse
    (RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));

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

var blobClient = storageAccount.CreateCloudBlobClient();
var imagesBlobContainer = blobClient.GetContainerReference("images");
if (imagesBlobContainer.CreateIfNotExists())
{
    imagesBlobContainer.SetPermissions(
        new BlobContainerPermissions
        {
            PublicAccess =BlobContainerPublicAccessType.Blob
        });
}

التعليمات البرمجية مشابهة يحصل على مرجع إلى قائمة انتظار "الصور" وإنشاء قائمة انتظار جديدة. في هذه الحالة، لا يلزم تغيير أذونات.

CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
var imagesQueue = queueClient.GetQueueReference("images");
imagesQueue.CreateIfNotExists();

ContosoAdsWeb - _Layout.cshtml

يعيّن ملف _Layout.cshtml اسم التطبيق في العنوان والتذييل، ويُنشئ إدخال قائمة "إعلانات".

ContosoAdsWeb - Views\Home\Index.cshtml

يعرض الملف Views\Home\Index.cshtml ارتباطات الفئة على الصفحة الرئيسية. تمرر الارتباطات قيمة عدد صحيح من Category enum في متغير سلسلة استعلام إلى صفحة فهرس الإعلانات.

<li>@Html.ActionLink("Cars", "Index", "Ad", new { category = (int)Category.Cars }, null)</li>
<li>@Html.ActionLink("Real estate", "Index", "Ad", new { category = (int)Category.RealEstate }, null)</li>
<li>@Html.ActionLink("Free stuff", "Index", "Ad", new { category = (int)Category.FreeStuff }, null)</li>
<li>@Html.ActionLink("All", "Index", "Ad", null, null)</li>

ContosoAdsWeb - AdController.cs

في الملف AdController.cs، تستدعي الدالة الإنشائية InitializeStorage الأسلوب لإنشاء كائنات مكتبة عميل التخزين Azure التي توفر واجهة برمجة التطبيقات للعمل مع النقاط وقوائم الانتظار.

ثم تحصل التعليمات البرمجية على مرجع إلى حاوية نقاط الصور كما رأيت سابقاً في Global.asax.cs. أثناء القيام بذلك، فإنه يقوم بتعيين نهج إعادة محاولة افتراضي مناسب لتطبيق ويب. قد يؤدي نهج إعادة المحاولة التلقائي للتراجع الأسي إلى توقف تطبيق الويب عن الاستجابة لفترة أطول من دقيقة على محاولات متكررة لخطأ عابر. نهج إعادة المحاولة المحدد هنا ينتظر ثلاث ثوان بعد كل محاولة لمدة تصل إلى ثلاث محاولات.

var blobClient = storageAccount.CreateCloudBlobClient();
blobClient.DefaultRequestOptions.RetryPolicy = new LinearRetry(TimeSpan.FromSeconds(3), 3);
imagesBlobContainer = blobClient.GetContainerReference("images");

تحصل التعليمات البرمجية المشابهة على مرجع إلى قائمة انتظار "الصور".

CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
queueClient.DefaultRequestOptions.RetryPolicy = new LinearRetry(TimeSpan.FromSeconds(3), 3);
imagesQueue = queueClient.GetQueueReference("images");

معظم التعليمات البرمجية لوحدة التحكم تكون نموذجية للعمل مع نموذج بيانات إطار الكيان باستخدام فئة DbContext. الاستثناء هو أسلوب HttpPost Create الذي يقوم بتحميل ملف وحفظه في تخزين النقاط. يوفر الموثق نموذج الكائن إلى الأسلوب HttpPostedFileBase.

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create(
    [Bind(Include = "Title,Price,Description,Category,Phone")] Ad ad,
    HttpPostedFileBase imageFile)

إذا حدد المستخدم ملفاً لتحميله، تقوم التعليمات البرمجية بتحميل الملف وحفظه في نقطة، وتحديث سجل قاعدة بيانات الإعلان بعنوان URL يشير إلى النقطة.

if (imageFile != null && imageFile.ContentLength != 0)
{
    blob = await UploadAndSaveBlobAsync(imageFile);
    ad.ImageURL = blob.Uri.ToString();
}

التعليمات البرمجية التي تقوم بالتحميل في أسلوب UploadAndSaveBlobAsync. إنها تنشئ اسم GUID للنقطة، لتحميل وحفظ الملف، وإرجاع مرجع إلى النقطة المحفوظة.

private async Task<CloudBlockBlob> UploadAndSaveBlobAsync(HttpPostedFileBase imageFile)
{
    string blobName = Guid.NewGuid().ToString() + Path.GetExtension(imageFile.FileName);
    CloudBlockBlob imageBlob = imagesBlobContainer.GetBlockBlobReference(blobName);
    using (var fileStream = imageFile.InputStream)
    {
        await imageBlob.UploadFromStreamAsync(fileStream);
    }
    return imageBlob;
}

بعد أن يحمّل الأسلوب HttpPost Create نقاط وتحديثات قاعدة البيانات، فإنه ينشئ رسالة قائمة انتظار لإعلام تلك العملية الخلفية أن صورة جاهزة للتحويل إلى صورة مصغرة.

string queueMessageString = ad.AdId.ToString();
var queueMessage = new CloudQueueMessage(queueMessageString);
await queue.AddMessageAsync(queueMessage);

التعليمات البرمجية لأسلوب HttpPost Edit مشابهة إلا إذا حدد المستخدم ملف صورة جديدة يجب حذف أي النقط الموجودة مسبقاً.

if (imageFile != null && imageFile.ContentLength != 0)
{
    await DeleteAdBlobsAsync(ad);
    imageBlob = await UploadAndSaveBlobAsync(imageFile);
    ad.ImageURL = imageBlob.Uri.ToString();
}

يوضح المثال التالي التعليمات البرمجية التي تحذف النقط عند حذف إعلان.

private async Task DeleteAdBlobsAsync(Ad ad)
{
    if (!string.IsNullOrWhiteSpace(ad.ImageURL))
    {
        Uri blobUri = new Uri(ad.ImageURL);
        await DeleteAdBlobAsync(blobUri);
    }
    if (!string.IsNullOrWhiteSpace(ad.ThumbnailURL))
    {
        Uri blobUri = new Uri(ad.ThumbnailURL);
        await DeleteAdBlobAsync(blobUri);
    }
}
private static async Task DeleteAdBlobAsync(Uri blobUri)
{
    string blobName = blobUri.Segments[blobUri.Segments.Length - 1];
    CloudBlockBlob blobToDelete = imagesBlobContainer.GetBlockBlobReference(blobName);
    await blobToDelete.DeleteAsync();
}

ContosoAdsWeb - Views\Ad\Index.cshtml and Details.cshtml

يعرض الملف Index.cshtml الصور المصغرة مع بيانات الإعلان الأخرى.

<img src="@Html.Raw(item.ThumbnailURL)" />

يعرض الملف Details.cshtml الصورة كاملة الحجم.

<img src="@Html.Raw(Model.ImageURL)" />

ContosoAdsWeb - Views\Ad\Create.cshtml and Edit.cshtml

تحدد ملفات Create.cshtml وEdit.cshtml ترميز النموذج الذي يمكن وحدة التحكم من الحصول على الكائن HttpPostedFileBase.

@using (Html.BeginForm("Create", "Ad", FormMethod.Post, new { enctype = "multipart/form-data" }))

يوضح العنصر <input> المستعرض بتوفير مربع حوار تحديد ملف.

<input type="file" name="imageFile" accept="image/*" class="form-control fileupload" />

ContosoAdsWorker - WorkerRole.cs - OnStart method

تستدعي بيئة دور العامل Azure OnStart الأسلوب في WorkerRole الفئة عند بدء تشغيل دور العامل ثم يستدعي Run الأسلوب عند انتهاء OnStart الأسلوب.

يحصل الأسلوب OnStart على سلسلة اتصال قاعدة البيانات من ملف .cscfg وتمريره إلى فئة Entity Framework DbContext. يتم استخدام موفر SQLClient بشكل افتراضي، لذلك لا يلزم تحديد الموفر.

var dbConnString = CloudConfigurationManager.GetSetting("ContosoAdsDbConnectionString");
db = new ContosoAdsContext(dbConnString);

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

ContosoAdsWorker - WorkerRole.cs - طريقة التشغيل

يتم استدعاء الأسلوب Run عند انتهاء الأسلوب من عمل OnStart التهيئة الخاص به. ينفذ الأسلوب حلقة لانهائية التي تراقب لرسائل قائمة انتظار جديدة ومعالجتها عند وصولها.

public override void Run()
{
    CloudQueueMessage msg = null;

    while (true)
    {
        try
        {
            msg = this.imagesQueue.GetMessage();
            if (msg != null)
            {
                ProcessQueueMessage(msg);
            }
            else
            {
                System.Threading.Thread.Sleep(1000);
            }
        }
        catch (StorageException e)
        {
            if (msg != null && msg.DequeueCount > 5)
            {
                this.imagesQueue.DeleteMessage(msg);
            }
            System.Threading.Thread.Sleep(5000);
        }
    }
}

بعد كل تكرار للحلقة، إذا لم يتم العثور على رسالة قائمة انتظار، يسكن البرنامج لثانية واحدة. يمنع هذا السكون دور العامل من تكبد تكاليف مفرطة لوقت وحدة المعالجة المركزية ومعاملات التخزين. يروي فريق Microsoft Customer Advisory قصة حول مطور نسي تضمين وظيفة السكون هذه، ونشرها في الإنتاج، وتركها لقضاء عطلة. عندما عادوا، كانت تكلفة إشرافهم أكثر من العطلة.

في بعض الأحيان يؤدي محتوى رسالة قائمة انتظار خطأ في المعالجة. يسمى هذا النوع من الرسائل رسالة غير قابلة للتسمم. إذا قمت فقط بتسجيل خطأ وإعادة تشغيل التكرار الحلقي، يمكنك محاولة معالجة هذه الرسالة إلى ما لا نهاية. لذلك، تتضمن كتلة catch عبارة if التي تتحقق لمعرفة عدد المرات التي حاول فيها التطبيق معالجة الرسالة الحالية. إذا كان العدد أعلى من خمس مرات، يتم حذف الرسالة من قائمة الانتظار.

يتم استدعاء ProcessQueueMessage عند العثور على رسالة قائمة انتظار.

private void ProcessQueueMessage(CloudQueueMessage msg)
{
    var adId = int.Parse(msg.AsString);
    Ad ad = db.Ads.Find(adId);
    if (ad == null)
    {
        throw new Exception(String.Format("AdId {0} not found, can't create thumbnail", adId.ToString()));
    }

    CloudBlockBlob inputBlob = this.imagesBlobContainer.GetBlockBlobReference(ad.ImageURL);

    string thumbnailName = Path.GetFileNameWithoutExtension(inputBlob.Name) + "thumb.jpg";
    CloudBlockBlob outputBlob = this.imagesBlobContainer.GetBlockBlobReference(thumbnailName);

    using (Stream input = inputBlob.OpenRead())
    using (Stream output = outputBlob.OpenWrite())
    {
        ConvertImageToThumbnailJPG(input, output);
        outputBlob.Properties.ContentType = "image/jpeg";
    }

    ad.ThumbnailURL = outputBlob.Uri.ToString();
    db.SaveChanges();

    this.imagesQueue.DeleteMessage(msg);
}

يقرأ هذا الرمز قاعدة البيانات للحصول على عنوان URL للصورة، ويحول الصورة إلى صورة مصغرة، ويحفظ الصورة المصغرة في النقطة، ويستكمل قاعدة البيانات بعنوان URL النقطة المصغرة، ويحذف رسالة قائمة الانتظار.

إشعار

تستخدم التعليمات البرمجية في الأسلوب ConvertImageToThumbnailJPG فئات في مساحة الاسم System.Drawing للتبسيط. ومع ذلك، تم تصميم الفئات في مساحة الاسم هذه للاستخدام مع Windows Forms. وهي غير معتمدة للاستخدام في خدمة Windows أو ASP.NET. لمزيد من المعلومات حول خيارات معالجة الصور، راجع تغيير حجم "إنشاء الصور الديناميكية" و"عمق الصورة".

استكشاف الأخطاء وإصلاحها

في حالة عدم عمل شيء ما أثناء اتباع التعليمات في هذا البرنامج التعليمي، إليك بعض الأخطاء الشائعة وكيفية حلها.

ServiceRuntime.RoleEnvironmentException

يتم توفير الكائن RoleEnvironment بواسطة Azure عند تشغيل تطبيق في Azure أو عند تشغيله محلياً باستخدام محاكي الحساب Azure. إذا تلقيت هذا الخطأ عند التشغيل محليا، فتأكد من تعيين مشروع ContosoAdsCloudService كمشروع بدء التشغيل. يجعل هذا الإعداد المشروع يعمل باستخدام Azure Compute Emulator.

أحد الأشياء التي يستخدمها التطبيق في بيئة دور Azure للحصول على قيم سلسلة الاتصال التي يتم تخزينها في ملفات .cscfg، لذلك سبب آخر لهذا الاستثناء هو سلسلة اتصال مفقودة. تأكد من إنشاء إعداد StorageConnectionString لكل من تكوينات السحابة والمحلية في مشروع ContosoAdsWeb، وأنك قمت بإنشاء كل من سلاسل الاتصال لكلا التكوينين في مشروع ContosoAdsWorker. إذا قمت بالبحث عن "البحث عن الكل" ل StorageConnectionString في الحل بأكمله، يجب أن تراه تسع مرات في ستة ملفات.

لا يمكن تجاوز المنفذ xxx. منفذ جديد أقل من الحد الأدنى المسموح به قيمة 8080 للبروتوكول http

حاول تغيير رقم المنفذ المستخدم من قبل مشروع ويب. انقر بزر الماوس الأيمن فوق مشروع ContosoAdsWeb، ثم حدد خصائص. اختر علامة التبويب ويب، ثم قم بتغيير رقم المنفذ في إعداد عنوان Url ل Project.

للحصول على بديل آخر قد يحل المشكلة، راجع المقطع التالي.

أخطاء أخرى عند التشغيل محلياً

بشكل افتراضي، تستخدم مشاريع خدمة السحابة الجديدة التعبير Express Azure Compute Emulator لمحاكاة بيئة Azure. Azure Compute Emulator هو إصدار خفيف من محاكي الحوسبة الكامل، وفي بعض الحالات يعمل المحاكي الكامل عندما لا يعمل الإصدار السريع.

لتغيير المشروع لاستخدام المحاكي الكامل، انقر بزر الماوس الأيمن فوق مشروع ContosoAdsCloudService، ثم حدد خصائص. في نافذة Properties، حدد علامة التبويب Web، ثم حدد الزر التبادلي Use Full Emulator.

لتشغيل التطبيق مع المحاكي الكامل، يجب عليك فتح Visual Studio مع امتيازات المسؤول.

الخطوات التالية

يتم تصميم تطبيق إعلانات Contoso بطريقة بسيطة عن قصد للحصول على برنامج تعليمي للبدء. على سبيل المثال، لا ينفذ إدخال التبعية أو المستودع ووحدة أنماط العمل. لا يستخدم واجهة للتسجيل، ولا يستخدم عمليات الترحيل الأولى للتعليمات البرمجية ل EF لإدارة تغييرات نموذج البيانات أو مرونة اتصال EF لإدارة أخطاء الشبكة العابرة، وما إلى ذلك.

للحصول على معلومات عامة حول تطوير السحابة، راجع إنشاء تطبيقات سحابية Real-World باستخدام Azure.

لمزيد من المعلومات، راجع الموارد التالية: