تطوير Azure Functions باستخدام Visual Studio

يتيح لك 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 مجاني قبل أن تبدأ.

إنشاء مشروع Azure Functions

ينشئ قالب مشروع Azure Functions في Visual Studio مشروع مكتبة فئة C# الذي يمكنك نشره في تطبيق دالة ما «function app» في Azure. يمكنك استخدام أحد تطبيقات الدالة لتجميع الدوال في وحدة منطقية لتيسير إدارة الموارد ونشرها وتحجيمها ومشاركتها.

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

  2. في إنشاء مشروع جديد، أدخل الدالات في مربع البحث، واختر قالب دالات Azure، ثم حدد التالي.

  3. في Configure your new projectأدخل Project name لمشروعك، ثم حدد Create. يجب أن يكون اسم تطبيق الدالة صالحًا لمساحة الاسم في C#، لذا لا تستخدم تسطيرات سفلية أو واصلات أو أي أحرف أخرى غير أبجدية رقمية.

  4. بالنسبة لإعدادات إنشاء تطبيق Azure Functions جديد، استخدم القيم الموضحة في الجدول التالي:

    الإعداد قيمة ‏‏الوصف
    إصدار .NET .NET 6 معزول تنشئ هذه القيمة مشروع دالة يتم تشغيله في عملية عامل معزولة. تدعم عملية العامل المعزولة إصدارا آخر غير LTS من .NET وأيضا .NET Framework. لمزيد من المعلومات، راجع نظرة عامة على إصدارات وقت تشغيل Azure Functions.
    قالب الدالة مشغل HTTP تنشئ هذه القيمة دالة مشغلة بواسطة طلب HTTP.
    حساب التخزين (AzureWebJobsStorage) محاكي التخزين يُخصص حساب تخزين أو يُنشأ عند نشر المشروع على Azure لأن تطبيق الدالة في Azure يشترط توفره. مشغل HTTP لا يستخدم سلسلة اتصال حساب Azure Storage، بينما يلزم جميع أنواع المشغلات الأخرى سلسلة اتصال صالحة لحساب Azure Storage.
    مستوى التخويل المجهول يمكن تشغيل الدالة المنشأة بواسطة أي عميل بدون توفير مفتاح. وإعداد التخويل هذا يسهّل من اختبار الدالة الجديدة. لمزيد من المعلومات حول المفاتيح والتخويل، راجع مفاتيح التخويل وروابط HTTP وwebhook.

    Screenshot of Azure Functions project settings

    الإعداد قيمة ‏‏الوصف
    إصدار .NET .NET 6 تنشئ هذه القيمة مشروع دالة يجري تشغيله في عملية قيد التنفيذ يتمتع بالإصدار 4.x من وقت تشغيل Azure Functions. لمزيد من المعلومات، راجع نظرة عامة على إصدارات وقت تشغيل Azure Functions.
    قالب الدالة مشغل HTTP تنشئ هذه القيمة دالة مشغلة بواسطة طلب HTTP.
    حساب التخزين (AzureWebJobsStorage) محاكي التخزين يُخصص حساب تخزين أو يُنشأ عند نشر المشروع على Azure لأن تطبيق الدالة في Azure يشترط توفره. مشغل HTTP لا يستخدم سلسلة اتصال حساب Azure Storage، بينما يلزم جميع أنواع المشغلات الأخرى سلسلة اتصال صالحة لحساب Azure Storage.
    مستوى التخويل المجهول يمكن تشغيل الدالة المنشأة بواسطة أي عميل بدون توفير مفتاح. وإعداد التخويل هذا يسهّل من اختبار الدالة الجديدة. لمزيد من المعلومات حول المفاتيح والتخويل، راجع مفاتيح التخويل وروابط HTTP وwebhook.

    Screenshot of Azure Functions project settings

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

  5. حدد Create لإنشاء مشروع الدالة ودالة مشغل HTTP.

بعد إنشاء مشروع Azure Functions، يقوم قالب المشروع بإنشاء مشروع C#، وتثبيت Microsoft.Azure.Functions.Worker حزم و Microsoft.Azure.Functions.Worker.Sdk NuGet، وتعيين إطار العمل الهدف.

بعد إنشاء مشروع Azure Functions، ينشئ قالب المشروع مشروع C#، ويثبت حزمة Microsoft.NET.Sdk.Functions NuGet، ويعين إطار العمل المستهدف.

