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

نظرة عامة

هام

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

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

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

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

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

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

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

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

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

ما ستتعلمه

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

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

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

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

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

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

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

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

يقوم التطبيق بتخزين الإعلانات في قاعدة بيانات SQL، باستخدام رمز إطار الكيان أولًا لإنشاء الجداول والوصول إلى البيانات. بالنسبة لكل إعلان، تخزن قاعدة البيانات عنواني 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. انقر فوق إنشاء إعلان.

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

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

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

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

    صفحة الفهرس

  11. انقر على تفاصيل الإعلان للاطلاع على الصورة كاملة الحجم.

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

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

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

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

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

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

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

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

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

  2. انقر فوق إنشاء مورد > الحوسبة > الخدمة السحابية.

  3. في مربع إدخال اسم DNS، أدخل بادئة عنوان URL للخدمة السحابية.

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

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

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

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

  6. انقر فوق Create.

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

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

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

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

  1. في مدخل Microsoft Azure، انقر فوق إنشاء مورد > قواعد البيانات > قاعدة بيانات SQL.

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

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

  4. في الصورة التالية، انقر فوق "خادم - تكوين" الإعدادات المطلوبةو"إنشاء" خادم جديد.

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

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

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

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

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

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

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

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

  9. انقر فوق "تحديد" للخادم الجديد.

    خادم جديد

  10. انقر فوق Create.

إنشاء حساب تخزين Azure

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

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

  1. في مدخل Microsoft Azure، انقر فوق إنشاء مورد > موقع التخزين > حساب تخزين - نقطة، ملف، جدول، صف.

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

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

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

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

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

  5. في "مجموعة الموارد"، انقر فوق استخدام موجود وحدد مجموعة الموارد المستخدمة للخدمة السحابية.

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

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

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

  7. انقر فوق Create.

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

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

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

يحتوي كل من مشروع ويب ومشروع دور العامل على سلسلة اتصال قاعدة البيانات الخاصة به، ويحتاج كل منهما إلى الإشارة إلى قاعدة البيانات في Azure SQL Database عند تشغيل التطبيق في 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 في الجزء الأيمن، وانقر فوق قاعدة البيانات التي أنشأتها لهذا البرنامج التعليمي، ثم انقر فوق "عرض سلاسل الاتصال" .

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

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

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

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

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

  5. احفظ الملف

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

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

    لقطة شاشة توضح خيار قائمة

  8. انقر فوق علامة التبويب "إعدادات" .

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

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

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

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

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

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

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

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

  2. انقر فوق علامة التبويب "الإعدادات" . في المربع المنسدل "تكوين الخدمة" / اختر السحابة.

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

  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. في خطوة "تسجيل الدخول" من معالج تطبيق Publish Azure انقر فوق "التالي" .

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

  3. في خطوة "الإعدادات" من المعالج، انقر فوق "التالي" .

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

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

  4. في خطوة ملخص، انقر فوق "نشر" .

    خطوة موجزة

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

  5. انقر فوق رمز السهم الأيمن لتوسيع تفاصيل التوزيع.

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

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

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

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

ملاحظة

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

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

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

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

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

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

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

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

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

  3. تسمية المشروع والحل ContosoAdsCloudService، ومن ثم انقر فوق "موافق" .

    مشروع جديد

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

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

  5. عند رؤية مربع الحوار مشروع ASPNET. الجديد لدور ويب، اختر قالب MVC، ثم انقر فوق "تغيير المصادقة" .

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

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

    عدم المصادقة

  7. في مربع الحوار مشروع ASPNET. جديد، انقر فوق "موافق" .

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

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

  10. اسم المشروع ContosoAdsCommon، ثم انقر فوق "موافق" .

    عليك الرجوع إلى سياق 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 على نموذج بيانات إطار الكيان وفئة السياق، والتي سيتم استخدامها من قِبل كل من الواجهة الأمامية والواجهة الخلفية.

  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 ضمن "أدوار"، ثم انقر فوق "خصائص" .

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

  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 وطرق العرض باستخدام التدعيم، وكيفية كتابة رمز إطار الكيان الذي يعمل مع قواعد البيانات SQL Server، أو أساسيات البرمجة غير المتزامنة في ASPNET. 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 أن يتم استخدام الفئة الإعلانية في مجموعة DbSet، حيث سيُخزن "إطار عمل الكيان" في قاعدة بيانات 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);
        }
    }
}

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

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

يتم استدعاء 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.

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

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

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

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

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

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

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

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

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

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

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

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

لمشاهدة مقدمة عبر الفيديو إلى الممارسات الأفضل لـ Azure Storage والأنماط، انظر Microsoft Azure Storage – What's New, Best Practices and Patterns.

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