إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
يوفر Visual Studio طريقة لتطوير وظائف مكتبة فئة C# واختبارها ونشرها إلى Azure. إذا كانت هذه التجربة هي الأولى باستخدام Azure Functions، فشاهد نظرة عامة على Azure Functions.
للبدء على الفور، ضع في اعتبارك إكمال التشغيل السريع ل Functions ل Visual Studio.
توفر هذه المقالة معلومات مفصلة حول كيفية استخدام Visual Studio لتطوير وظائف مكتبة فئة C# ونشرها على Azure. هناك نموذجان لتطوير وظائف مكتبة فئة C #: نموذج العامل المعزولوالنموذج قيد المعالجة.
أنت تقرأ إصدار نموذج العامل المعزول من هذه المقالة. يمكنك تحديد الطراز المفضل لديك في أعلى المقالة.
أنت تقرأ إصدار النموذج قيد المعالجة من هذه المقالة. يمكنك تحديد الطراز المفضل لديك في أعلى المقالة.
ما لم يُذكر خلاف ذلك، فإن الإجراءات والأمثلة الموضحة مخصصة لبرنامج Visual Studio 2022. لمزيد من المعلومات حول إصدارات Visual Studio 2022، راجع ملاحظات الإصدار أو ملاحظات إصدار المعاينة.
المتطلبات الأساسية
Visual Studio 2022، بما في ذلك حمل عمل تطوير Azure.
يتم إنشاء الموارد الأخرى التي تحتاج إليها، مثل حساب Azure Storage، في اشتراكك أثناء عملية النشر.
-
إذا لم يكن لديك حساب Azure، فأنشئ حساباً مجانياً قبل أن تبدأ.
إنشاء مشروع Azure Functions
ينشئ قالب مشروع Azure Functions في Visual Studio مشروع مكتبة فئة C# الذي يمكنك نشره في تطبيق دالة ما «function app» في Azure. يمكنك استخدام أحد تطبيقات الدالة لتجميع الدوال في وحدة منطقية لتيسير إدارة الموارد ونشرها وتحجيمها ومشاركتها.
من قائمة Visual Studio، حدد ملف>جديد>مشروع.
في مربع الحوار إنشاء مشروع جديد ، أدخل الوظائف في مربع البحث، وحدد قالب Azure Functions ، ثم حدد التالي.
في مربع الحوار تكوين المشروع الجديد ، بالنسبة إلى اسم المشروع، أدخل اسما لمشروعك، ثم حدد التالي. يجب أن يكون اسم تطبيق الدالة صالحًا لمساحة الاسم في C#، لذا لا تستخدم تسطيرات سفلية أو واصلات أو أي أحرف أخرى غير أبجدية رقمية.
في مربع الحوار معلومات إضافية ، اتخذ الإجراءات المدرجة في الجدول التالي:
الإعداد فعل الوصف عامل الوظائف حدد .NET 8.0 معزول (دعم طويل الأجل). يقوم Visual Studio بإنشاء مشروع وظيفة يتم تشغيله في عملية عامل معزولة. تدعم عملية العامل المعزول أيضا إصدارات أخرى من .NET و.NET Framework التي لا تقدم دعما طويل الأجل (LTS). لمزيد من المعلومات، راجع نظرة عامة على إصدارات وقت تشغيل Azure Functions. دالة حدد مشغل Http. يقوم Visual Studio بإنشاء وظيفة يتم تشغيلها بواسطة طلب HTTP. استخدام Azurite لحساب تخزين وقت التشغيل (AzureWebJobsStorage) حدد خانة الاختيار هذه. يُخصص حساب تخزين أو يُنشأ عند نشر المشروع على Azure لأن تطبيق الدالة في Azure يشترط توفره. لا يستخدم مشغل HTTP سلسلة اتصال حساب التخزين. تتطلب جميع أنواع المشغلات الأخرى سلسلة اتصال حساب تخزين صالحة. مستوى التخويل حدد مجهول. عند استخدام إعداد التخويل هذا، يمكن لأي عميل تشغيل الوظيفة التي تم إنشاؤها دون توفير مفتاح. يسهل هذا التكوين اختبار وظيفتك الجديدة. لمزيد من المعلومات، راجع مستوى التخويل. الإعداد فعل الوصف عامل الوظائف حدد .NET 8.0 قيد المعالجة (دعم طويل الأجل). يقوم Visual Studio بإنشاء مشروع دالة يعمل أثناء العملية مع الإصدار 4.x من وقت تشغيل الوظائف. لمزيد من المعلومات، راجع نظرة عامة على إصدارات وقت تشغيل Azure Functions. دالة حدد مشغل Http. يقوم Visual Studio بإنشاء وظيفة يتم تشغيلها بواسطة طلب HTTP. استخدام Azurite لحساب تخزين وقت التشغيل (AzureWebJobsStorage) حدد خانة الاختيار هذه. يُخصص حساب تخزين أو يُنشأ عند نشر المشروع على Azure لأن تطبيق الدالة في Azure يشترط توفره. لا يستخدم مشغل HTTP سلسلة اتصال حساب التخزين. تتطلب جميع أنواع المشغلات الأخرى سلسلة اتصال حساب تخزين صالحة. مستوى التخويل حدد مجهول عند استخدام إعداد التخويل هذا، يمكن لأي عميل تشغيل الوظيفة التي تم إنشاؤها دون توفير مفتاح. يسهل هذا التكوين اختبار وظيفتك الجديدة. لمزيد من المعلومات، راجع مستوى التخويل. تأكد من تعيين مستوى التخويل إلى مجهول. إذا قمت بتحديد المستوى الافتراضي للوظيفة، فسيطلب منك تقديم مفتاح الدالة في طلبات الوصول إلى نقطة نهاية الوظيفة.
حدد Create لإنشاء مشروع الدالة ودالة مشغل HTTP.
بعد إنشاء مشروع Functions، يقوم قالب المشروع بإنشاء مشروع C#، وتثبيت حزمتي Microsoft.Azure.Functions.Worker NuGet Microsoft.Azure.Functions.Worker.Sdk ، وتعيين إطار العمل الهدف.
بعد إنشاء مشروع Functions، يقوم قالب المشروع بإنشاء مشروع C#، وتثبيت Microsoft.NET.Sdk.Functions حزمة NuGet، وتعيين إطار العمل الهدف.
يحتوي المشروع الجديد على الملفات التالية:
host.json: يوفر هذا الملف طريقة لك لتكوين مضيف الوظائف. يتم تطبيق هذه الإعدادات عند التشغيل محليًا وفي Azure. لمزيد من المعلومات ، راجع مرجع host.json.
local.settings.json: يحتفظ هذا الملف بالإعدادات التي تستخدمها عند تشغيل الوظائف محليا. لا يتم استخدام هذه الإعدادات عند تشغيل تطبيقك في Azure. لمزيد من المعلومات، راجع العمل مع إعدادات التطبيق محليا.
هام
نظرا لأن ملف local.settings.json يمكن أن يحتوي على أسرار، يجب استبعاده من عنصر تحكم مصدر المشروع. في مربع الحوار خصائص لهذا الملف، تأكد من تعيين إعداد نسخ إلى دليل الإخراج إلى نسخ إذا كان أحدث.
لمزيد من المعلومات، راجع بنية المشروع في دليل العامل المعزول.
لمزيد من المعلومات، راجع مشروع مكتبة فئة Functions.
العمل مع إعدادات التطبيق محليا
عند تشغيل تطبيق الوظائف في Azure، يتم تخزين الإعدادات التي تتطلبها وظائفك مشفرة في إعدادات التطبيق. أثناء التطوير المحلي، تتم إضافة هذه الإعدادات بدلا من ذلك إلى Values المجموعة في ملف local.settings.json . يخزن ملف local.settings.json أيضا الإعدادات التي تستخدمها أدوات التطوير المحلية.
تهدف العناصر الموجودة Values في المجموعة في ملف local.settings.json الخاص بمشروعك إلى عكس العناصر في إعدادات تطبيق الدالة في Azure.
لا يقوم Visual Studio بتحميل الإعدادات تلقائيا في local.settings.json عند نشر المشروع. للتأكد من وجود هذه الإعدادات أيضًا في تطبيق الدالة في Azure، قم بتحميلها بعد نشر مشروعك. للمزيد من المعلومات، راجع إعدادات تطبيق Function. لا يتم نشر القيم الموجودة في مجموعة ConnectionStrings .
يمكن أن تقرأ التعليمة البركجية أيضًا قيم إعدادات تطبيق الدالة كمتغيرات البيئة. لمزيد من المعلومات، راجع متغيرات البيئة.
تكوين المشروع بهدف التطوير المحلي
يستخدم وقت تشغيل الوظائف حساب تخزين داخليا. أثناء التطوير، يمكنك استخدام حساب تخزين صالح لهذا الحساب الداخلي، أو يمكنك استخدام محاكي Azurite.
بالنسبة لجميع أنواع المشغلات بخلاف HTTP وخطافات الويب ، تحتاج إلى تعيين قيمة المفتاح Values.AzureWebJobsStorage في ملف local.settings.json :
- بالنسبة لحساب التخزين، قم بتعيين القيمة إلى سلسلة الاتصال لحساب التخزين الخاص بك.
- بالنسبة للمحاكي، قم بتعيين القيمة إلى
UseDevelopmentStorage=true.
إذا كنت تستخدم المحاكي، فقم بتغيير هذا الإعداد إلى سلسلة اتصال حساب تخزين فعلية قبل النشر. لمزيد من المعلومات، راجع محاكي التخزين المحلي.
لتعيين سلسلة اتصال حساب التخزين، اتبع الخطوات التالية:
سجل الدخول إلى مدخل Microsoft Azure، ثم انتقل إلى حساب التخزين الخاص بك.
حددمفاتيح الوصول>. ضمن key1، انسخ قيمة سلسلة الاتصال .
في مشروع Visual Studio، افتح ملفlocal.settings.json . قم بتعيين قيمة المفتاح
AzureWebJobsStorageلسلسلة الاتصال التي نسختها.كرر الخطوة السابقة لإضافة مفاتيح فريدة للصفيفة
Valuesلأي اتصالات أخرى تتطلبها الدوال.
إضافة دالة إلى المشروع
في وظائف مكتبة فئة C # ، يتم تحديد الروابط التي تستخدمها الوظائف من خلال تطبيق السمات في التعليمات البرمجية. عند إنشاء مشغلات الدالة من القوالب المتوفرة، يتم تطبيق سمات المشغل لصالحك.
في مستكشف الحلول، انقر بزر الماوس الأيمن فوق عقدة المشروع وحدد Add>.
في مربع الحوار إضافة عنصر جديد ، حدد Azure Function، ثم حدد إضافة.
حدد مشغلا، ثم قم بتعيين خصائص الربط المطلوبة. إذا قمت بتحديد مشغل خدمة التخزين وتريد تكوين الاتصال، فحدد خانة الاختيار لتكوين اتصال المشغل. يوضح المثال التالي إعدادات إنشاء وظيفة مشغل تخزين قائمة الانتظار.
حدد إضافة. إذا قمت بتحديد خانة الاختيار لتكوين اتصال تخزين في الخطوة السابقة، فستظهر صفحة الاتصال بالتبعية . حدد محاكي تخزين Azurite أو Azure Storage، ثم حدد التالي.
- إذا قمت بتحديد محاكي تخزين Azurite، فستظهر صفحة محاكي الاتصال بتخزين Azurite . اتبع الخطوات التالية:
- حدد التالي.
- في صفحة ملخص التغييرات ، حدد إنهاء. يقوم Visual Studio بتكوين التبعية وإنشاء فئة المشغل.
- إذا قمت بتحديد Azure Storage، فستظهر صفحة الاتصال بتخزين Azure . اتبع الخطوات التالية:
- حدد حساب تخزين، ثم حدد التالي. يحاول Visual Studio الاتصال بحساب Azure الخاص بك واسترداد نقطة نهاية.
- حدد التالي.
- في صفحة ملخص التغييرات ، حدد إنهاء. يقوم Visual Studio بتكوين التبعية وإنشاء فئة المشغل.
يستخدم مثال المشغل هذا إعداد تطبيق لاتصال التخزين بمفتاح يسمى
QueueStorage. يشير هذا المفتاح، المخزن في ملفlocal.settings.json، إما إلى محاكي Azurite أو حساب التخزين.- إذا قمت بتحديد محاكي تخزين Azurite، فستظهر صفحة محاكي الاتصال بتخزين Azurite . اتبع الخطوات التالية:
فحص الفئة المضافة حديثا. على سبيل المثال، تمثل فئة C# التالية دالة تشغيل تخزين قائمة الانتظار الأساسية:
تنسب طريقة
Run()إلىFunction. تشير هذه السمة إلى أن الأسلوب هو نقطة الإدخال للدالة.using System; using Azure.Storage.Queues.Models; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; namespace Company.Function; public class QueueTriggerCSharp { private readonly ILogger<QueueTriggerCSharp> _logger; public QueueTriggerCSharp(ILogger<QueueTriggerCSharp> logger) { _logger = logger; } [Function(nameof(QueueTriggerCSharp))] public void Run([QueueTrigger("PathValue", Connection = "ConnectionValue")] QueueMessage message) { _logger.LogInformation("C# Queue trigger function processed: {messageText}", message.MessageText); } }تنسب طريقة ثابتة
Run()إلىFunctionName. تشير هذه السمة إلى أن الأسلوب هو نقطة الإدخال للدالة.using System; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Host; using Microsoft.Extensions.Logging; namespace Company.Function { public class QueueTriggerCSharp { [FunctionName("QueueTriggerCSharp")] public void Run([QueueTrigger("PathValue", Connection = "ConnectionValue")]string myQueueItem, ILogger log) { log.LogInformation($"C# Queue trigger function processed: {myQueueItem}"); } } }
يتم تطبيق سمة خاصة بالربط على كل معلمة ربط يتم توفيرها لطريقة نقطة الإدخال. تأخذ السمة معلومات الربط كمعلمات.
في التعليمات البرمجية السابقة، تحتوي المعلمة الأولى على سمة QueueTrigger مطبقة، مما يشير إلى وظيفة مشغل تخزين قائمة الانتظار. يتم تمرير اسم قائمة الانتظار واسم إعداد سلسلة الاتصال كمعلمات إلى السمة QueueTrigger. في فصلك:
- يجب أن تتطابق معلمة اسم قائمة الانتظار مع اسم قائمة الانتظار التي تستخدمها في خطوة سابقة لإنشاء المشغل، مثل
myqueue-items. - يجب أن يتطابق اسم إعداد سلسلة الاتصال مع الاسم الذي تستخدمه في خطوة سابقة لإنشاء المشغل، مثل
QueueStorage.
لمزيد من المعلومات، راجع مشغل تخزين قائمة انتظار Azure ل Azure Functions.
استخدم الإجراء السابق لإضافة المزيد من الوظائف إلى مشروع تطبيق الوظائف الخاص بك. يمكن أن يكون لكل وظيفة في المشروع مشغل مختلف، ولكن يجب أن تحتوي الدالة على مشغل واحد بالضبط. لمزيد من المعلومات، راجع مشغلات وروابط Azure Functions.
إضافة روابط
كما هو الحال مع المشغلات، تتم إضافة روابط الإدخال والإخراج إلى الدالة كسمات ربط. لإضافة روابط إلى دالة، اتبع الخطوات التالية:
تأكد من تكوين المشروع للتطوير المحلي.
أضف حزمة ملحق NuGet المناسبة لكل ربط محدد. للحصول على متطلبات حزمة NuGet الخاصة بالربط ، راجع المقالة المرجعية للربط. على سبيل المثال، للحصول على متطلبات الحزمة لمشغل Azure Event Hubs، راجع مشغل Azure Event Hubs والروابط ل Azure Functions.
استخدم الأمر التالي في Package Manager Console لتثبيت حزمة محددة:
Install-Package Microsoft.Azure.Functions.Worker.Extensions.<BINDING_TYPE> -Version <TARGET_VERSION>Install-Package Microsoft.Azure.WebJobs.Extensions.<BINDING_TYPE> -Version <TARGET_VERSION>في هذه التعليمات البرمجية، استبدل
<BINDING_TYPE>بالاسم المحدد لملحق الربط، واستبدلها<TARGET_VERSION>بإصدار معين من الحزمة، مثل4.0.0. يتم سرد الإصدارات الصالحة على صفحات الحزمة الفردية في NuGet.org.إذا كانت هناك إعدادات تطبيق يحتاجها الربط ، فقم بإضافتها إلى مجموعة
Valuesفي ملف الإعداد المحلي.تستخدم الدالة هذه القيم عند تشغيلها محليًا. عندما تعمل الدالة في تطبيق الدوال في Azure، فإنها تستخدم إعدادات تطبيق الدوال. يجعل Visual Studio من السهل نشر الإعدادات المحلية إلى Azure.
أضف سمة ربط البيانات المناسبة لتوقيع الطريقة. في التعليمات البرمجية التالية، تقوم رسالة قائمة انتظار بتشغيل الوظيفة
Run. يقوم ربط الإخراج بعد ذلك بإنشاء رسالة قائمة انتظار جديدة بنفس النص في قائمة انتظار مختلفة.public class QueueTrigger { private readonly ILogger _logger; public QueueTrigger(ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger<QueueTrigger>(); } [Function("CopyQueueMessage")] [QueueOutput("myqueue-items-destination", Connection = "QueueStorage")] public string Run([QueueTrigger("myqueue-items-source", Connection = "QueueStorage")] string myQueueItem) { _logger.LogInformation($"C# Queue trigger function processed: {myQueueItem}"); return myQueueItem; } }QueueOutputتحدد السمة الربط على الأسلوب . بالنسبة لروابط الإخراج المتعددة، يمكنك بدلا من ذلك وضع هذه السمة على خاصية سلسلة للكائن الذي تم إرجاعه. لمزيد من المعلومات، راجع روابط الإخراج المتعددة.public static class SimpleExampleWithOutput { [FunctionName("CopyQueueMessage")] public static void Run( [QueueTrigger("myqueue-items-source", Connection = "QueueStorage")] string myQueueItem, [Queue("myqueue-items-destination", Connection = "QueueStorage")] out string myQueueItemCopy, ILogger log) { log.LogInformation($"CopyQueueMessage function processed: {myQueueItem}"); myQueueItemCopy = myQueueItem; } }Queueتحدد السمة على المعلمةoutربط الإخراج.يتم الحصول على الاتصال بتخزين قائمة الانتظار من الإعداد
QueueStorage. لمزيد من المعلومات، راجع مقال المرجع للربط المحدد.
للحصول على قائمة كاملة بالربط الذي تدعمه الوظائف، راجع ربط البيانات المدعوم. للحصول على مثال أكثر اكتمالا لهذا السيناريو، راجع توصيل الوظائف ب Azure Storage باستخدام Visual Studio.
قم بتشغيل الدالات محليًا
يمكنك استخدام أدوات Azure Functions الأساسية لتشغيل مشاريع الوظائف على كمبيوتر التطوير المحلي. عند تحديد F5 لتصحيح أخطاء مشروع Functions ، يبدأ مضيف Functions المحلي (func.exe) في الاستماع على منفذ محلي (عادة 7071). تكتب أي نقاط نهاية دالة قابلة للاستدعاء في الإخراج، ويمكنك استخدام نقاط النهاية هذه لاختبار وظائفك. لمزيد من المعلومات، راجع تطوير Azure Functions محليا باستخدام Core Tools. يُطلب منك تثبيت هذه الأدوات في المرة الأولى التي تبدأ فيها دالة من Visual Studio.
هام
بدءا من الإصدار 4.0.6517 من Core Tools، يجب أن تشير مشاريع النموذج قيد المعالجة إلى الإصدار 4.5.0 أو أحدث من Microsoft.NET.Sdk.Functions. إذا كنت تستخدم إصدارا سابقا، فسيؤدي الأمر func start إلى إنشاء خطأ.
لبدء وظيفتك في Visual Studio في وضع تصحيح الأخطاء، اتبع الخطوات التالية:
حدد F5. إذا طلب منك ذلك، اقبل الطلب من Visual Studio لتنزيل أدوات Azure Functions الأساسية وتثبيتها. قد تحتاج أيضا إلى تشغيل استثناء جدار الحماية حتى تتمكن الأدوات من التعامل مع طلبات HTTP.
عند تشغيل المشروع، اختبر التعليمات البرمجية بنفس الطريقة التي تختبر بها دالة موزعة.
عند تشغيل Visual Studio في وضع تتبع الأخطاء، يتم الوصول إلى نقاط التوقف كما هو متوقع.
للحصول على سيناريو اختبار أكثر تفصيلا يستخدم Visual Studio، راجع اختبار الدالات، لاحقا في هذه المقالة.
نشر إلى Azure
عند نشر مشروع Functions الخاص بك إلى Azure، يستخدم Visual Studio النشر المضغوط لنشر ملفات المشروع. عندما يكون ذلك ممكنا، يجب عليك أيضا تحديد تشغيل من ملف الحزمة بحيث يتم تشغيل المشروع في حزمة التوزيع (.zip). لمزيد من المعلومات، راجع تشغيل الوظائف من ملف حزمة في Azure.
لا تنشر إلى الوظائف باستخدام Web Deploy (msdeploy).
استخدم الخطوات التالية لنشر مشروعك على تطبيق وظائف في Azure:
في مستكشف الحلول، انقر بزر الماوس الأيمن فوق المشروع ثم حدد نشر.
في صفحة نشر ، قم بإجراء التحديدات التالية:
- في الهدف، حدد Azure، ثم حدد التالي.
- في هدف معين، حدد Azure Function App، ثم حدد التالي.
- في Functions instance، حدد Create new.
إنشاء مثيل جديد باستخدام القيم المحددة في الجدول التالي:
الإعداد قيمة الوصف الاسم اسم فريد عالميا يجب أن يحدد الاسم تطبيق الوظائف الجديد بشكل فريد. اقبل الاسم المقترح أو أدخل اسما جديدا. الأحرف التالية صالحة: a-z،0-9و.-اسم الاشتراك اسم اشتراكك يتم إنشاء تطبيق الوظائف في اشتراك Azure. اقبل الاشتراك الافتراضي أو حدد اشتراكا مختلفا من القائمة. مجموعة الموارد اسم مجموعة الموارد يتم إنشاء تطبيق الوظائف في مجموعة موارد. حدد جديد لإنشاء مجموعة موارد جديدة. يمكنك أيضا تحديد مجموعة موارد موجودة من القائمة. نوع الخطة استهلاك فليكس عند نشر مشروعك إلى تطبيق وظائف يعمل في خطة استهلاك Flex، قد تدفع فقط مقابل تنفيذ تطبيق الوظائف. يمكن أن تتحمل خطط الاستضافة الأخرى تكاليف أعلى. مهم:
عند إنشاء خطة Flex Consumption، يجب عليك أولا تحديد خطة خدمة التطبيق ثم إعادة تحديد Flex Consumption لمسح مشكلة في مربع الحوار.نظام التشغيل Linux تتطلب خطة Flex Consumption حاليا Linux. مكان موقع خدمة التطبيق حدد موقعا في منطقة Azure تدعمه خطة الاستهلاك المرن. عند تحديد منطقة غير مدعومة، يكون الزر Create باللون الرمادي. حجم ذاكرة المثيل 2048 حجم ذاكرة مثيلات الجهاز الظاهري التي يعمل فيها التطبيق فريد من نوعه لخطة الاستهلاك المرن. تخزين Azure حساب تخزين للأغراض العامة يتطلب وقت تشغيل الوظائف حساب تخزين. حدد جديد لتكوين حساب تخزين للأغراض العامة. يمكنك أيضا استخدام حساب موجود يفي بمتطلبات حساب التخزين. رؤى التطبيق مثيل Application Insights يجب تشغيل تكامل Application Insights لتطبيق الوظائف الخاص بك. حدد جديد لإنشاء مثيل جديد، إما في مساحة عمل جديدة أو في مساحة عمل Log Analytics موجودة. يمكنك أيضا استخدام مثيل موجود.
حدد إنشاء لإنشاء تطبيق وظائف وموارده ذات الصلة في Azure. تظهر حالة إنشاء المورد في الزاوية السفلية اليمنى من النافذة.
حدد إنهاء. تظهر نافذة نشر تقدم إنشاء ملف التعريف . عند إنشاء ملف التعريف، حدد إغلاق.
في صفحة ملف تعريف النشر، حدد نشر لنشر الحزمة التي تحتوي على ملفات المشروع إلى تطبيق الوظائف الجديد في Azure.
عند اكتمال التوزيع، يظهر عنوان URL الجذر لتطبيق الوظائف في Azure في صفحة ملف تعريف النشر.
في صفحة الملف الشخصي للنشر، انتقل إلى قسم الاستضافة . حدد علامة الحذف (...)، ثم حدد فتح في مدخل Microsoft Azure. يفتح مورد Azure لتطبيق الوظائف الجديد في مدخل Microsoft Azure.
إعدادات تطبيق الدالة
لا يقوم Visual Studio بتحميل إعدادات التطبيق تلقائيا عند نشر مشروعك. إذا قمت بإضافة إعدادات إلى ملف local.settings.json ، فيجب عليك أيضا إضافتها إلى تطبيق الوظائف في Azure.
أسهل طريقة لتحميل الإعدادات المطلوبة إلى تطبيق الوظائف في Azure هي إدارتها في Visual Studio. في صفحة الملف الشخصي للنشر، انتقل إلى قسم الاستضافة . حدد علامة الحذف (...)، ثم حدد إدارة إعدادات Azure App Service.
عند إجراء التحديد، يفتح مربع الحوار إعدادات التطبيق لتطبيق الوظائف. يمكنك استخدام مربع الحوار هذا لإضافة إعدادات التطبيق أو تعديل الإعدادات الموجودة.
لكل إعداد، القيمة المحلية هي القيمة في ملف local.settings.json ، والقيمة البعيدة هي القيمة في تطبيق الوظائف في Azure.
- لإنشاء إعداد تطبيق، اختر إضافة إعداد.
- لنسخ قيمة إعداد من الحقل محلي إلى الحقل البعيد ، حدد إدراج قيمة من محلي.
تتم كتابة التغييرات المعلقة إلى ملف الإعدادات المحلية وتطبيق الدالة عند تحديد OK.
إشعار
بشكل افتراضي، لا يتم إيداع ملف local.settings.json في التحكم بالمصادر. نتيجة لذلك، إذا قمت باستنساخ مشروع Functions محلي من عنصر تحكم المصدر، فلن يحتوي المشروع على ملف local.settings.json . تحتاج إلى إنشاء ملف local.settings.json يدويا في جذر المشروع بحيث يعمل مربع حوار إعدادات التطبيق كما هو متوقع.
يمكنك أيضًا إدارة إعدادات التطبيق بإحدى الطرق الأخرى التالية:
- استخدم مدخل Microsoft Azure.
- استخدم خيار النشر
--publish-local-settingsفي أدوات Azure Functions الأساسية. - استخدم Azure CLI.
تصحيح الأخطاء عن بعد
لتتبع أخطاء تطبيق الوظيفة الخاص بك عن بُعد، يجب عليك نشر تكوين تتبع أخطاء مشروعك. تحتاج أيضا إلى تشغيل تصحيح الأخطاء عن بعد في تطبيق الوظائف في Azure.
يفترض هذا القسم نشر تكوين تصحيح الأخطاء لتطبيق الوظائف الخاص بك.
اعتبارات تصحيح الأخطاء عن بُعد
- تصحيح الأخطاء عن بعد غير مستحسن في خدمة الإنتاج.
- لاستخدام تصحيح الأخطاء عن بعد، يجب استضافة تطبيق الوظائف الخاص بك في خطة Premium أو App Service.
- لا يتم دعم تصحيح الأخطاء عن بعد حاليا إلا عند تشغيل تطبيق C# على Windows.
- إذا كانت ميزة "التعليمات البرمجية الخاصة بي" قيد التشغيل في Visual Studio، فقم بإيقاف تشغيلها. للحصول على الإرشادات، راجع تمكين التعليمات البرمجية الخاصة بي فقط أو تعطيلها.
- تجنب التوقفات الطويلة عند نقاط التوقف عند استخدام تصحيح الأخطاء عن بعد. عندما يتم إيقاف عملية لمدة تزيد عن بضع دقائق، يتعامل معها Azure على أنها عملية غير مستجيبة ويغلقها.
- أثناء تصحيح الأخطاء، يرسل الخادم البيانات إلى Visual Studio، مما قد يؤثر على رسوم النطاق الترددي. للحصول على معلومات حول أسعار النطاق الترددي، راجع حاسبة التسعير.
- يتم إيقاف تشغيل تصحيح الأخطاء عن بعد تلقائيا في تطبيق الوظائف الخاص بك بعد 48 ساعة. بعد هذه النقطة ، تحتاج إلى إعادة تشغيل تصحيح الأخطاء عن بعد.
إرفاق مصحح الأخطاء
عند تصحيح أخطاء تطبيق عملية عامل معزول، تحتاج حاليا إلى إرفاق مصحح الأخطاء البعيد بعملية .NET منفصلة. مطلوب أيضا العديد من خطوات التكوين الأخرى.
لإرفاق مصحح أخطاء بعيد بتطبيق وظائف يعمل في عملية منفصلة عن مضيف الوظائف، اتبع الخطوات التالية:
في صفحة الملف الشخصي للنشر، انتقل إلى قسم الاستضافة . حدد علامة الحذف (...)، ثم حدد إرفاق مصحح الأخطاء.
يتصل Visual Studio بتطبيق الوظائف الخاص بك ويقوم بتشغيل تصحيح الأخطاء عن بعد إذا لم يكن قيد التشغيل بالفعل.
إشعار
نظرا لأن مصحح الأخطاء البعيد لا يمكنه الاتصال بعملية المضيف، فقد تظهر رسالة خطأ. على أي حال ، لا يمكن لمصحح الأخطاء المحلي الوصول إلى نقاط التوقف الخاصة بك أو توفير طريقة لك لفحص المتغيرات أو الانتقال عبر التعليمات البرمجية.
في القائمة تصحيح أخطاء Visual Studio، حدد إرفاق بالعملية.
في مربع الحوار إرفاق بالعملية ، اتبع الخطوات التالية:
- بجوار نوع الاتصال، حدد Microsoft Azure App Services.
- بجوار هدف الاتصال، حدد بحث.
في مربع الحوار Azure Attach to Process، ابحث عن تطبيق الوظائف وحدده، ثم حدد موافق.
إذا طُلب منك، اسمح لـ Visual Studio بالوصول من خلال جدار الحماية المحلي.
مرة أخرى في مربع الحوار إرفاق بالعملية ، حدد إظهار العمليات لجميع المستخدمين. حدد dotnet.exe، ثم حدد إرفاق.
عند انتهاء العملية، يتم إرفاقك بتعليمات مكتبة فئة C# التي تعمل في عملية عامل معزولة. في هذه المرحلة، يمكنك تصحيح أخطاء تطبيق الوظائف الخاص بك كالمعتاد.
لإرفاق مصحح أخطاء بعيد بتطبيق وظائف قيد التشغيل مع مضيف الوظائف، اتبع الخطوات التالية.
في صفحة الملف الشخصي للنشر، انتقل إلى قسم الاستضافة . حدد علامة الحذف (...)، ثم حدد إرفاق مصحح الأخطاء.
يتصل Visual Studio بتطبيق الوظائف الخاص بك ويقوم بتشغيل تصحيح الأخطاء عن بعد إذا لم يكن قيد التشغيل بالفعل. كما يقوم أيضًا بتحديد موقع مصحح الأخطاء وإرفاقه بالعملية المضيفة للتطبيق. في هذه المرحلة، يمكنك تصحيح أخطاء تطبيق الوظائف الخاص بك كالمعتاد.
عند الانتهاء من تصحيح الأخطاء، يجب إيقاف تشغيل تصحيح الأخطاء عن بعد.
إيقاف تشغيل تصحيح الأخطاء عن بعد
بعد الانتهاء من تصحيح أخطاء التعليمات البرمجية عن بعد، يجب إيقاف تشغيل تصحيح الأخطاء عن بعد في مدخل Microsoft Azure. يتم إيقاف تشغيل تصحيح الأخطاء عن بعد تلقائيا بعد 48 ساعة ، في حالة النسيان.
في صفحة الملف الشخصي للنشر، انتقل إلى قسم الاستضافة . حدد علامة الحذف (...)، ثم حدد فتح في مدخل Microsoft Azure. يفتح مدخل Microsoft Azure على تطبيق الوظائف الذي يتم نشر مشروعك عليه.
في تطبيق الوظائف، حدد تكوين الإعدادات>، ثم انتقل إلى علامة التبويب الإعدادات العامة. بجوار تصحيح الأخطاء عن بعد، حدد إيقاف. حدد حفظ، ثم حدد متابعة.
بعد إعادة تشغيل تطبيق الوظيفة، لم يعد بإمكانك الاتصال عن بعد بالعمليات البعيدة. يمكنك استخدام علامة التبويب نفسها في مدخل Microsoft Azure لتشغيل تصحيح الأخطاء عن بعد خارج Visual Studio.
وظائف المراقبة
الطريقة الموصى بها لمراقبة وظائفك هي دمج تطبيق الوظائف الخاص بك مع Application Insights. يجب تشغيل هذا التكامل عند إنشاء تطبيق الوظائف أثناء نشر Visual Studio.
إذا لم يتم إعداد التكامل أثناء النشر لسبب ما، فلا يزال يتعين عليك تشغيل تكامل Application Insights لتطبيق الوظائف في Azure.
لمزيد من المعلومات حول استخدام Application Insights للمراقبة، راجع مراقبة عمليات التنفيذ في Azure Functions.
وظائف الاختبار
يصف هذا القسم كيفية إنشاء مشروع نموذج C# قيد المعالجة يمكنك اختباره باستخدام xUnit، وهي أداة اختبار وحدة مفتوحة المصدر ل .NET.
الخطوة 1: الإعداد
اتبع هذه الخطوات لتكوين البيئة، بما في ذلك مشروع التطبيق والوظائف المطلوبة لدعم اختباراتك:
في Visual Studio، قم بإنشاء مشروع Azure Functions باسم Functions.
قم بإنشاء دالة HTTP من القالب:
- في مستكشف الحلول، انقر بزر الماوس الأيمن فوق مشروع الوظائف ، ثم حدد إضافة>دالة Azure جديدة.
- في مربع الحوار إضافة عنصر جديد ، حدد Azure Function، ثم حدد إضافة.
- حدد مشغل Http، ثم حدد إضافة.
- أعد تسمية الفئة الجديدة MyHttpTrigger.
قم بإنشاء وظيفة مؤقت من القالب:
- في مستكشف الحلول، انقر بزر الماوس الأيمن فوق مشروع الوظائف ، ثم حدد إضافة>دالة Azure جديدة.
- في مربع الحوار إضافة عنصر جديد ، حدد Azure Function، ثم حدد إضافة.
- حدد مشغل المؤقت، ثم حدد إضافة.
- أعد تسمية الفئة الجديدة MyTimerTrigger.
قم بإنشاء تطبيق xUnit Test في الحل:
- في مستكشف الحلول، انقر بزر الماوس الأيمن فوق الحل الذي يحتوي على مشروع الوظائف ، ثم حدد إضافة>مشروع جديد.
- حدد قالب مشروع اختبار xUnit ، ثم حدد التالي.
- قم بتسمية المشروع Functions.Tests.
قم بإزالة ملفات الاختبار الافتراضية من مشروع Functions.Tests .
استخدم NuGet لإضافة مرجع من تطبيق الاختبار إلى Microsoft.AspNetCore.Mvc. يمكنك استخدام وحدة تحكم إدارة الحزم، أو يمكنك اتباع الخطوات التالية:
- في مستكشف الحلول، انقر بزر الماوس الأيمن فوق مشروع Functions.Tests ثم حدد إدارة حزم NuGet.
- ابحث عن Microsoft.AspNetCore.Mvc وتثبيته.
في تطبيق Functions.Tests ، أضف مرجعا إلى تطبيق Functions :
- في مستكشف الحلول، انقر بزر الماوس الأيمن فوق مشروع Functions.Tests ، ثم حدد إضافة>مرجع مشروع.
- حدد مشروع الوظائف، ثم حدد موافق.
الخطوة 2: إنشاء فئات الاختبار
في هذا القسم، يمكنك إنشاء الفئات التي تستخدمها لتشغيل الاختبارات التلقائية.
تأخذ كل وظيفة تنفيذا للتعامل ILogger مع تسجيل الرسائل. في بعض الاختبارات، لا يتم تسجيل أي رسائل، أو لا يهم كيفية تنفيذ التسجيل. تحتاج الاختبارات الأخرى إلى تقييم الرسائل المسجلة لتحديد ما إذا كان يجب أن يجتاز الاختبار.
قم بإنشاء فئة في مشروع Functions.Tests الخاص بك باسم
NullScopeوأضف التعليمات البرمجية التالية. توفر هذه الفئة نطاقا وهميا. في خطوة لاحقة، يمكنك إنشاء تطبيق يستخدمILoggerهذا النطاق.using System; namespace Functions.Tests { public class NullScope : IDisposable { public static NullScope Instance { get; } = new NullScope(); private NullScope() { } public void Dispose() { } } }قم بإنشاء فئة في مشروع Functions.Tests الخاص بك باسم
ListLoggerوأضف التعليمات البرمجية التالية. يحتفظ هذا الفصل بقائمة داخلية بالرسائل لتقييمها أثناء الاختبار. لتنفيذ الواجهة المطلوبةILogger، تستخدم الفئة النطاق الوهمي من الفصلNullScope. تمر حالات الاختبار النطاق الوهمي إلىListLoggerالفصل.using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace Functions.Tests { public class ListLogger : ILogger { public IList<string> Logs; public IDisposable BeginScope<TState>(TState state) => NullScope.Instance; public bool IsEnabled(LogLevel logLevel) => false; public ListLogger() { this.Logs = new List<string>(); } public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { string message = formatter(state, exception); this.Logs.Add(message); } } }تنفذ الفئة
ListLoggerالأعضاء التالية ، كما تم التعاقد معها بواسطة الواجهةILogger:-
BeginScope: تضيف النطاقات سياقا إلى التسجيل الخاص بك. في هذه الحالة، يشير الاختبار إلى المثيل الثابت في الفئةNullScopeللسماح للاختبار بالعمل. -
IsEnabled: يتم توفير قيمة افتراضية.false -
Logتستخدم هذه الطريقة الوظيفة المتوفرةformatterلتنسيق الرسالة.: ثم تضيف الطريقة النص الناتج إلىLogsالمجموعة.
المجموعة
Logsهي مثيل منList<string>وتتم تهيئتها في المنشئ.-
قم بإنشاء ملف تعليمات برمجية في مشروع Functions.Tests المسمى LoggerTypes.cs وأضف التعليمات البرمجية التالية:
namespace Functions.Tests { public enum LoggerTypes { Null, List } }يحدد هذا التعداد نوع المسجل الذي تستخدمه الاختبارات.
قم بإنشاء فئة في مشروع Functions.Tests باسم
TestFactoryوأضف التعليمات البرمجية التالية:using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Primitives; using System.Collections.Generic; namespace Functions.Tests { public class TestFactory { public static IEnumerable<object[]> Data() { return new List<object[]> { new object[] { "name", "Bernardo" }, new object[] { "name", "Ananya" }, new object[] { "name", "Vlad" } }; } private static Dictionary<string, StringValues> CreateDictionary(string key, string value) { var qs = new Dictionary<string, StringValues> { { key, value } }; return qs; } public static HttpRequest CreateHttpRequest(string queryStringKey, string queryStringValue) { var context = new DefaultHttpContext(); var request = context.Request; request.Query = new QueryCollection(CreateDictionary(queryStringKey, queryStringValue)); return request; } public static ILogger CreateLogger(LoggerTypes type = LoggerTypes.Null) { ILogger logger; if (type == LoggerTypes.List) { logger = new ListLogger(); } else { logger = NullLoggerFactory.Instance.CreateLogger("Null Logger"); } return logger; } } }تنفذ الفئة
TestFactoryالأعضاء التالية:-
Data: ترجع هذه الخاصية مجموعة IEnumerable من بيانات العينة. تمثل أزواج القيم الرئيسية القيم التي يتم تمريرها إلى سلسلة استعلام. -
CreateDictionaryتقبل هذه الطريقة زوج قيمة المفتاح كوسيطة.: يقوم بإرجاع مثيل جديد يستخدمDictionaryلإنشاء مثيل لتمثيلQueryCollectionقيم سلسلة الاستعلام. -
CreateHttpRequestتقوم هذه الطريقة بإنشاء طلب HTTP تمت تهيئته باستخدام معلمات سلسلة الاستعلام المحددة.: -
CreateLoggerترجع هذه الطريقة تنفيذاILoggerلما يتم استخدامه للاختبار.:ILoggerيعتمد التنفيذ على نوع المسجل المحدد. إذا تم تحديد نوع قائمة، فإن المثيلListLoggerيتتبع الرسائل المسجلة المتوفرة للتقييم في الاختبارات.
-
قم بإنشاء فئة في مشروع Functions.Tests باسم
FunctionsTestsوأضف التعليمات البرمجية التالية:using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Xunit; namespace Functions.Tests { public class FunctionsTests { private readonly ILogger logger = TestFactory.CreateLogger(); [Fact] public async void Http_trigger_should_return_known_string() { var request = TestFactory.CreateHttpRequest("name", "Bernardo"); var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger); Assert.Equal("Hello, Bernardo. This HTTP triggered function executed successfully.", response.Value); } [Theory] [MemberData(nameof(TestFactory.Data), MemberType = typeof(TestFactory))] public async void Http_trigger_should_return_known_string_from_member_data(string queryStringKey, string queryStringValue) { var request = TestFactory.CreateHttpRequest(queryStringKey, queryStringValue); var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger); Assert.Equal($"Hello, {queryStringValue}. This HTTP triggered function executed successfully.", response.Value); } [Fact] public void Timer_should_log_message() { var logger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List); new MyTimerTrigger().Run(null, logger); var msg = logger.Logs[0]; Assert.Contains("C# Timer trigger function executed at", msg); } } }تنفذ هذه الفئة الأعضاء التالية أسماؤهم:
-
Http_trigger_should_return_known_stringيستخدم هذا الاختبار قيمةname=Bernardoسلسلة الاستعلام لإنشاء طلب إلى دالة HTTP.: يتحقق هذا الاختبار من إرجاع الاستجابة المتوقعة. -
Http_trigger_should_return_string_from_member_data: يستخدم هذا الاختبار سمات xUnit لتوفير بيانات نموذجية لدالة HTTP. -
Timer_should_log_message: ينشئ هذا الاختبار مثيلا ويمررهListLoggerإلى دالة مؤقت. بعد تشغيل الوظيفة، يتم التحقق من السجل للتأكد من وجود الرسالة المتوقعة.
-
للوصول إلى إعدادات التطبيق في اختباراتك، يمكنك إدخال
IConfigurationتطبيق بقيم متغير البيئة الساخرة في وظيفتك.
الخطوة 3: إجراء الاختبارات
لتشغيل الاختبارات في Visual Studio، حدد عرض>مستكشف الاختبار. في مستكشف الاختبار، حدد تشغيل>تشغيل كافة الاختبارات في طريقة العرض.
الخطوة 4: اختبارات تتبع الأخطاء
لتصحيح أخطاء الاختبارات، قم بتعيين نقطة توقف في الاختبار. في مستكشف الاختبار، حدد تشغيل>تصحيح الأخطاء آخر تشغيل.