يحتوي المشروع الجديد على الملفات التالية:

  • host.json: يتيح لك تكوين مضيف Functions. يتم تطبيق هذه الإعدادات عند التشغيل محليًا وفي 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.

يمكن أن تقرأ التعليمة البركجية أيضًا قيم إعدادات تطبيق الدالة كمتغيرات البيئة. لمزيد من المعلومات، راجع متغيرات البيئة.

تكوين المشروع بهدف التطوير المحلي

يستخدم وقت تشغيل الدالات حساب Azure Storage داخليًا. بالنسبة لجميع أنواع المشغلات بخلاف HTTP وخطافات الويب، قم بتعيين المفتاح Values.AzureWebJobsStorage إلى سلسلة اتصال حساب Azure Storage صالحة. يمكن لتطبيق الوظائف أيضا استخدام محاكي Azurite لإعداد الاتصال المطلوب AzureWebJobsStorage من قبل المشروع. لاستخدام المحاكي، قم بتعيين قيمة AzureWebJobsStorage إلى UseDevelopmentStorage=true. قم بتغيير هذا الإعداد إلى سلسلة اتصال حساب تخزين فعلية قبل النشر. لمزيد من المعلومات، راجع محاكي التخزين المحلي.

لتعيين سلسلة اتصال حساب التخزين:

  1. في Azure portal، انتقل إلى حساب التخزين الخاص بك.

  2. في علامة التبويب مفاتيح الوصول، ضمنالأمان + الشبكات، انسخ سلسلة الاتصال الخاصة بالمفتاح 1.

  3. في مشروعك، افتح ملف local.settings.json واضبط قيمة المفتاح AzureWebJobsStorage على سلسلة الاتصال التي نسختها.

  4. كرر الخطوة السابقة لإضافة مفاتيح فريدة للصفيفة Values لأي اتصالات أخرى تتطلبها الدوال.

إضافة دالة إلى المشروع

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

  1. في مستكشف الحلول، انقر بزر الماوس الأيمن فوق عقدة المشروع وحدد Add>New Azure Function.

  2. أدخل اسما للفئة، ثم حدد إضافة.

  3. اختر المشغل، وقم بتعيين خصائص الربط المطلوبة، ثم حدد إضافة. يوضح المثال التالي الإعدادات الخاصة بإنشاء دالة مشغل تخزين قائمة الانتظار.

    Create a Queue storage trigger function

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

    يستخدم مثال المشغل هذا إعداد تطبيق لاتصال التخزين بمفتاح يسمى QueueStorage. يشير هذا المفتاح، المخزن في ملف local.settings.json، إما إلى محاكي Azurite أو حساب تخزين Azure.

  4. فحص الفئة المضافة حديثا. على سبيل المثال، فئة 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: {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. لمزيد من المعلومات، راجع روابط تخزين Azure Queue لـ Azure Functions.

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

إضافة روابط

كما هو الحال مع المشغلات، تتم إضافة روابط الإدخال والإخراج إلى الدالة كسمات ربط. إضافة روابط إلى الدالة كما يلي:

  1. تأكد من تكوين المشروع للتطوير المحلي.

  2. أضف حزمة ملحق NuGet المناسبة للربط المحدد من خلال إيجاد متطلبات حزمة NuGet الخاصة بالربط في المقالة المرجعية للربط. على سبيل المثال ، ابحث عن متطلبات الحزمة لمشغل Event Hubs في مقالة مرجع ربط Event Hubs.

  3. استخدم الأمر التالي في 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.

  4. إذا كانت هناك إعدادات تطبيق يحتاجها الربط ، فقم بإضافتها إلى مجموعة Valuesفي ملف الإعداد المحلي.

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

  5. أضف سمة ربط البيانات المناسبة لتوقيع الطريقة. في المثال التالي، تقوم رسالة قائمة انتظار بتشغيل الدالة، ويقوم ربط الإخراج بإنشاء رسالة قائمة انتظار جديدة بنفس النص في قائمة انتظار مختلفة.

     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 Functions Core Tools الأساسية تشغيل مشروع Azure Functions على كمبيوتر التطوير المحلي. عند الضغط على F5 لتصحيح أخطاء مشروع Functions، يبدأ مضيف Functions المحلي (func.exe) في الاستماع على منفذ محلي (عادةً 7071). تكتب أي نقاط نهاية دالة قابلة للاستدعاء في الإخراج، ويمكنك استخدام نقاط النهاية هذه لاختبار وظائفك. لمزيد من المعلومات، راجع العمل باستخدام Azure Functions Core Tools. يُطلب منك تثبيت هذه الأدوات في المرة الأولى التي تبدأ فيها دالة من Visual Studio.

لبدء وظيفتك في Visual Studio في تتبع الأخطاء:

  1. اضغط عليF5. إذا طُلب منك ذلك، فاقبل الطلب من Visual Studio لتنزيل وتثبيت أدوات Azure Functions Core (CLI). قد تحتاج أيضًا إلى تمكين استثناء جدار حماية حيث يتسنى للأدوات معالجة طلبات HTTP.

  2. أثناء تشغيل المشروع، اختبر التعليمة البرمجية كما لو كنت تختبر دالة تم توزيعها.

    عند تشغيل Visual Studio في وضع تتبع الأخطاء، يتم الوصول إلى نقاط التوقف كما هو متوقع.

للحصول على سيناريو اختبار أكثر تفصيلاً باستخدام Visual Studio، راجع وظائف الاختبار.

نشر إلى Azure

عند نشر مشروع الوظائف إلى Azure، يستخدم Visual Studio نشر zip لنشر ملفات المشروع. عندما يكون ذلك ممكنا، يجب عليك أيضا تحديد Run-From-Package بحيث يتم تشغيل المشروع في حزمة التوزيع (.zip). لمزيد من المعلومات، راجع تشغيل الوظائف من ملف حزمة في Azure.

لا تنشر إلى Azure Functions باستخدام Web Deploy (msdeploy).

استخدم الخطوات التالية لنشر مشروعك على تطبيق الدالة في Azure.

  1. فيمستكشف الحلول، انقر بزر الماوس الأيمن فوق المشروع وحددنشر. في Target، اخترAzure ثم Next.

    Screenshot of publish window.

  2. اختر Azure Function App (Windows) لـ الهدف المحدد لإنشاء تطبيق الوظائف الذي يتم تشغيله على Windows، ثم اختر Next.

    Screenshot of publish window with specific target.

  3. في Function Instance، اختر Create a new Azure Function...

    Screenshot of create a new function app instance.

  4. إنشاء مثيل جديد باستخدام القيم المحددة في الجدول التالي:

    الإعداد قيمة ‏‏الوصف
    الاسم اسم فريد عالميًا الاسم الذي يعرّف بشكل فريد تطبيق الدالة الجديد الخاص بك. اقبل هذا الاسم أو أدخل اسماً جديداً. الأحرف الصالحة هي: a-z، و0-9، و-.
    الاشتراك اشتراكك اشتراك معرف Azure المطلوب استخدامه. اقبل هذا الاشتراك أو حدد اشتراكاً جديداً من القائمة المنسدلة.
    مجموعة الموارد قم بتسمية مجموعة الموارد لديك مجموعة الموارد التي يتم من خلالها إنشاء تطبيق الوظائف. حدد جديد لإنشاء مجموعة موارد جديدة. يمكنك أيضا اختيار مجموعة موارد موجودة من القائمة المنسدلة.
    Plan Type الاستهلاك‬ عند نشر المشروع إلى تطبيق دالة يعمل في خطة استهلاك، فإنك تدفع فقط مقابل تنفيذ تطبيق الدوال. تتكبد خطط الاستضافة الأخرى تكاليف أعلى.
    Location موقع خدمة التطبيق اختر الموقع في منطقة قريبة منك أو خدمات أخرى تصل دوالك إليها.
    تخزين Azure حساب تخزين للأغراض العامة يكون حساب Azure Storage مطلوبًا حلول وقت تشغيل Functions. حدد جديد لتكوين حساب تخزين للأغراض العامة. كما يمكنك اختيار حساب موجود، والذي يجب أن يفي بمتطلبات حساب التخزين.
    Application Insights مثيل Application Insights يجب تمكين تكامل Application Insights لتطبيق الوظائف الخاص بك. حدد جديد لإنشاء مثيل جديد، إما في مساحة عمل جديدة أو في مساحة عمل Log Analytics موجودة. يمكنك أيضا اختيار مثيل موجود.

    Screenshot of Create App Service dialog.

  5. حدد إنشاء لإنشاء تطبيق وظائف وموارده ذات الصلة في Azure. تظهر حالة إنشاء المورد أسفل يسار النافذة.

  6. في Functions instance، تأكد من تحديد Run from package file. يتم توزيع تطبيق الدالة باستخدام Zip Deploy مع تمكين وضع التشغيل من الحزمة. Zip Deploy هو أسلوب النشر الموصى به لمشروع الوظائف الخاص بك لأداء أفضل.

    Screenshot of Finish profile creation.

  7. حدد إنهاء، وفي صفحة «نشر»، حدد نشر لتوزيع الحزمة التي تحتوي على ملفات المشروع إلى تطبيق الوظائف الجديد في Azure.

    بعد اكتمال التوزيع، يظهر عنوان URL الجذر لتطبيق الدالة في Azure في علامة التبويب نشر.

  8. في علامة التبويب Publish، في قسم Hosting، اختر افتح في مدخل Microsoft Azure. يؤدي هذا إلى فتح مورد Azure لتطبيق الوظائف الجديد في مدخل Microsoft Azure.

    Screenshot of Publish success message.

إعدادات تطبيق الدالة

لا يقوم Visual Studio بتحميل هذه الإعدادات تلقائيًا عند نشر المشروع. أي إعدادات تقوم بإضافتها في local.settings.json يجب عليك أيضًا إضافتها إلى تطبيق الوظيفة في Azure.

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

Settings in Publish window

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

Application settings

يعرض Local قيمة الإعداد في ملف local.settings.json، ويعرض Remote قيمة الإعداد الحالي في تطبيق الدالة في Azure. اختر Add setting لإنشاء إعداد تطبيق جديد. استخدم الارتباط Insert value from Local لنسخ قيمة إعداد إلى الحقل Remote. تتم كتابة التغييرات المعلقة إلى ملف الإعدادات المحلية وتطبيق الدالة عند تحديد OK.

إشعار

بشكل افتراضي ، لا يتم تحديد ملف local.settings.json في التحكم بالمصادر. هذا يعني أنه إذا قمت باستنساخ مشروع Functions محلي من التحكم بالمصادر، فلن يحتوي المشروع على ملف local.settings.json. في هذه الحالة، تحتاج إلى إنشاء ملف local.settings.json يدويًا في جذر المشروع بحيث يعمل الحوار Application settings كما هو متوقع.

يمكنك أيضًا إدارة إعدادات التطبيق بإحدى الطرق الأخرى التالية:

تصحيح الأخطاء عن بُعد

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

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

اعتبارات تصحيح الأخطاء عن بُعد

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

إرفاق مصحح الأخطاء

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

عند الانتهاء، يجب عليك تعطيل تصحيح الأخطاء عن بعد.

لإرفاق مصحح أخطاء عن بُعد بتطبيق وظائف يعمل في عملية منفصلة عن مضيف الوظائف:

  1. من علامة التبويب نشر، حدد علامات الحذف (...) في قسم الاستضافة، ثم اختر تحميل ملف تعريف النشر. ينزّل هذا الإجراء نسخة من ملف تعريف النشر ويفتح موقع التنزيل. تحتاج إلى هذا الملف، الذي يحتوي على بيانات الاعتماد المستخدمة لإرفاقها بعملية العامل المعزولة التي تعمل في Azure.

    تنبيه

    يحتوي ملف .publishsettings على بيانات اعتمادك (غير المشفرة) التي تُستخدم لإدارة تطبيق الوظائف الخاص بك. أفضل ممارسة للأمان لهذا الملف هي تخزينه مؤقتًا خارج أدلة المصدر (على سبيل المثال في مجلد Libraries /Documents)، ثم حذفه بعد عدم الحاجة إليه. يمكن للمستخدم الضار الذي يحصل على حق الوصول إلى ملف .publishsettings تحرير تطبيق الوظائف وإنشائه وحذفه.

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

    Screenshot of attaching the debugger from Visual Studio.

    يتصل Visual Studio بتطبيق الوظائف الخاص بك ويمكن تصحيح الأخطاء عن بعد، إذا لم يكن ممكنا بالفعل.

    إشعار

    نظرًا إلى أن مصحح الأخطاء عن بُعد غير قادر على الاتصال بعملية المضيف، فقد ترى خطأً. في أي حال، لن يؤدي التصحيح الافتراضي إلى اقتحام التعليمة البرمجية الخاصة بك.

  3. مرة أخرى في Visual Studio، انسخ عنوان موقع ويبللموقع ضمن الاستضافة في صفحة نشر.

  4. من قائمة تتبع الأخطاء، حدد إرفاق بالعملية، وفي نافذة إرفاق بالعملية، الصق عنوان موقع ويب في هدف الاتصال، https:// وقم بإزالة المنفذ وإلحاقه :4024.

    تحقق من أن هدفك يبدو مثل <FUNCTION_APP>.azurewebsites.net:4024 واضغط على مفتاح الإدخال.

    Visual Studio attach to process dialog

  5. إذا طُلب منك، اسمح لـ Visual Studio بالوصول من خلال جدار الحماية المحلي.

  6. عند مطالبتك ببيانات الاعتماد، بدلاً من بيانات اعتماد المستخدم المحلي، اختر حسابًا مختلفًا (المزيد من الخيارات في نظام التشغيل Windows). وفّر قيم userName وuserPWD من ملف التعريف المنشور لعنوان البريد الإلكترونيوكلمة المرور في مربع حوار المصادقة على نظام التشغيل Windows. بعد إنشاء اتصال آمن مع خادم النشر، يتم عرض العمليات المتاحة.

    Visual Studio enter credential

  7. تحقق من عرض العملية من جميع المستخدمين ثم اختر dotnet.exe وحدد إرفاق. عند اكتمال العملية، يتم إرفاقك بالتعليمات البرمجية لمكتبة فئة C# التي تعمل في عملية عامل معزولة. في هذه المرحلة، يمكنك تصحيح أخطاء تطبيق الوظائف الخاص بك كالمعتاد.

لإرفاق مصحح أخطاء عن بُعد بتطبيق وظيفي قيد التشغيل مع مضيف الوظائف:

  • من علامة التبويب نشر، حدد علامات الحذف (...) في قسم الاستضافة، ثم اختر إرفاق مُصحح الأخطاء.

    Screenshot of attaching the debugger from Visual Studio.

يتصل Visual Studio بتطبيق الوظائف الخاص بك ويمكن تصحيح الأخطاء عن بعد، إذا لم يكن ممكنا بالفعل. كما يقوم أيضًا بتحديد موقع مصحح الأخطاء وإرفاقه بالعملية المضيفة للتطبيق. في هذه المرحلة، يمكنك تصحيح أخطاء تطبيق الوظائف الخاص بك كالمعتاد.

تعطيل تصحيح الأخطاء عن بعد

بعد الانتهاء من تصحيح الأخطاء عن بُعد، يجب عليك تعطيل تصحيح الأخطاء عن بُعد في مدخل Microsoft Azure. يُعطّل تصحيح الأخطاء عن بُعد تلقائيًا بعد 48 ساعة، في حالة نسيانها.

  1. في علامة التبويب نشر في مشروعك، حدد علامات الحذف (...) في قسم الاستضافة، واختر افتح في مدخل Microsoft Azure. يفتح هذا الإجراء تطبيق الوظيفة في مدخل Microsoft Azure الذي تم نشر مشروعك عليه.

  2. في تطبيق الوظائف، حدد التكوين ضمن الإعدادات، واختر الإعدادات العامة، وعيّن تصحيح الأخطاء عن بعد إلى إيقاف، وحدد حفظ ثم حدد متابعة.

بعد إعادة تشغيل تطبيق الوظيفة، لم يعد بإمكانك الاتصال عن بعد بالعمليات البعيدة. يمكنك استخدام علامة التبويب نفسها في مدخل Microsoft Azure لتمكين تصحيح الأخطاء عن بُعد خارج Visual Studio.

مراقبة الدوال

الطريقة الموصى بها لمراقبة تنفيذ الدالة هي دمج تطبيق الدالة مع Azure Application Insights. يجب تمكين هذا التكامل عند إنشاء تطبيق الوظائف أثناء نشر Visual Studio.

إذا لم يتم التكامل لسبب ما أثناء النشر، فلا يزال يتعين عليك تمكين تكامل Application Insights لتطبيق الوظائف في Azure.

لمعرفة المزيد حول مراقبة استخدامApplication Insights، راجع مراقبة Azure Functions.

وظائف الاختبار

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

Testing Azure Functions with C# in Visual Studio

1. الإعداد

استخدم هذه الخطوات لتكوين البيئة، بما في ذلك مشروع التطبيق والوظائف المطلوبة لدعم اختباراتك:

  1. إنشاء تطبيق وظائف جديد وتسميته Functions
  2. إنشاء وظيفة HTTP من القالب وتسميته MyHttpTrigger.
  3. إنشاء وظيفة HTTP من القالب وتسميته MyHttpTrigger.
  4. إنشاء تطبيق اختبار xUnit في الحل وتسميته Functions.Tests. قم بإزالة ملفات الاختبار الافتراضية.
  5. استخدام NuGet لإضافة مرجع من تطبيق الاختبار إلى Microsoft.AspNetCore.Mvc
  6. الإشارة إلى التطبيق Functions من التطبيق Functions.Tests.

الآن بعد إنشاء المشاريع، يمكنك إنشاء الفئات المستخدمة لتشغيل الاختبارات التلقائية.

2. إنشاء فئات الاختبار

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

  1. إنشاء فئة باسم ListLogger، والتي تحتوي على قائمة داخلية من الرسائل لتقييمها أثناء الاختبار. لتطبيق الواجهة ILogger المطلوبة، تحتاج الفئة إلى نطاق. تضع الفئة التالية نطاقًا لحالات الاختبار للتمرير إلى الفئة ListLogger.

  2. أنشئ فئة جديدة في مشروع Functions.Tests المسمى NullScope.cs وأضف هذه التعليمة البرمجية:

    using System;
    
    namespace Functions.Tests
    {
        public class NullScope : IDisposable
        {
            public static NullScope Instance { get; } = new NullScope();
    
            private NullScope() { }
    
            public void Dispose() { }
        }
    }
    
  3. أنشئ فئة في مشروع Functions.Tests المسمى ListLogger.cs وأضف هذه التعليمة البرمجية:

    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.

    • السجل: يستخدم هذا الأسلوب الوظيفة formatter المتوفرة لتنسيق الرسالة ثم يضيف النص الناتج إلى المجموعة Logs.

    المجموعة Logsهي مثيل من List<string> وتتم تهيئتها في المنشئ.

  4. أنشئ ملف تعليمة برمجية في مشروع Functions.Tests المسمى LoggerTypes.cs وأضف هذه التعليمة البرمجية:

    namespace Functions.Tests
    {
        public enum LoggerTypes
        {
            Null,
            List
        }
    }
    

    يحدد هذا التعداد نوع المسجل المستخدم من قِبل الاختبارات.

  5. إنشاء فئة في مشروع Functions.Tests المسمى TestFactory.cs وإضافة هذه التعليمة البرمجية:

    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", "Bill" },
                    new object[] { "name", "Paul" },
                    new object[] { "name", "Steve" }
    
                };
            }
    
            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 الأعضاء التالية:

    • البيانات: يتم من خلال هذه الخاصية إرجاع المجموعة IEnumerable من نموذج البيانات. تمثل أزواج القيمة الرئيسية القيم التي تم تمريرها إلى سلسلة استعلام.

    • CreateDictionary: يقبل هذا الأسلوب زوج مفتاح/قيمة كوسيطات ويتم من خلاله إرجاع Dictionary جديد يستخدم لإنشاء QueryCollection لتمثيل قيم سلسلة الاستعلام.

    • CreateHttpRequest: ينشئ هذا الأسلوب طلب HTTP تتم تهيئته مع معلمات سلسلة الاستعلام المحدد.

    • CreateLogger: استنادًا إلى نوع المسجل، يتم من خلال هذا الأسلوب إرجاع فئة المسجل المستخدمة للاختبار. يتتبع ListLogger الرسائل المسجلة المتوفرة للتقييم في الاختبارات.

  6. إنشاء فئة في مشروع Functions.Tests المسمى FunctionsTests.cs وإضافة هذه التعليمة البرمجية:

    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", "Bill");
                var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger);
                Assert.Equal("Hello, Bill. 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=Bill إلى وظيفة HTTP ويتحقق من إرجاع الاستجابة المتوقعة.

    • Http_trigger_should_return_string_from_member_data: يستخدم هذا الاختبار سمات xUnit لتوفير نموذج بيانات إلى وظيفة HTTP.

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

  7. للوصول إلى إعدادات التطبيق في الاختبارات الخاصة بك، يمكنك إدخال مثيل IConfiguration بقيم متغير بيئة وهمية في وظيفتك.

3. إجراء الاختبارات

لإجراء الاختبارات، انتقل إلى Test Explorer وحدد Run All Tests in View.

Testing Azure Functions with C# in Visual Studio

4. اختبارات تتبع الأخطاء

لتتبع أخطاء الاختبارات، عيّن نقطة توقف في الاختبار، وانتقل إلى Test Explorer وحدد Run > Debug Last Run.

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

لمزيد من المعلومات حول Azure Functions Core Tools، راجع العمل باستخدام Azure Functions Core Tools.