مرجع مُطور البرنامج النصي C#‎ ‏(‎.csx) في وظائف Azure

تُعد هذه المقالة مقدمة لتطوير وظائف Azure باستخدام البرنامج النصي C#‎ (‏.csx).

هام

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

تتيح لك Azure Functions تطوير الدوال باستخدام C# بإحدى الطرق التالية:

نوع عملية التنفيذ ملحق التعليمات البرمجية بيئة التطوير المرجع
البرنامج النصي C#‎ قيد المعالجة .csx بوابة
أدوات الذاكرة الأساسية
هذه المقالة
مكتبة فئة C# (عامل معزول) عملية عامل معزولة cs. Visual Studio
Visual Studio Code
أدوات الذاكرة الأساسية
دوال معالجة عامل .NET المعزولة
مكتبة فئات C# (قيد المعالجة) قيد المعالجة cs. Visual Studio
Visual Studio Code
أدوات الذاكرة الأساسية
دوال مكتبة فئة C# قيد المعالجة

كيفية عمل ‎.csx

تتدفق البيانات إلى الوظيفة C#‎ عبر وسيطات الأساليب. يتم تحديد أسماء الوسيطات في ملف function.json، وهناك أسماء محددة مسبقًا للوصول إلى أشياء مثل مسجّل الوظيفة والرموز المميزة للإلغاء.

يسمح لك تنسيق ‎.csx بكتابة أقل «للنص الأساسي» والتركيز على كتابة الوظيفة C#‎ فقط. بدلاً من إنهاء كل شيء في مساحة اسم وفئة، لا عليك سوى تعريف أسلوب Run. قم بتضمين أي مراجع تجميع ومساحات الأسماء في بداية الملف كالمعتاد.

يتم تحويل ملفات ‎.csx الخاصة بتطبيق الوظائف برمجيًا عند تهيئة مثيل. تعني خطوة التحويل البرمجي هذه أن أشياء مثل البداية الباردة قد تستغرق وقتًا أطول لوظائف البرنامج النصي C#‎ مقارنةً بمكتبات الفئة C#‎. خطوة التحويل البرمجي هذه هي أيضا السبب في أن وظائف البرنامج النصي C# قابلة للتحرير في مدخل Microsoft Azure، بينما مكتبات فئة C# غير قابلة للتحرير.

بنية المجلد

تبدو بنية المجلد لمشروع البرنامج النصي C# مثل المثال التالي:

FunctionsProject
 | - MyFirstFunction
 | | - run.csx
 | | - function.json
 | | - function.proj
 | - MySecondFunction
 | | - run.csx
 | | - function.json
 | | - function.proj
 | - host.json
 | - extensions.csproj
 | - bin

يوجد ملف host.js مشترك يمكن استخدامه لتكوين تطبيق الوظائف. لكل وظيفة ملف تعليمات برمجية خاص بها (‎.csx) وملف تكوين ربط البيانات (function.json).

يتم تعريف ملحقات ربط البيانات المطلوبة في الإصدار ‎2.x والإصدارات الأحدث من وقت تشغيل Functions extensions.csprojفي الملف، مع ملفات المكتبة الفعلية في binالمجلد. عند التطوير محليًا، يجب عليك تسجيل ملحقات الربط. عند تطوير وظائف في مدخل Microsoft Azure، يتم هذا التسجيل نيابة عنك.

ربط البيانات بالوسيطات

بيانات الإدخال أو الإخراج مرتبطة بمعلمة وظائف البرنامج نصي C#‎ عبر الخاصية name في ملف التكوين function.json. يوضح المثال التالي ملف function.json وملف run.csx لوظيفة قائمة انتظار. تسمى المعلمة التي تتلقى بيانات من رسالة قائمة الانتظار بـ myQueueItem لأن هذه هي قيمة الخاصية name.

{
    "disabled": false,
    "bindings": [
        {
            "type": "queueTrigger",
            "direction": "in",
            "name": "myQueueItem",
            "queueName": "myqueue-items",
            "connection":"MyStorageConnectionAppSetting"
        }
    ]
}
#r "Microsoft.WindowsAzure.Storage"

using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Queue;
using System;

public static void Run(CloudQueueMessage myQueueItem, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem.AsString}");
}

البيان #r موضح لاحقًا في هذه المقالة.

الأنواع المعتمدة للروابط

لكل ربط أنواعه المدعومة الخاصة به؛ على سبيل المثال، يمكن استخدام مشغل كائن ثنائي كبير الحجم مع معلمة سلسلة، أو معلمة POCO، أو المعلمة CloudBlockBlob، أو أي من الأنواع المدعومة العديدة الأخرى. تسرد المقالة المرجعية للارتباطات ارتباطات الكائنات الثنائية كبيرة الحجم جميع أنواع المعلمات المدعومة لمشغلات الكائنات الثنائية كبيرة الحجم. لمزيد من المعلومات، راجع Triggers and bindings والمستندات المرجعية للارتباطات لكل نوع ارتباط.

تلميح

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

الفئات المخصصة المرجعية

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

يُظهر المثال التالي مثالاً على run.csx يتضمن تعريف فئة POCO.

public static void Run(string myBlob, out MyClass myQueueItem)
{
    log.Verbose($"C# Blob trigger function processed: {myBlob}");
    myQueueItem = new MyClass() { Id = "myid" };
}

public class MyClass
{
    public string Id { get; set; }
}

يجب أن يكون لفئة POCO أسلوبا إحضار وتعيين محددان لكل خاصية.

إعادة استخدام رمز ‎.csx

يمكنك استخدام الفئات والأساليب المعرّفة في ملفات ‎.csx الأخرى في ملف run.csx لديك. لتنفيذ ذلك، استخدم التوجيهات #load في الملف run.csx لديك. في المثال التالي، تتم مشاركة روتين تسجيل يُسمى MyLogger في myLogger.csx وتحميله في run.csx باستخدام التوجيه #load:

مثال على run.csx:

#load "mylogger.csx"

using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, ILogger log)
{
    log.LogInformation($"Log by run.csx: {DateTime.Now}");
    MyLogger(log, $"Log by MyLogger: {DateTime.Now}");
}

مثال على mylogger.csx:

public static void MyLogger(ILogger log, string logtext)
{
    log.LogInformation(logtext);
}

يُعد استخدام ملف ‎.csx مشترك نمطًا شائعًا عندما تريد كتابة البيانات التي تم تمريرها بين الوظائف بقوة باستخدام كائن POCO. في المثال المبسط التالي، يتشارك مشغل HTTP ومشغل قائمة انتظار كائن POCO يُسمى Order لكتابة بيانات الأمر بقوة:

مثال على run.csx لمشغل HTTP:

#load "..\shared\order.csx"

using System.Net;
using Microsoft.Extensions.Logging;

public static async Task<HttpResponseMessage> Run(Order req, IAsyncCollector<Order> outputQueueItem, ILogger log)
{
    log.LogInformation("C# HTTP trigger function received an order.");
    log.LogInformation(req.ToString());
    log.LogInformation("Submitting to processing queue.");

    if (req.orderId == null)
    {
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    }
    else
    {
        await outputQueueItem.AddAsync(req);
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
}

مثال على run.csx لمشغل قائمة الانتظار:

#load "..\shared\order.csx"

using System;
using Microsoft.Extensions.Logging;

public static void Run(Order myQueueItem, out Order outputQueueItem, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed order...");
    log.LogInformation(myQueueItem.ToString());

    outputQueueItem = myQueueItem;
}

مثال على order.csx:

public class Order
{
    public string orderId {get; set; }
    public string custName {get; set;}
    public string custAddress {get; set;}
    public string custEmail {get; set;}
    public string cartId {get; set; }

    public override String ToString()
    {
        return "\n{\n\torderId : " + orderId +
                  "\n\tcustName : " + custName +
                  "\n\tcustAddress : " + custAddress +
                  "\n\tcustEmail : " + custEmail +
                  "\n\tcartId : " + cartId + "\n}";
    }
}

يمكنك استخدام مسار نسبي جنبًا إلى جنب مع التوجيه #load:

  • يقوم #load "mylogger.csx" بتحميل ملف موجود في مجلد الوظيفة.
  • يقوم #load "loadedfiles\mylogger.csx" بتحميل ملف موجود في أحد المجلدات في مجلد الوظيفة.
  • يقوم #load "..\shared\mylogger.csx" بتحميل ملف موجود في مجلد في مستوى مجلد الوظيفة نفسه، أي ضمن wwwroot مباشرةً.

يعمل التوجيه #load فقط مع ملفات ‎.csx، لا مع ملفات ‎.cs.

الربط إلى قيمة إرجاع الأسلوب

يمكنك استخدام قيمة مرجعة لأسلوب لارتباط إخراج باسم $return في function.json.

{
    "name": "$return",
    "type": "blob",
    "direction": "out",
    "path": "output-container/{id}"
}

فيما يلي التعليمات البرمجية للبرنامج النصي C# باستخدام القيمة المرجعة، متبوعة بمثال غير متزامن:

public static string Run(WorkItem input, ILogger log)
{
    string json = string.Format("{{ \"id\": \"{0}\" }}", input.Id);
    log.LogInformation($"C# script processed queue message. Item={json}");
    return json;
}
public static Task<string> Run(WorkItem input, ILogger log)
{
    string json = string.Format("{{ \"id\": \"{0}\" }}", input.Id);
    log.LogInformation($"C# script processed queue message. Item={json}");
    return Task.FromResult(json);
}

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

كتابة قيم إخراج متعددة

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

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

public static void Run(ICollector<string> myQueue, ILogger log)
{
    myQueue.Add("Hello");
    myQueue.Add("World!");
}

تسجيل الدخول

لتسجيل الإخراج إلى سجلات البث في C#‎، قم بتضمين وسيطة من نوع ILogger. وننصح بتسميتها log. تجنب استخدام Console.Write في وظائف Azure.

public static void Run(string myBlob, ILogger log)
{
    log.LogInformation($"C# Blob trigger function processed: {myBlob}");
}

إشعار

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

تسجيل القياسات المخصصة

يمكنك استخدام أسلوب التوسيع LogMetric في ILogger لإنشاء قياسات مخصصة في Application Insights. فيما يلي استدعاء أسلوب نموذج:

logger.LogMetric("TestMetric", 1234);

يُعد هذا الرمز بديلاً لاستدعاء TrackMetric باستخدام واجهة برمجة التطبيقات Application Insights لـ ‎.NET.

غير متزامنة

لجعل وظيفة غير متزامنة، استخدم الكلمة الأساسية async ثم قم بإرجاع كائن Task.

public async static Task ProcessQueueMessageAsync(
        string blobName,
        Stream blobInput,
        Stream blobOutput)
{
    await blobInput.CopyToAsync(blobOutput, 4096);
}

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

رموز الإلغاء المميزة

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

يوضح المثال التالي كيفية التحقق من إنهاء الوظيفة الوشيك.

using System;
using System.IO;
using System.Threading;

public static void Run(
    string inputText,
    TextWriter logger,
    CancellationToken token)
{
    for (int i = 0; i < 100; i++)
    {
        if (token.IsCancellationRequested)
        {
            logger.WriteLine("Function was cancelled at iteration {0}", i);
            break;
        }
        Thread.Sleep(5000);
        logger.WriteLine("Normal processing for queue message={0}", inputText);
    }
}

استيراد مساحات الأسماء

إذا كنت بحاجة إلى استيراد مساحات الأسماء، يمكنك تنفيذ ذلك كالمعتاد، من خلال العبارة using.

using System.Net;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

public static Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger log)

يتم استيراد مساحات الأسماء التالية تلقائيًا وبالتالي تُعد اختيارية:

  • System
  • System.Collections.Generic
  • System.IO
  • System.Linq
  • System.Net.Http
  • System.Threading.Tasks
  • Microsoft.Azure.WebJobs
  • Microsoft.Azure.WebJobs.Host

التجميعات الخارجية المرجعية

لتجميعات إطار العمل، أضف مراجع باستخدام التوجيه #r "AssemblyName".

#r "System.Web.Http"

using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

public static Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger log)

يتم تلقائيا إضافة التجميعات التالية بواسطة بيئة استضافة Azure Functions:

  • mscorlib
  • System
  • System.Core
  • System.Xml
  • System.Net.Http
  • Microsoft.Azure.WebJobs
  • Microsoft.Azure.WebJobs.Host
  • Microsoft.Azure.WebJobs.Extensions
  • System.Web.Http
  • System.Net.Http.Formatting

قد تتم الإشارة إلى التجميعات التالية باسم بسيط، حسب إصدار وقت التشغيل:

  • Newtonsoft.Json
  • Microsoft.WindowsAzure.Storage*

*تمت إزالته في الإصدار 4.x من وقت التشغيل.

في التعليمات البرمجية، تتم الإشارة إلى التجميعات مثل المثال التالي:

#r "AssemblyName"

التجميعات المخصصة المرجعية

للإشارة إلى تجميع مخصص، يمكنك استخدام إما تجميع مشترك أو تجميع خاص:

  • تتم مشاركة التجميعات المشتركة عبر جميع الوظائف داخل تطبيق الوظائف. للإشارة إلى تجميع مخصص، قم بتحميل التجميع إلى مجلد مسمى bin في المجلد الجذر (wwwroot) لتطبيق الوظائف.

  • تُعد التجميعات الخاصة جزءًا من سياق وظيفة معينة، وتدعم التحميل الجانبي للإصدارات المختلفة. يجب تحميل التجميعات الخاصة في مجلد bin في دليل الوظيفة. ارجع إلى التجميعات باستخدام اسم الملف، مثل #r "MyAssembly.dll".

للحصول على معلومات حول كيفية تحميل الملفات إلى مجلد الوظائف، راجع القسم الخاص بإدارة الحزمة.

الدلائل التي تمت مراقبتها

تتم مراقبة الدليل الذي يحتوي على ملف البرنامج النصي للوظيفة تلقائيًا بحثًا عن التغييرات في التجميعات. لمراقبة تغييرات التجميع في الدلائل الأخرى، أضفها إلى القائمة watchDirectories في host.json.

استخدام حزم NuGet

تعتمد طريقة إضافة حزم ملحقات الربط وحزم NuGet الأخرى إلى Function App على الإصدار المستهدف من Functions runtime.

بشكل افتراضي، يتم توفير المجموعة المدعومة من حزم NuGet الخاصة بملحق الوظائف لتطبيق وظيفة البرنامج النصي #C باستخدام حزم الملحقات. لمعرفة المزيد، راجع حِزم الملحق.

إذا لم تتمكن من استخدام حزم الملحقات في مشروعك لسبب ما، فيمكنك أيضاً استخدام Azure Functions Core Tools لتثبيت الملحقات استناداً إلى الارتباطات المحددة في ملفات function.json في تطبيقك. عند استخدام الأدوات الأساسية لتسجيل الملحقات، تأكد من استخدام الخيار --csx. لمعرفة المزيد، راجع تثبيت ملحقات func.

بشكل افتراضي، تقرأ Core Tools ملفات function.json وتضيف الحزم المطلوبة إلى ملف مشروع مكتبة فئة C#‎ extensions.csproj في جذر نظام ملفات Function App (wwwroot). نظراً لأن Core Tools يستخدم dotnet.exe، يمكنك استخدامه لإضافة أي مرجع لحزمة NuGet إلى ملف الملحقات هذا. أثناء التثبيت، تقوم Core Tools بإنشاء extension.csproj لتثبيت المكتبات المطلوبة. فيما يلي مثال على ملف extensions.csproj الذي يضيف مرجعا إلى Microsoft.ProjectOxford.Face الإصدار 1.1.0:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.ProjectOxford.Face" Version="1.1.0" />
    </ItemGroup>
</Project>

إشعار

بالنسبة للبرنامج النصي C# (.csx)، يجب تعيين TargetFramework إلى قيمة netstandard2.0. أطر العمل الهدف الأخرى، مثل net6.0، غير مدعومة.

لاستخدام موجز NuGet مخصص، حدد الموجز في ملف Nuget.Config في مجلد الجذر Function App. لمزيدٍ من المعلومات، راجع Configuring NuGet behavior.

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

متغيرات البيئة

للحصول على متغير بيئة أو قيمة إعداد تطبيق، استخدم System.Environment.GetEnvironmentVariable، كما هو موضح في مثال التعليمات البرمجية التالي:

public static void Run(TimerInfo myTimer, ILogger log)
{
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
    log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
    log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
}

public static string GetEnvironmentVariable(string name)
{
    return name + ": " +
        System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
}

نهُج إعادة المحاولة

تدعم الدالات نهجين مضمنين لإعادة المحاولة. لمزيد من المعلومات، راجع نُهج إعادة المحاولة.

إليك سياسة إعادة المحاولة في ملف function.json:

{
    "disabled": false,
    "bindings": [
        {
            ....
        }
    ],
    "retry": {
        "strategy": "fixedDelay",
        "maxRetryCount": 4,
        "delayInterval": "00:00:10"
    }
}
خاصية function.json ‏‏الوصف
strategy استخدم fixedDelay.
maxRetryCount مطلوب. الحد الأقصى لعدد المحاولات المسموح بها لكل تنفيذ وظيفة. تعني -1 إعادة المحاولة إلى أجل غير مسمى.
delayInterval التأخير المستخدم بين عمليات إعادة المحاولة. حددها كسلسلة بالتنسيق HH:mm:ss.

الربط في وقت التشغيل

في C#‎ ولغات ‎.NET الأخرى، يمكنك استخدام نمط ربط إلزامي، بدلاً من الارتباطات التعريفية في function.json. الربط الحتمي مفيد عندما تحتاج معلمات الربط إلى حسابها في وقت التشغيل بدلاً من وقت التصميم. مع هذا النمط، يمكنك الربط إلى ارتباطات الإدخال والإخراج المدعومة في أثناء العمل في التعليمات البرمجية للوظيفة.

عرف الربط الحتمي كما يلي:

  • لا تقم بتضمين إدخال في function.json للارتباطات الإلزامية التي ترغب فيها.
  • قم بتمرير معلمة إدخال Binder binder أو IBinder binder.
  • استخدم نمط C#‎ التالي لتنفيذ ربط البيانات.
using (var output = await binder.BindAsync<T>(new BindingTypeAttribute(...)))
{
    ...
}

تُعد BindingTypeAttribute سمة ‎.NET التي تعرف الربط الخاص بك ويُعد T نوع إدخال أو إخراج مدعوم من قِبل نوع الربط هذا. T لا يمكن أن يكون نوع معلمة out (مثل out JObject). على سبيل المثال، يدعم ربط مخرجات جدول تطبيقات الجوال ستة أنواع من المخرجات، ولكن يمكنك فقط استخدام ICollector<T> أو IAsyncCollector<T> لـ T.

مثال على السمة الفردية

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

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;

public static async Task Run(string input, Binder binder)
{
    using (var writer = await binder.BindAsync<TextWriter>(new BlobAttribute("samples-output/path")))
    {
        writer.Write("Hello World!!");
    }
}

يُعرّف BlobAttribute ربط إدخال أو إخراج كائن التخزين الثنائي كبير الحجم، ويُعد TextWriter نوع ربط إخراج مدعومًا.

مثال سمات متعددة

يعمل المثال السابق على إعداد التطبيق لسلسلة اتصال حساب التخزين الرئيسي للتطبيق (وهو AzureWebJobsStorage). ويمكنك تحديد إعداد تطبيق مخصص لاستخدامه لحساب التخزين عن طريق إضافة StorageAccountAttribute وتمرير صفيف السمة إلى BindAsync<T>(). استخدم معلمةBinder وليس IBinder . على سبيل المثال:

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;

public static async Task Run(string input, Binder binder)
{
    var attributes = new Attribute[]
    {
        new BlobAttribute("samples-output/path"),
        new StorageAccountAttribute("MyStorageAccount")
    };

    using (var writer = await binder.BindAsync<TextWriter>(attributes))
    {
        writer.Write("Hello World!");
    }
}

يسرد الجدول التالي سمات .NET لكل نوع ربط والحزم التي تم تعريفها فيها.

Binding السمة إضافة مرجع
Azure Cosmos DB Microsoft.Azure.WebJobs.DocumentDBAttribute #r "Microsoft.Azure.WebJobs.Extensions.CosmosDB"
مراكز الأحداث Microsoft.Azure.WebJobs.ServiceBus.EventHubAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttribute #r "Microsoft.Azure.Jobs.ServiceBus"
تطبيقات الأجهزة المحمولة Microsoft.Azure.WebJobs.MobileTableAttribute #r "Microsoft.Azure.WebJobs.Extensions.MobileApps"
مراكز الإعلام Microsoft.Azure.WebJobs.NotificationHubAttribute #r "Microsoft.Azure.WebJobs.Extensions.NotificationHubs"
ناقل الخدمة Microsoft.Azure.WebJobs.ServiceBusAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttribute #r "Microsoft.Azure.WebJobs.ServiceBus"
قائمة انتظار التخزين Microsoft.Azure.WebJobs.QueueAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
كائن التخزين الثنائي كبير الحجم Microsoft.Azure.WebJobs.BlobAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
جدول التخزين Microsoft.Azure.WebJobs.TableAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
Twilio Microsoft.Azure.WebJobs.TwilioSmsAttribute #r "Microsoft.Azure.WebJobs.Extensions.Twilio"

تحويل تطبيق برنامج نصي C# إلى مشروع C#‎

أسهل طريقة لتحويل تطبيق دالة البرنامج النصي C# إلى مشروع مكتبة فئة C# مجمعة هي البدء بمشروع جديد. يمكنك بعد ذلك، لكل دالة، ترحيل التعليمات البرمجية والتكوين من كل ملف run.csx وملف function.json في مجلد دالة إلى ملف رمز مكتبة فئة .cs جديد واحد. على سبيل المثال، عندما يكون لديك دالة برنامج نصي C# باسم HelloWorld سيكون لديك ملفان: HelloWorld/run.csx و HelloWorld/function.json. لهذه الدالة، يمكنك إنشاء ملف تعليمة برمجية باسم HelloWorld.cs في مشروع مكتبة الفئة الجديدة.

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

توضح لك هذه الإرشادات كيفية تحويل وظائف البرنامج النصي C# (التي يتم تشغيلها أثناء العملية مع مضيف الوظائف) إلى وظائف مكتبة فئة C# التي تعمل في عملية عامل معزولة.

  1. أكمل قسم إنشاء مشروع تطبيق الوظائف من التشغيل السريع المفضل لديك:


  1. إذا كان رمز البرنامج النصي C# الأصلي يتضمن ملفا extensions.csproj أو أي function.proj ملفات، فانسخ مراجع الحزمة من هذا الملف وأضفها إلى ملف المشروع .csproj الجديد بنفس الطريقة ItemGroup مع التبعيات الأساسية للوظائف.

    تلميح

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

  2. انسخ محتويات الملف الأصلي host.json إلى ملف المشروع host.json الجديد، باستثناء extensionBundles المقطع (لا تستخدم مشاريع C# المحولة برمجيا حزم الملحقات ويجب عليك إضافة مراجع إلى جميع الملحقات التي تستخدمها الوظائف بشكل صريح). عند دمج ملفات host.json، تذكر أن host.json المخطط تم إصداره، مع معظم التطبيقات التي تستخدم الإصدار 2.0. يمكن أن تختلف محتويات extensions القسم استنادا إلى إصدارات محددة من ملحقات الربط المستخدمة من قبل وظائفك. راجع المقالات المرجعية للملحق الفردي لمعرفة كيفية تكوين host.json لإصداراتك المحددة بشكل صحيح.

  3. لأي ملفات مشتركة المشار إليها بواسطة #load توجيه، قم بإنشاء ملف جديد .cs لكل من هذه المراجع المشتركة. من الأسهل إنشاء ملف جديد .cs لكل تعريف فئة مشتركة. إذا كانت هناك أساليب ثابتة بدون فئة، تحتاج إلى تعريف فئات جديدة لهذه الأساليب.

  4. قم بتنفيذ المهام التالية لكل <FUNCTION_NAME> مجلد في مشروعك الأصلي:

    1. أنشئ ملفا جديدا باسم <FUNCTION_NAME>.cs، واستبدل <FUNCTION_NAME> باسم المجلد الذي حدد دالة البرنامج النصي C#. يمكنك إنشاء ملف تعليمة برمجية دالة جديد من أحد القوالب الخاصة بالمشغل بالطريقة التالية:

      func new --name <FUNCTION_NAME> استخدام الأمر واختيار قالب المشغل الصحيح في المطالبة.

    2. انسخ العبارات using من run.csx الملف وأضفها إلى الملف الجديد. لا تحتاج إلى أي #r توجيهات.

    3. #load لأي عبارة في الملف، run.csx أضف عبارة جديدة using لمساحة الاسم التي استخدمتها للتعليمات البرمجية المشتركة.

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

    5. إنشاء أسلوب جديد باسم RunHandler أو شيء مشابه. يعمل هذا الأسلوب الجديد كنقطة إدخال جديدة للدالة.

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

    7. لكل ربط في function.json الملف، أضف السمة المقابلة إلى الأسلوب الجديد. للعثور بسرعة على أمثلة الربط، راجع إضافة روابط يدويا استنادا إلى الأمثلة.

    8. أضف أي حزم ملحق مطلوبة من قبل الروابط إلى مشروعك، إذا لم تكن قد فعلت ذلك بالفعل.

  5. أعد إنشاء أي إعدادات تطبيق مطلوبة من قبل تطبيقك في Values مجموعة ملف local.settings.json.

  6. تحقق من تشغيل المشروع محليا:

    استخدم func start لتشغيل تطبيقك من سطر الأوامر. لمزيد من المعلومات، راجع تشغيل الوظائف محليا.

  7. انشر مشروعك إلى تطبيق وظائف جديد في Azure:

    إنشاء موارد Azure ونشر مشروع التعليمات البرمجية إلى Azure باستخدام func azure functionapp publish <APP_NAME> الأمر . لمزيد من المعلومات، راجع توزيع ملفات المشروع.

مثال على تحويل الدالة

يعرض هذا القسم مثالا على الترحيل لدالة واحدة.

تحتوي الدالة الأصلية في البرمجة النصية C# على ملفين:

  • HelloWorld/function.json
  • HelloWorld/run.csx

محتويات HelloWorld/function.json هي:

{
  "bindings": [
    {
      "authLevel": "FUNCTION",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    }
  ]
}

محتويات HelloWorld/run.csx هي:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;

    string responseMessage = string.IsNullOrEmpty(name)
        ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
                : $"Hello, {name}. This HTTP triggered function executed successfully.";

            return new OkObjectResult(responseMessage);
}

بعد الترحيل إلى نموذج العامل المعزول مع تكامل ASP.NET Core، يتم استبدالها ب HelloWorld.cs:

using System.Net;
using Microsoft.Azure.Functions.Worker;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

namespace MyFunctionApp
{
    public class HelloWorld
    {
        private readonly ILogger _logger;

        public HelloWorld(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<HelloWorld>();
        }

        [Function("HelloWorld")]
        public async Task<IActionResult> RunHandler([HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req)
        {
            return await Run(req, _logger);
        }

        // From run.csx
        public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            string responseMessage = string.IsNullOrEmpty(name)
                ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
                        : $"Hello, {name}. This HTTP triggered function executed successfully.";

            return new OkObjectResult(responseMessage);
        }
    }
}

تكوين الربط والأمثلة

يحتوي هذا القسم على مراجع وأمثلة لتعريف المشغلات والروابط في البرنامج النصي C#‎.

مشغل كائن ثنائي كبير الحجم

يوضح الجدول التالي خصائص تكوين الربط للبرنامج النصي C# الذي قمت بتعيينه في ملف function.json .

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى blobTrigger. يتم تعيين هذه الخاصية تلقائيا عند إنشاء المشغل في مدخل Microsoft Azure.
الاتجاه يجب تعيينه إلى in. يتم تعيين هذه الخاصية تلقائيا عند إنشاء المشغل في مدخل Microsoft Azure.
الاسم اسم المتغير الذي يمثل blob في التعليمات البرمجية الدالة.
المسار الحاوية المطلوب مراقبتها. قد يكون نمط اسم كائن ثنائي كبير الحجم.
الاتصال اسم إعداد تطبيق أو مجموعة إعداد تحدد كيفية الاتصال بـ Azure Blobs. راجع الاتصالات.

يوضح المثال التالي تعريف مشغل كائن ثنائي كبير الحجم في ملف function.json ورمز يستخدم الربط. تقوم الوظيفة بكتابة سجل عند إضافة كائن ثنائي كبير الحجم أو تحديثه في samples-workitems الحاوية.

فيما يلي بيانات الربط في ملفfunction.json:

{
    "disabled": false,
    "bindings": [
        {
            "name": "myBlob",
            "type": "blobTrigger",
            "direction": "in",
            "path": "samples-workitems/{name}",
            "connection":"MyStorageAccountAppSetting"
        }
    ]
}

تنشئ السلسلة {name} في مسار مشغل كائن ثنائي كبير الحجمsamples-workitems/{name}تعبير ربط الذي يمكنك استخدامه في التعليمات البرمجية للوظيفة للوصول إلى اسم الملف لتشغيل الكائن الثنائي كبير الحجم. لمزيد من المعلومات، راجع أنماط اسم Blob.

فيما يلي التعليمة البرمجية لبرنامج C# النصي التي ترتبط بـ Stream:

public static void Run(Stream myBlob, string name, ILogger log)
{
   log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}

فيما يلي التعليمة البرمجية لبرنامج C# النصي التي ترتبط بـ CloudBlockBlob:

#r "Microsoft.WindowsAzure.Storage"

using Microsoft.WindowsAzure.Storage.Blob;

public static void Run(CloudBlockBlob myBlob, string name, ILogger log)
{
    log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name}\nURI:{myBlob.StorageUri}");
}

إدخال كائن ثنائي كبير الحجم

يوضح الجدول التالي خصائص تكوين الربط للبرنامج النصي C# الذي قمت بتعيينه في ملف function.json .

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى blob.
الاتجاه يجب تعيينه إلى in.
الاسم اسم المتغير الذي يمثل blob في التعليمات البرمجية الدالة.
المسار المسار إلى كائن ثنائي كبير الحجم.
الاتصال اسم إعداد تطبيق أو مجموعة إعداد تحدد كيفية الاتصال بـ Azure Blobs. راجع الاتصالات.

يوضح المثال التالي روابط إدخال وإخراج كائن ثنائي كبير الحجم في ملف function.json ورمز البرنامج النصي C# الذي يستخدم الارتباطات. تصدر الدالة يجعل نسخة من text blob. يتم تشغيل الدالة بواسطة رسالة قائمة انتظار تحتوي على blob للنسخ. تُسمى blob الجديدة {originalblobname}-Copy.

في ملفfunction.json، queueTriggerتُستخدم خاصية بيانات التعريف لتحديد اسم blob في path الخصائص:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "myOutputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}-Copy",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false
}

هذا هو كود البرنامج النصي #C:

public static void Run(string myQueueItem, string myInputBlob, out string myOutputBlob, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    myOutputBlob = myInputBlob;
}

إخراج كائن ثنائي كبير الحجم

يوضح الجدول التالي خصائص تكوين الربط للبرنامج النصي C# الذي قمت بتعيينه في ملف function.json .

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى blob.
الاتجاه يجب تعيينه إلى out.
الاسم اسم المتغير الذي يمثل blob في التعليمات البرمجية الدالة.
المسار المسار إلى كائن ثنائي كبير الحجم.
الاتصال اسم إعداد تطبيق أو مجموعة إعداد تحدد كيفية الاتصال بـ Azure Blobs. راجع الاتصالات.

يوضح المثال التالي روابط إدخال وإخراج كائن ثنائي كبير الحجم في ملف function.json ورمز البرنامج النصي C# الذي يستخدم الارتباطات. تصدر الدالة يجعل نسخة من text blob. يتم تشغيل الدالة بواسطة رسالة قائمة انتظار تحتوي على blob للنسخ. تُسمى blob الجديدة {originalblobname}-Copy.

في ملفfunction.json، queueTriggerتُستخدم خاصية بيانات التعريف لتحديد اسم blob في path الخصائص:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "myOutputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}-Copy",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false
}

هذا هو كود البرنامج النصي #C:

public static void Run(string myQueueItem, string myInputBlob, out string myOutputBlob, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    myOutputBlob = myInputBlob;
}

RabbitMQ trigger

يظهر المثال التالي ربط مشغل RabbitMQ في ملف function.json ووظيفة البرنامج النصي لـ C#‎ التي تستخدم الربط. تقرأ الوظيفة رسالة RabbitMQ وتسجلها.

فيما يلي بيانات الربط في ملفfunction.json:

{​​
    "bindings": [
        {​​
            "name": "myQueueItem",
            "type": "rabbitMQTrigger",
            "direction": "in",
            "queueName": "queue",
            "connectionStringSetting": "rabbitMQConnectionAppSetting"
        }​​
    ]
}​​

هذا هو كود البرنامج النصي #C:

using System;

public static void Run(string myQueueItem, ILogger log)
{​​
    log.LogInformation($"C# Script RabbitMQ trigger function processed: {​​myQueueItem}​​");
}​​

مشغِّل قائمة الانتظار

يوضح الجدول التالي خصائص تكوين الربط للبرنامج النصي C# الذي قمت بتعيينه في ملف function.json .

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى queueTrigger. يتم تعيين هذه الخاصية تلقائيا عند إنشاء المشغل في مدخل Microsoft Azure.
الاتجاه فيدالة.jsonملف فقط. يجب تعيينه إلى in. يتم تعيين هذه الخاصية تلقائيا عند إنشاء المشغل في مدخل Microsoft Azure.
الاسم اسم المتغير الذي يحتوي على عنصر البيانات الأساسية في قائمة الانتظار في رمز الدالة.
queueName اسم قائمة انتظار الاستطلاع.
الاتصال اسم إعداد التطبيق أو مجموعة إعداد تحدد كيفية الاتصال بقوائم انتظار Azure. راجع الاتصالات.

يظهر المثال التالي ربط مشغل قائمة انتظار في ملف function.json ورمز البرنامج النصي C# الذي يستخدم الربط. دالة استطلاعات قائمة الانتظار myqueue-items وتكتب سجل في كل مرة تتم معالجة عنصر قائمة انتظار.

إليك الملف function.json:

{
    "disabled": false,
    "bindings": [
        {
            "type": "queueTrigger",
            "direction": "in",
            "name": "myQueueItem",
            "queueName": "myqueue-items",
            "connection":"MyStorageConnectionAppSetting"
        }
    ]
}

هذا هو كود البرنامج النصي #C:

#r "Microsoft.WindowsAzure.Storage"

using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Queue;
using System;

public static void Run(CloudQueueMessage myQueueItem, 
    DateTimeOffset expirationTime, 
    DateTimeOffset insertionTime, 
    DateTimeOffset nextVisibleTime,
    string queueTrigger,
    string id,
    string popReceipt,
    int dequeueCount,
    ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem.AsString}\n" +
        $"queueTrigger={queueTrigger}\n" +
        $"expirationTime={expirationTime}\n" +
        $"insertionTime={insertionTime}\n" +
        $"nextVisibleTime={nextVisibleTime}\n" +
        $"id={id}\n" +
        $"popReceipt={popReceipt}\n" + 
        $"dequeueCount={dequeueCount}");
}

إخراج قائمة الانتظار

يوضح الجدول التالي خصائص تكوين الربط للبرنامج النصي C# الذي قمت بتعيينه في ملف function.json .

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى queue. يتم تعيين هذه الخاصية تلقائيا عند إنشاء المشغل في مدخل Microsoft Azure.
الاتجاه يجب تعيينه إلى out. يتم تعيين هذه الخاصية تلقائيا عند إنشاء المشغل في مدخل Microsoft Azure.
الاسم اسم المتغير الذي يمثل قائمة الانتظار في التعليمة البرمجية للدالة. تعيين $return إلى مرجع القيمة المرجعة للدالة.
queueName اسم الصف.
الاتصال اسم إعداد التطبيق أو مجموعة إعداد تحدد كيفية الاتصال بقوائم انتظار Azure. راجع الاتصالات.

يوضح المثال التالي ربط مشغل HTTP في ملف function.json ورمز البرنامج النصي C# الذي يستخدم الربط. تُنشئ الدالة عنصر قائمة انتظار مع حمولة كائن CustomQueueMessage لكل طلب HTTP يتم استلامه.

إليك الملف function.json:

{
  "bindings": [
    {
      "type": "httpTrigger",
      "direction": "in",
      "authLevel": "function",
      "name": "input"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "$return",
      "queueName": "outqueue",
      "connection": "MyStorageConnectionAppSetting"
    }
  ]
}

إليك التعليمات البرمجية لبرنامج #C النصي الذي ينشئ رسالة قائمة انتظار واحدة:

public class CustomQueueMessage
{
    public string PersonName { get; set; }
    public string Title { get; set; }
}

public static CustomQueueMessage Run(CustomQueueMessage input, ILogger log)
{
    return input;
}

يمكنك إرسال رسائل متعددة مرة واحدة باستخدام معلمة ICollector أو IAsyncCollector. إليك التعليمات البرمجية لبرنامج C# النصي الذي يرسل رسائل متعددة، واحدة مع بيانات طلب HTTP وواحدة مع قيم تعليمات برمجية مضمّنة:

public static void Run(
    CustomQueueMessage input, 
    ICollector<CustomQueueMessage> myQueueItems, 
    ILogger log)
{
    myQueueItems.Add(input);
    myQueueItems.Add(new CustomQueueMessage { PersonName = "You", Title = "None" });
}

إدخال الجدول

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

يوضح الجدول التالي خصائص تكوين الربط للبرنامج النصي C# الذي قمت بتعيينه في ملف function.json .

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى table. تعيَّن هذه الخاصية تلقائيًا عند إنشاء الربط في مدخل Azure.
الاتجاه يجب تعيينه إلى in. تعيَّن هذه الخاصية تلقائيًا عند إنشاء الربط في مدخل Azure.
الاسم اسم المتغير الذي يمثل جدول أو كيان في تعليمة برمجية للدالة.
اسم الجدول اسم الجدول.
partitionKey اختياري. مفتاح القسم الخاص بكيان الجدول المراد قراءته.
rowKey اختياري. مفتاح السجل الخاص بكيان الجدول المراد قراءته. لا يمكن استخدامها مع take أو filter.
الوقت المستغرق اختياري. الحد الأقصى لعدد الكيانات التي يجب إرجاعها. لا يمكن استخدامها مع rowKey.
filter اختياري. تعبير عامل تصفية OData للكيانات للعودة من الجدول. لا يمكن استخدامها مع rowKey.
الاتصال اسم إعداد التطبيق أو مجموعة الإعدادات التي تحدد كيفية الاتصال بخدمة الجدول. راجع الاتصالات.

يوضح المثال التالي ربط إدخال جدول في ملف function.json ورمز البرنامج النصي C# الذي يستخدم الربط. تستخدم الدالة مشغل صف كي يقرأ سجل واحد في جدول.

يحدد ملفfunction.jsonملف a partitionKey و arowKey. تشير القيمة rowKey {queueTrigger} إلى أن مفتاح الصف يأتي من سلسلة رسالة قائمة الانتظار.

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "personEntity",
      "type": "table",
      "tableName": "Person",
      "partitionKey": "Test",
      "rowKey": "{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    }
  ],
  "disabled": false
}

هذا هو كود البرنامج النصي #C:

#r "Azure.Data.Tables"
using Microsoft.Extensions.Logging;
using Azure.Data.Tables;

public static void Run(string myQueueItem, Person personEntity, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    log.LogInformation($"Name in Person entity: {personEntity.Name}");
}

public class Person : ITableEntity
{
    public string Name { get; set; }

    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public DateTimeOffset? Timestamp { get; set; }
    public ETag ETag { get; set; }
}

إخراج الجدول

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

يوضح الجدول التالي خصائص تكوين الربط للبرنامج النصي C# الذي قمت بتعيينه في ملف function.json .

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى table. تعيَّن هذه الخاصية تلقائيًا عند إنشاء الربط في مدخل Azure.
الاتجاه يجب تعيينه إلى out. تعيَّن هذه الخاصية تلقائيًا عند إنشاء الربط في مدخل Azure.
الاسم اسم المتغير المُستخدَّم في التعليمة البرمجية للدالة التي تمثل الجدول أو الكيان. تعيين $return إلى مرجع القيمة المرجعة للدالة.
اسم الجدول اسم الجدول المراد الكتابة فيه.
partitionKey مفتاح القسم الخاص بكيان الجدول المراد قراءته.
rowKey مفتاح السجل الخاص بكيان الجدول المراد قراءته.
الاتصال اسم إعداد التطبيق أو مجموعة الإعدادات التي تحدد كيفية الاتصال بخدمة الجدول. راجع الاتصالات.

يوضح المثال التالي ربط إخراج جدول في ملف function.json ورمز البرنامج النصي C# الذي يستخدم الربط. تكتب الدالة كيانات جدول متعددة.

إليك الملف function.json:

{
  "bindings": [
    {
      "name": "input",
      "type": "manualTrigger",
      "direction": "in"
    },
    {
      "tableName": "Person",
      "connection": "MyStorageConnectionAppSetting",
      "name": "tableBinding",
      "type": "table",
      "direction": "out"
    }
  ],
  "disabled": false
}

هذا هو كود البرنامج النصي #C:

public static void Run(string input, ICollector<Person> tableBinding, ILogger log)
{
    for (int i = 1; i < 10; i++)
        {
            log.LogInformation($"Adding Person entity {i}");
            tableBinding.Add(
                new Person() { 
                    PartitionKey = "Test", 
                    RowKey = i.ToString(), 
                    Name = "Name" + i.ToString() }
                );
        }

}

public class Person
{
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public string Name { get; set; }
}

مشغل المؤقت

يوضح الجدول التالي خصائص تكوين الربط للبرنامج النصي C# الذي قمت بتعيينه في ملف function.json .

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى timerTrigger. يتم تعيين هذه الخاصية تلقائيا عند إنشاء المشغل في مدخل Microsoft Azure.
الاتجاه يجب تعيينه إلى in. يتم تعيين هذه الخاصية تلقائيا عند إنشاء المشغل في مدخل Microsoft Azure.
الاسم اسم المتغير الذي يمثل كائن المؤقت في التعليمات البرمجية للدالة.
جدول تعبير CRON أو قيمة TimeSpan. يمكن استخدام TimeSpan فقط لتطبيق الوظائف الذي يعمل على خطة خدمة التطبيقات. يمكنك وضع تعبير الجدولة في أحد إعدادات التطبيق وتعيين هذه الخاصية إلى اسم إعداد التطبيق المُتضمَّن في علامات %، كما في هذا المثال: "٪ScheduleAppSetting٪".
runOnStartup إذا true، تُستدعى الدالة عند بدء تشغيل وقت التشغيل. على سبيل المثال، يبدأ وقت التشغيل عندما ينشط تطبيق الوظائف بعد أن يصبح خاملاً بسبب عدم النشاط. عند إعادة تشغيل تطبيق الوظائف بسبب تغييرات الوظيفة، وعندما يتم توسيع نطاق تطبيق الوظائف. استخدم بحذر. يجب أن نادرا ما يتم تعيين runOnStartup إلى true، خاصة في الإنتاج.
useMonitor تعيين إلى true أو false للإشارة إلى ما إذا كان يجب مراقبة الجدول. تستمر مراقبة الجدول في تكرار حدوث الجدول للمساعدة على ضمان الحفاظ على الجدول الزمني بصورةٍ صحيحةٍ حتى عند إعادة تشغيل مثيلات تطبيق الوظائف. في حالة عدم التعيين صراحةً، فسيكون الإعداد الافتراضي هو true للجداول التي لها فاصل زمني للتكرار أكبر من أو يساوي دقيقةً واحدةً. بالنسبة للجداول التي تُشغَّل أكثر من مرة في الدقيقة، يكون الإعداد الافتراضي هو false.

يوضح المثال التالي ربط مشغل المؤقت في ملف function.json ودالة البرنامج النصي C# التي تستخدم الربط. تكتب الدالة سجلاً يشير إلى ما إذا كان استدعاء هذه الدالة ناتجاً عن خطأ عند حدوث الجدولة. يُمرر الكائن TimerInfo إلى الدالة.

فيما يلي بيانات الربط في ملفfunction.json:

{
    "schedule": "0 */5 * * * *",
    "name": "myTimer",
    "type": "timerTrigger",
    "direction": "in"
}

هذا هو كود البرنامج النصي #C:

public static void Run(TimerInfo myTimer, ILogger log)
{
    if (myTimer.IsPastDue)
    {
        log.LogInformation("Timer is running late!");
    }
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}" );  
}

مشغل HTTP

يوضح الجدول التالي خصائص تكوين المشغل التي قمت بتعيينها في ملف function.json :

خاصية function.json ‏‏الوصف
النوع مطلوب - يجب تعيينه إلى httpTrigger.
الاتجاه مطلوب - يجب تعيينه إلى in.
الاسم مطلوب - اسم المتغير المستخدم في التعليمات البرمجية للدالة للطلب أو نص الطلب.
authLevel تحديد المفاتيح، إن وجدت، التي يجب أن تكون موجودة عند الطلب لاستدعاء الدالة. للحصول على القيم المدعومة، راجع مستوى التخويل.
الأساليب صفيف من طرق HTTP التي تستجيب لها الوظيفة. في حالة عدم التحديد، تستجيب الدالة لكافة أساليب HTTP. راجع تخصيص نقطة نهاية HTTP.
المسار تحديد قالب المسار، الذي يتحكم في عناوين URLs للطلب التي تستجيب الدالة الخاص بك إليها. القيمة الافتراضية إذا لم يتم توفير أي شيء هي <functionname>. لمزيد من المعلومات، راجع تخصيص نقطة نهاية HTTP.
webHookType معتمدة فقط لوقت تشغيل الإصدار 1.x.

تكوين مشغل HTTP ليكون بمثابة مستقبل إخطار على الويب للموفر المحدد. لمعرفة القيم المدعومة، راجع نوع WebHook.

يوضح المثال التالي ربط مشغل في ملف function.json ودالة البرنامج النصي C# التي تستخدم الربط. تبحث الدالة عن معلمة name إما في سلسلة الاستعلام أو نص طلب HTTP.

إليك الملف function.json:

{
    "disabled": false,
    "bindings": [
        {
            "authLevel": "function",
            "name": "req",
            "type": "httpTrigger",
            "direction": "in",
            "methods": [
                "get",
                "post"
            ]
        },
        {
            "name": "$return",
            "type": "http",
            "direction": "out"
        }
    ]
}

فيما يلي التعليمة البرمجية لبرنامج C#‎ النصي التي ترتبط بـ HttpRequest:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];
    
    string requestBody = String.Empty;
    using (StreamReader streamReader =  new  StreamReader(req.Body))
    {
        requestBody = await streamReader.ReadToEndAsync();
    }
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;
    
    return name != null
        ? (ActionResult)new OkObjectResult($"Hello, {name}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

يمكنك ربط كائن مخصص بدلاً من HttpRequest. يتم إنشاء هذا الكائن من نص الطلب ويتم تحليله كـ JSON. وبالمثل، يمكن تمرير نوع إلى ربط مخرجات استجابة HTTP وإعادته كنص الاستجابة، مع رمز الحالة 200.

using System.Net;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

public static string Run(Person person, ILogger log)
{   
    return person.Name != null
        ? (ActionResult)new OkObjectResult($"Hello, {person.Name}")
        : new BadRequestObjectResult("Please pass an instance of Person.");
}

public class Person {
     public string Name {get; set;}
}

إخراج HTTP

يشرح الجدول الآتي خصائص تكوين ربط البيانات التي عليك تعيينها في ملف function.json.

الخاصية الوصف
النوع يجب تعيينه إلى http.
الاتجاه يجب تعيينه إلى out.
الاسم اسم المتغيّر المستخدم في تعليمة برمجية للدالة للاستجابة أو $return لاستخدام القيمة المرجعة.

مشغل مراكز الأحداث

يوضح الجدول التالي خصائص تكوين المشغل التي قمت بتعيينها في ملف function.json :

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى eventHubTrigger. يتم تعيين هذه الخاصية تلقائيا عند إنشاء المشغل في مدخل Microsoft Azure.
الاتجاه يجب تعيينه إلى in. يتم تعيين هذه الخاصية تلقائيا عند إنشاء المشغل في مدخل Microsoft Azure.
الاسم اسم المتغير الذي يمثل عنصر الحدث في التعليمات البرمجية للوظيفة.
eventHubName الدالات 2.x وأعلى. اسم مركز الأحداث. عندما يكون اسم مركز الأحداث موجودًا أيضًا في سلسلة الاتصال، هذه القيمة تتجاوز هذه الخاصية في وقت التشغيل. يمكن الرجوع إليها عبر إعدادات %eventHubName%التطبيق . في الإصدار 1.x، تسمى هذه الخاصية path.
consumerGroup خاصية اختيارية تعمل على تعيين مجموعة المستهلكين المستخدمة للاشتراك في الأحداث في المركز. عند حذفها، يتم استخدام مجموعة المستهلكين $Default.
الاتصال اسم إعداد التطبيق أو مجموعة الإعدادات التي تحدد طريقة الاتصال بمراكز الأحداث. راجع الاتصالات.

يوضح المثال التالي ربط مشغل مراكز الأحداث في ملف function.json ودالة برنامج نصي C# تستخدم الربط. الوظيفة تسجل نص الرسالة لمشغل مراكز الأحداث.

توضح الأمثلة التالية بيانات ربط "مراكز الأحداث" في ملف function.json للإصدار 2.x من وقت تشغيل الوظائف والإصدارات الأحدث.

{
  "type": "eventHubTrigger",
  "name": "myEventHubMessage",
  "direction": "in",
  "eventHubName": "MyEventHub",
  "connection": "myEventHubReadConnectionAppSetting"
}

هذا هو كود البرنامج النصي #C:

using System;

public static void Run(string myEventHubMessage, TraceWriter log)
{
    log.Info($"C# function triggered to process a message: {myEventHubMessage}");
}

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

#r "Microsoft.Azure.EventHubs"

using System.Text;
using System;
using Microsoft.ServiceBus.Messaging;
using Microsoft.Azure.EventHubs;

public void Run(EventData myEventHubMessage,
    DateTime enqueuedTimeUtc,
    Int64 sequenceNumber,
    string offset,
    TraceWriter log)
{
    log.Info($"Event: {Encoding.UTF8.GetString(myEventHubMessage.Body)}");
    log.Info($"EnqueuedTimeUtc={myEventHubMessage.SystemProperties.EnqueuedTimeUtc}");
    log.Info($"SequenceNumber={myEventHubMessage.SystemProperties.SequenceNumber}");
    log.Info($"Offset={myEventHubMessage.SystemProperties.Offset}");

    // Metadata accessed by using binding expressions
    log.Info($"EnqueuedTimeUtc={enqueuedTimeUtc}");
    log.Info($"SequenceNumber={sequenceNumber}");
    log.Info($"Offset={offset}");
}

لتلقي الأحداث في دفعة، قم بإنشاء صفيف string أو EventData:

public static void Run(string[] eventHubMessages, TraceWriter log)
{
    foreach (var message in eventHubMessages)
    {
        log.Info($"C# function triggered to process a message: {message}");
    }
}

إخراج مراكز الأحداث

يشرح الجدول الآتي خصائص تكوين ربط البيانات التي عليك تعيينها في ملف function.json.

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى eventHub.
الاتجاه يجب تعيينه إلى out. يتم تعيين هذه المعلمة تلقائيًا عند إنشاء الربط في مدخل Azure.
الاسم اسم المتغير المستخدم في التعليمات البرمجية للدالة التي تمثل الحدث.
eventHubName الدالات 2.x وأعلى. اسم مركز الأحداث. عندما يكون اسم مركز الأحداث موجودًا أيضًا في سلسلة الاتصال، هذه القيمة تتجاوز هذه الخاصية في وقت التشغيل. في الوظائف 1.x، تم تسمية هذه الخاصية باسم path.
الاتصال اسم إعداد التطبيق أو مجموعة الإعدادات التي تحدد طريقة الاتصال بمراكز الأحداث. لمعرفة المزيد، راجع الاتصالات.

يوضح المثال التالي ربط مشغل مركز الأحداث في ملف function.json ودالة البرنامج النصي C# التي تستخدم الربط. تقوم الوظيفة بكتابة رسالة إلى مركز الحدث.

توضح الأمثلة التالية بيانات ربط "مراكز الأحداث" في ملف function.json للإصدار 2.x من وقت تشغيل الوظائف والإصدارات الأحدث.

{
    "type": "eventHub",
    "name": "outputEventHubMessage",
    "eventHubName": "myeventhub",
    "connection": "MyEventHubSendAppSetting",
    "direction": "out"
}

إليك كود البرنامج النصي C# الذي ينشئ رسالة واحدة:

using System;
using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, out string outputEventHubMessage, ILogger log)
{
    String msg = $"TimerTriggerCSharp1 executed at: {DateTime.Now}";
    log.LogInformation(msg);   
    outputEventHubMessage = msg;
}

إليك التعليمات البرمجية لبرنامج #C النصي الذي ينشئ عدة رسائل:

public static void Run(TimerInfo myTimer, ICollector<string> outputEventHubMessage, ILogger log)
{
    string message = $"Message created at: {DateTime.Now}";
    log.LogInformation(message);
    outputEventHubMessage.Add("1 " + message);
    outputEventHubMessage.Add("2 " + message);
}

مشغل Event Grid

يوضح الجدول التالي خصائص تكوين الربط للبرنامج النصي C# الذي قمت بتعيينه في ملف function.json . لا توجد خصائص أو معلمات دالة إنشائية ليتم تعيينها في سمة EventGridTrigger.

خاصية function.json ‏‏الوصف
النوع مطلوب - يجب تعيينه إلى eventGridTrigger.
الاتجاه مطلوب - يجب تعيينه إلى in.
الاسم مطلوب - اسم المتغير المستخدم في التعليمة البرمجية للدالة للمعلمة التي تتلقى بيانات الحدث.

يوضح المثال التالي مشغل شبكة الأحداث المحدد في ملف function.json.

فيما يلي بيانات الربط في ملفfunction.json:

{
  "bindings": [
    {
      "type": "eventGridTrigger",
      "name": "eventGridEvent",
      "direction": "in"
    }
  ],
  "disabled": false
}

فيما يلي مثال على وظيفة البرنامج النصي C # التي تستخدم معلمة ربط EventGridEvent:

#r "Azure.Messaging.EventGrid"
using Azure.Messaging.EventGrid;
using Microsoft.Extensions.Logging;

public static void Run(EventGridEvent eventGridEvent, ILogger log)
{
    log.LogInformation(eventGridEvent.Data.ToString());
}

فيما يلي مثال على وظيفة البرنامج النصي C # التي تستخدم معلمة ربط JObject:

#r "Newtonsoft.Json"

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public static void Run(JObject eventGridEvent, TraceWriter log)
{
    log.Info(eventGridEvent.ToString(Formatting.Indented));
}

إخراج شبكة الأحداث

يوضح الجدول التالي خصائص تكوين الربط للبرنامج النصي C# الذي قمت بتعيينه في ملف function.json .

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى eventGrid.
الاتجاه يجب تعيينه إلى out. يتم تعيين هذه المعلمة تلقائيًا عند إنشاء الربط في مدخل Azure.
الاسم اسم المتغير المستخدم في التعليمات البرمجية للدالة التي تمثل الحدث.
topicEndpointUri اسم إعداد تطبيق يحتوي على عنوان URI للموضوع المخصص، مثل MyTopicEndpointUri.
topicKeySetting اسم إعداد تطبيق يحتوي على مفتاح اختصار للموضوع المخصص.

يظهر المثال التالي بيانات ربط إخراج شبكة الأحداث في ملف function.json.

{
    "type": "eventGrid",
    "name": "outputEvent",
    "topicEndpointUri": "MyEventGridTopicUriSetting",
    "topicKeySetting": "MyEventGridTopicKeySetting",
    "direction": "out"
}

فيما يلي التعليمة البرمجية لبرنامج C# النصي الذي ينشئ حدثًا واحدًا:

#r "Microsoft.Azure.EventGrid"
using System;
using Microsoft.Azure.EventGrid.Models;
using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, out EventGridEvent outputEvent, ILogger log)
{
    outputEvent = new EventGridEvent("message-id", "subject-name", "event-data", "event-type", DateTime.UtcNow, "1.0");
}

فيما يلي التعليمات البرمجية لبرنامج #C النصي الذي ينشئ عدة أحداث:

#r "Microsoft.Azure.EventGrid"
using System;
using Microsoft.Azure.EventGrid.Models;
using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, ICollector<EventGridEvent> outputEvent, ILogger log)
{
    outputEvent.Add(new EventGridEvent("message-id-1", "subject-name", "event-data", "event-type", DateTime.UtcNow, "1.0"));
    outputEvent.Add(new EventGridEvent("message-id-2", "subject-name", "event-data", "event-type", DateTime.UtcNow, "1.0"));
}

مشغل ناقل خدمة Azure

يشرح الجدول الآتي خصائص تكوين ربط البيانات التي عليك تعيينها في ملف function.json.

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى serviceBusTrigger. يتم تعيين هذه الخاصية تلقائيا عند إنشاء المشغل في مدخل Microsoft Azure.
الاتجاه يجب تعيينه إلى in. يتم تعيين هذه الخاصية تلقائيا عند إنشاء المشغل في مدخل Microsoft Azure.
الاسم اسم المتغير الذي يُمثل قائمة الانتظار أو رسالة الموضوع في التعليمات البرمجية للدالة.
queueName اسم قائمة الانتظار لمراقبة. تعيين فقط في حالة مراقبة قائمة انتظار، وليس لموضوع.
topicName اسم الموضوع الذي يجب مراقبته. تعيين فقط إذا كان يراقب موضوعًا، وليس لقائمة انتظار.
اسم الاشتراك اسم الاشتراك للمراقبة. تعيين فقط إذا كان يراقب موضوعًا، وليس لقائمة انتظار.
الاتصال اسم إعداد تطبيق أو مجموعة إعداد تحدد كيفية الاتصال بخدمة الناقل. راجع الاتصالات.
accessRights حقوق الوصول لسلسلة الاتصال. القيم المتوفرة هي manage وlisten. الافتراضي هو manage، الذي يشير إلى أن connection لديه إذن الإدارة. إذا كنت تستخدم سلسلة اتصال ليس لديها إذن الإدارة، قم بتعيين accessRights إلى "الاستماع". وإلا، قد تفشل وقت تشغيل الدالات في محاولة القيام بعمليات تتطلب إدارة الحقوق. في Azure Functions الإصدار 2.x والإصدارات الأحدث، هذه الخاصية غير متوفرة لأن الإصدار الأحدث من عدة تطوير البرامج لناقل خدمة Azure لا تدعم إدارة العمليات.
isSessionsEnabled trueإذا كان الاتصال بقائمة انتظار أو اشتراك على علم بجلسة العمل. falseخلاف ذلك، وهي القيمة الافتراضية.
autoComplete true عندما يجب على المشغل استدعاء مكتمل تلقائياً بعد المعالجة، أو إذا كان كود الوظيفة سيستدعي يدوياً مكتمل.

الإعداد إلى false مدعوم فقط في C#‎.

في حالة الضبط علىtrue، يكمل المشغل الرسالة تلقائيًا إذا اكتمل تنفيذ الوظيفة بنجاح، ويتخلى عن الرسالة بخلاف ذلك.
<عند التعيين إلى false، فأنت مسؤول عن استدعاء أساليب ServiceBusReceiver لإكمال الرسالة أو الجلسة أو الدفعة أو التخلي عنها أو إخلالها. إذا تم طرح استثناء (ولم يتم استدعاء أيServiceBusReceiver من الطرق)، فسيظل القفل موجوداً. بمجرد انتهاء صلاحية القفل، يتم إعادة وضع الرسالةDeliveryCount في قائمة الانتظار مع الزيادة ويتم تجديد القفل تلقائيًا.

هذه الخاصية متاحة فقط في وظائف Azure 2.x والإصدارات الأحدث.

يوضح المثال التالي ربط مشغل ناقل خدمة Microsoft Azure في ملف function.json ودالة البرنامج النصي C# التي تستخدم الربط. تقرأ الدالة بيانات تعريف الرسالةوتسجل رسالة قائمة انتظار ناقل الخدمة.

فيما يلي بيانات الربط في ملفfunction.json:

{
"bindings": [
    {
    "queueName": "testqueue",
    "connection": "MyServiceBusConnection",
    "name": "myQueueItem",
    "type": "serviceBusTrigger",
    "direction": "in"
    }
],
"disabled": false
}

هذا هو كود البرنامج النصي #C:

using System;

public static void Run(string myQueueItem,
    Int32 deliveryCount,
    DateTime enqueuedTimeUtc,
    string messageId,
    TraceWriter log)
{
    log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");

    log.Info($"EnqueuedTimeUtc={enqueuedTimeUtc}");
    log.Info($"DeliveryCount={deliveryCount}");
    log.Info($"MessageId={messageId}");
}

إخراج ناقل خدمة Microsoft Azure

يشرح الجدول الآتي خصائص تكوين ربط البيانات التي عليك تعيينها في ملف function.json.

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى serviceBus. يتم تعيين هذه الخاصية تلقائيا عند إنشاء المشغل في مدخل Microsoft Azure.
الاتجاه يجب تعيينه إلى out. يتم تعيين هذه الخاصية تلقائيا عند إنشاء المشغل في مدخل Microsoft Azure.
الاسم اسم المتغير الذي يُمثل قائمة الانتظار أو رسالة الموضوع في التعليمات البرمجية للدالة. قم بتعيينه إلى "$return" للإشارة إلى القيمة المرجعة للدالة.
queueName اسم قائمة الانتظار. لا تقم بتعيينه إلا في حالة إرسال رسائل قائمة الانتظار، وليس لموضوع.
topicName اسم الموضوع. لا تقم بتعيينه إلا في حالة إرسال الموضوع، وليس قائمة الانتظار.
الاتصال اسم إعداد تطبيق أو مجموعة إعداد تحدد كيفية الاتصال بخدمة الناقل. راجع الاتصالات.
حقوق الوصول (v1 فقط) حقوق الوصول لسلسلة الاتصال. القيم المتوفرة هي manage وlisten. الافتراضي هو manage، الذي يشير إلى أن connection لديه إذن الإدارة. إذا كنت تستخدم سلسلة اتصال ليس لديها إذن الإدارة، قم بتعيين accessRights إلى "الاستماع". وإلا، قد تفشل وقت تشغيل الدالات في محاولة القيام بعمليات تتطلب إدارة الحقوق. في Azure Functions الإصدار 2.x والإصدارات الأحدث، هذه الخاصية غير متوفرة لأن الإصدار الأحدث من عدة تطوير البرامج لناقل خدمة Azure لا تدعم إدارة العمليات.

يوضح المثال التالي ربط إخراج ناقل خدمة Microsoft Azure في ملف function.json ودالة البرنامج النصي C# التي تستخدم الربط. تستخدم الدالة مشغل مُؤقت لإرسال رسالة قائمة الانتظار كل 15 ثانية.

فيما يلي بيانات الربط في ملفfunction.json:

{
    "bindings": [
        {
            "schedule": "0/15 * * * * *",
            "name": "myTimer",
            "runsOnStartup": true,
            "type": "timerTrigger",
            "direction": "in"
        },
        {
            "name": "outputSbQueue",
            "type": "serviceBus",
            "queueName": "testqueue",
            "connection": "MyServiceBusConnection",
            "direction": "out"
        }
    ],
    "disabled": false
}

إليك التعليمات البرمجية لبرنامج #C النصي الذي ينشئ رسالة واحدة :

public static void Run(TimerInfo myTimer, ILogger log, out string outputSbQueue)
{
    string message = $"Service Bus queue message created at: {DateTime.Now}";
    log.LogInformation(message); 
    outputSbQueue = message;
}

إليك التعليمات البرمجية لبرنامج #C النصي الذي ينشئ عدة رسائل:

public static async Task Run(TimerInfo myTimer, ILogger log, IAsyncCollector<string> outputSbQueue)
{
    string message = $"Service Bus queue messages created at: {DateTime.Now}";
    log.LogInformation(message); 
    await outputSbQueue.AddAsync("1 " + message);
    await outputSbQueue.AddAsync("2 " + message);
}

مشغل Azure Cosmos DB v2

يوضح هذا القسم دعم الإصدار 4.x+ من الملحق فقط.

يشرح الجدول الآتي خصائص تكوين ربط البيانات التي عليك تعيينها في ملف function.json.

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى cosmosDBTrigger.
الاتجاه يجب تعيينه إلى in. يتم تعيين هذه المعلمة تلقائيًا عند إنشاء المشغل في مدخل Azure.
الاسم اسم المتغير المستخدم في رمز الدالة الذي يمثل قائمة المستندات ذات التغييرات.
الاتصال اسم إعداد تطبيق أو مجموعة إعداد تحدد كيفية الاتصال بحساب Azure Cosmos DB الذي تتم مراقبته. لمزيد من المعلومات، راجع الاتصالات.
databaseName اسم قاعدة بيانات Azure Cosmos DB مع الحاوية التي يتم مراقبتها.
containerName اسم الحاوية التي يتم مراقبتها.
leaseConnection (اختياري) اسم إعداد تطبيق أو حاوية إعداد تحدد كيفية الاتصال بحساب Azure Cosmos DB الذي يحتوي على حاوية التأجير.

عند عدم التعيين، تُستخدم القيمة connection. يتم تعيين هذه المعلمة تلقائيًا عند إنشاء الربط في المدخل. يجب أن يكون لسلسلة الاتصال لحاوية التأجير أذونات الكتابة.
leaseDatabaseName (اختياري) اسم قاعدة البيانات التي تحتوي على الحاوية المستخدمة لتخزين عقود الإيجار. عند عدم التعيين، تُستخدم قيمة الإعداد databaseName.
leaseContainerName (اختياري) اسم الحاوية المستخدمة لتخزين عقود الإيجار. عند عدم التعيين، تُستخدم القيمة leases.
createLeaseContainerIfNotExists (اختياري) عند تعيينها إلى true، يتم إنشاء حاوية عقود الإيجار تلقائيًّا عندما لا تكون موجودة بالفعل. القيمة الافتراضية هي false. عند استخدام هويات Microsoft Entra إذا قمت بتعيين القيمة إلى true، فإن إنشاء حاويات ليس عملية مسموحا بها ولن تتمكن الدالة من البدء.
leasesContainerThroughput (اختياري) تعريف عدد وحدات الطلب لتعيينها عند إنشاء حاوية التأجيرات. يتم استخدام هذا الإعداد فقط عند تعيين createLeaseContainerIfNotExists إلى true. يتم تعيين هذه المعلمة تلقائيا عند إنشاء الربط باستخدام المدخل.
leaseContainerPrefix (اختياري) عند تعيين القيمة، تتم إضافتها كبادئة لعقود الإيجار التي تم إنشاؤها في حاوية التأجير لهذه الدالة. يسمح استخدام بادئة دالتين Azure منفصلة مشاركة نفس حاوية Lease باستخدام بادئات مختلفة.
feedPollDelay (اختياري) الوقت (بالمللي ثانية) للتأخير بين الاستقصاء عن قسم للتغييرات الجديدة على الخلاصة، بعد أن يتم تجفيف كافة التغييرات الحالية. الافتراضي هو 5000 مللي ثانية أو 5 ثوان.
leaseAcquireInterval (اختياري) عند تعيينها، فإنه يعرف، في ميلي ثانية، الفاصل الزمني لبدء مهمة لحساب إذا تم توزيع الأقسام بالتساوي بين مثيلات المضيف المعروفة. الافتراضي هو 13000 (13 ثانية).
leaseExpirationInterval (اختياري) عند تعيينها، تعرف، بالمللي ثانية، الفترة الزمنية التي يتم أخذ التأجير من أجلها على عقد إيجار يمثل قسمًا. إذا لم يتم تجديد التأجير ضمن هذه الفترة الزمنية، فإنه يؤدي إلى انتهاء صلاحية وملكية القسم سينتقل إلى مثيل آخر. الافتراضي هو 60000 (60 ثانية).
leaseRenewInterval (اختياري) عند تعيينها، تعرف، بالمللي ثانية، فترة التجديد لكافة عقود الإيجار للأقسام الموجودة حاليا بواسطة مثيل. الافتراضي هو 17000 (17 ثانية).
maxItemsPerInvocation (اختياري) عند تعيين هذه الخاصية تعيين الحد الأقصى لعدد العناصر المتلقاة لكل استدعاء دالة. إذا تم تنفيذ العمليات في حاوية المراقبة من خلال الإجراءات المخزنة، يتم الاحتفاظ بنطاق المعاملة عند قراءة العناصر من موجز التغيير. ونتيجة لذلك، قد يكون عدد العناصر المتلقاة أعلى من القيمة المحددة بحيث يتم إرجاع العناصر التي تم تغييرها بواسطة نفس المعاملة كجزء من دفعة ذرية واحدة.
startFromBeginning (اختياري) يخبر هذا الخيار المشغل قراءة التغييرات من بداية محفوظات التغيير للحاوية بدلًا من البدء في الوقت الحالي. القراءة من البداية يعمل فقط في المرة الأولى التي يبدأ فيها المشغل، كما هو الحال في التشغيلات اللاحقة، يتم تخزين نقاط التفتيش بالفعل. وتعيين هذا الخيار إلى true عندما يكون هناك عقود إيجار تم إنشاؤها بالفعل ليس له أي تأثير.
startFromTime (اختياري) الحصول على التاريخ والوقت أو تعيينهما لتهيئة عملية قراءة موجز التغيير. التنسيق الموصى به هو ISO 8601 مع المعين UTC، مثل 2021-02-16T14:19:29Z. يتم استخدام هذا فقط لتعيين حالة المشغل الأولي. بعد أن يكون للمشغل حالة تأجير، لا يكون لتغيير هذه القيمة أي تأثير.
preferredLocations (اختياري) يعرف المواقع المفضلة (المناطق) لحسابات قاعدة البيانات المنسوخة جغرافياً في خدمة Azure Cosmos DB. يجب فصل القيم بفاصلة. على سبيل المثال، "شرق الولايات المتحدة، جنوب وسط الولايات المتحدة، شمال أوروبا".

يوضح المثال التالي ربط مشغل Azure Cosmos DB في ملف function.json ودالة البرنامج النصي C# التي تستخدم الربط. تكتب الدالة رسائل السجل عند إضافة سجلات Azure Cosmos DB أو تعديلها.

فيما يلي بيانات الربط في ملفfunction.json:

{
    "type": "cosmosDBTrigger",
    "name": "documents",
    "direction": "in",
    "leaseContainerName": "leases",
    "connection": "<connection-app-setting>",
    "databaseName": "Tasks",
    "containerName": "Items",
    "createLeaseContainerIfNotExists": true
}

هذا هو كود البرنامج النصي #C:

    using System;
    using System.Collections.Generic;
    using Microsoft.Extensions.Logging;

    // Customize the model with your own desired properties
    public class ToDoItem
    {
        public string id { get; set; }
        public string Description { get; set; }
    }

    public static void Run(IReadOnlyList<ToDoItem> documents, ILogger log)
    {
      log.LogInformation("Documents modified " + documents.Count);
      log.LogInformation("First document Id " + documents[0].id);
    }

إدخال Azure Cosmos DB v2

يوضح هذا القسم دعم الإصدار 4.x+ من الملحق فقط.

يشرح الجدول الآتي خصائص تكوين ربط البيانات التي عليك تعيينها في ملف function.json.

خاصية function.json ‏‏الوصف
النوع يجب تعيينه إلى cosmosDB.
الاتجاه يجب تعيينه إلى in.
الاسم اسم المتغير المستخدم في رمز الدالة الذي يمثل قائمة المستندات ذات التغييرات.
الاتصال اسم إعداد تطبيق أو حاوية إعداد تحدد كيفية الاتصال بحساب Azure Cosmos DB الذي تتم مراقبته. لمزيد من المعلومات، راجع الاتصالات.
databaseName اسم قاعدة بيانات Azure Cosmos DB مع الحاوية التي يتم مراقبتها.
containerName اسم الحاوية التي يتم مراقبتها.
partitionKey تحديد قيمة مفتاح القسم المطلوب للبحث. قد تتضمن معلمات الربط. وهو مطلوب للبحث في حاويات مُقسَّمة.
معرف معرّف المستند المطلوب استرداده. تدعم هذه الخاصية تعبيرات الربط. لا تُعيِّن كلاً من خصائص id و sqlQuery. إذا لم تُعيِّن أياً منهما، تُسترد الحاوية بأكملها.
sqlQuery استعلام Azure Cosmos DB SQL المستخدم لاسترداد مستندات متعددة. تدعم الخاصية روابط وقت التشغيل، كما هو الحال في هذا المثال: SELECT * FROM c where c.departmentId = {departmentId}. لا تُعيِّن كلاً من خصائص id و sqlQuery. إذا لم تُعيِّن أياً منهما، تُسترد الحاوية بأكملها.
preferredLocations (اختياري) يعرف المواقع المفضلة (المناطق) لحسابات قاعدة البيانات المنسوخة جغرافياً في خدمة Azure Cosmos DB. يجب فصل القيم بفاصلة. على سبيل المثال، East US,South Central US,North Europe

يحتوي هذا القسم على الأمثلة التالية:

تشير أمثلة مشغِّل HTTP إلى نوع ToDoItem بسيط:

namespace CosmosDBSamplesV2
{
    public class ToDoItem
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }
}

مشغِّل قائمة الانتظار، البحث عن معرّف من السلسلة

يوضح المثال التالي ربط إدخال Azure Cosmos DB في ملف function.json ودالة برنامج نصي C# تستخدم الربط. تقرأ الدالة مستنداً واحداً وتحدِّث قيمة النص الخاصة بالمستند.

فيما يلي بيانات الربط في ملفfunction.json:

{
    "name": "inputDocument",
    "type": "cosmosDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "id" : "{queueTrigger}",
    "partitionKey": "{partition key value}",
    "connectionStringSetting": "MyAccount_COSMOSDB",
    "direction": "in"
}

هذا هو كود البرنامج النصي #C:

    using System;

    // Change input document contents using Azure Cosmos DB input binding
    public static void Run(string myQueueItem, dynamic inputDocument)
    {
      inputDocument.text = "This has changed.";
    }

مشغِّل قائمة الانتظار، الحصول على مستندات متعددة، وذلك باستخدام SqlQuery

يوضح المثال التالي ربط إدخال Azure Cosmos DB في ملف function.json ودالة برنامج نصي C# تستخدم الربط. تسترد الدالة مستندات متعددة محددة بواسطة استعلام SQL، وذلك باستخدام مشغِّل قائمة انتظار لتخصيص معلمات الاستعلام.

يوفر مشغِّل قائمة الانتظار معلمة departmentId. رسالة قائمة انتظار { "departmentId" : "Finance" } سترجع جميع السجلات للإدارة المالية.

فيما يلي بيانات الربط في ملفfunction.json:

{
    "name": "documents",
    "type": "cosmosDB",
    "direction": "in",
    "databaseName": "MyDb",
    "collectionName": "MyCollection",
    "sqlQuery": "SELECT * from c where c.departmentId = {departmentId}",
    "connectionStringSetting": "CosmosDBConnection"
}

هذا هو كود البرنامج النصي #C:

    public static void Run(QueuePayload myQueueItem, IEnumerable<dynamic> documents)
    {
        foreach (var doc in documents)
        {
            // operate on each document
        }
    }

    public class QueuePayload
    {
        public string departmentId { get; set; }
    }

مشغِّل HTTP، البحث عن معرّف من سلسلة الاستعلام

يظهر المثال التالي دالة البرنامج النصي C# التي تسترد مستنداً واحداً. تُشغَّل الدالة بواسطة طلب HTTP يستخدم سلسلة استعلام لتحديد قيمة المعرّف ومفتاح القسم المطلوب البحث عنهما. تُستخدم قيمة المعرّف ومفتاح القسم لاسترداد مستند ToDoItem من قاعدة البيانات والمجموعة المحددة.

إليك الملف function.json:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "in",
      "Id": "{Query.id}",
      "PartitionKey" : "{Query.partitionKeyValue}"
    }
  ],
  "disabled": false
}

هذا هو كود البرنامج النصي #C:

using System.Net;
using Microsoft.Extensions.Logging;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
         log.LogInformation($"ToDo item not found");
    }
    else
    {
        log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

مشغِّل HTTP، البحث عن معرّف من بيانات المسار

يظهر المثال التالي دالة البرنامج النصي C# التي تسترد مستنداً واحداً. تُشغَّل الدالة بواسطة طلب HTTP يستخدم بيانات المسار لتحديد قيمة المعرّف ومفتاح القسم المطلوب البحث عنهما. تُستخدم قيمة المعرّف ومفتاح القسم لاسترداد مستند ToDoItem من قاعدة البيانات والمجموعة المحددة.

إليك الملف function.json:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ],
      "route":"todoitems/{partitionKeyValue}/{id}"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "in",
      "id": "{id}",
      "partitionKey": "{partitionKeyValue}"
    }
  ],
  "disabled": false
}

هذا هو كود البرنامج النصي #C:

using System.Net;
using Microsoft.Extensions.Logging;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
         log.LogInformation($"ToDo item not found");
    }
    else
    {
        log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

مشغِّل HTTP، الحصول على مستندات متعددة، وذلك باستخدام SqlQuery

يظهر المثال التالي دالة البرنامج النصي C# التي تسترد قائمة مستندات. تُشغَّل الدالة بواسطة طلب HTTP. يُحدد الاستعلام في خاصية السمة SqlQuery.

إليك الملف function.json:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItems",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "in",
      "sqlQuery": "SELECT top 2 * FROM c order by c._ts desc"
    }
  ],
  "disabled": false
}

هذا هو كود البرنامج النصي #C:

using System.Net;
using Microsoft.Extensions.Logging;

public static HttpResponseMessage Run(HttpRequestMessage req, IEnumerable<ToDoItem> toDoItems, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    foreach (ToDoItem toDoItem in toDoItems)
    {
        log.LogInformation(toDoItem.Description);
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

مشغِّل HTTP، الحصول على مستندات متعددة، وذلك باستخدام DocumentClient

يظهر المثال التالي دالة البرنامج النصي C# التي تسترد قائمة مستندات. تُشغَّل الدالة بواسطة طلب HTTP. تستخدم التعليمة البرمجية مثيل DocumentClient وفره ربط Azure Cosmos DB لقراءة قائمة المستندات. يمكن أيضاً استخدام المثيل DocumentClient لعمليات الكتابة.

إليك الملف function.json:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "client",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "inout"
    }
  ],
  "disabled": false
}

هذا هو كود البرنامج النصي #C:

#r "Microsoft.Azure.Documents.Client"

using System.Net;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Microsoft.Extensions.Logging;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, DocumentClient client, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    Uri collectionUri = UriFactory.CreateDocumentCollectionUri("ToDoItems", "Items");
    string searchterm = req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, "searchterm", true) == 0)
        .Value;

    if (searchterm == null)
    {
        return req.CreateResponse(HttpStatusCode.NotFound);
    }

    log.LogInformation($"Searching for word: {searchterm} using Uri: {collectionUri.ToString()}");
    IDocumentQuery<ToDoItem> query = client.CreateDocumentQuery<ToDoItem>(collectionUri)
        .Where(p => p.Description.Contains(searchterm))
        .AsDocumentQuery();

    while (query.HasMoreResults)
    {
        foreach (ToDoItem result in await query.ExecuteNextAsync())
        {
            log.LogInformation(result.Description);
        }
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

إخراج Azure Cosmos DB v2

يوضح هذا القسم دعم الإصدار 4.x+ من الملحق فقط.

يشرح الجدول الآتي خصائص تكوين ربط البيانات التي عليك تعيينها في ملف function.json.

خاصية function.json ‏‏الوصف
الاتصال اسم إعداد تطبيق أو مجموعة إعداد تحدد كيفية الاتصال بحساب Azure Cosmos DB الذي تتم مراقبته. لمزيد من المعلومات، راجع الاتصالات.
databaseName اسم قاعدة بيانات Azure Cosmos DB مع الحاوية التي يتم مراقبتها.
containerName اسم الحاوية التي يتم مراقبتها.
createIfNotExists قيمة منطقية للإشارة إلى ما إذا كانت الحاوية قد تم إنشاؤها عند عدم وجودها أم لا. القيمة الافتراضية هي false لأنه يتم إنشاء حاويات جديدة باستخدام معدل النقل المحجوز، والذي له آثار تكلفة. لمزيد من المعلومات، راجع صفحة التسعير.
partitionKey عندما تكون createIfNotExists صحيحة، يحدد مسار مفتاح القسم للحاوية التي تم إنشاؤها. قد تتضمن معلمات الربط.
ContainerThroughput عندما تكون createIfNotExists صحيحة، فهي تحدد معدل نقل الحاوية التي تم إنشاؤها.
preferredLocations (اختياري) يعرف المواقع المفضلة (المناطق) لحسابات قاعدة البيانات المنسوخة جغرافياً في خدمة Azure Cosmos DB. يجب فصل القيم بفاصلة. على سبيل المثال، East US,South Central US,North Europe

يحتوي هذا القسم على الأمثلة التالية:

مشغل قائمة الانتظار، كتابة مستند واحد

يظهر المثال التالي رابط إخراج Azure Cosmos DB في ملف function.json و دالة برنامج C# النصي التي تستخدم الرابط. تستخدم الدالة رابط إدخال قائمة انتظار لقائمة انتظار تتلقى JSON بالتنسيق التالي:

{
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

تقوم الدالة بإنشاء مستندات Azure Cosmos DB بالتنسيق التالي لكل سجل:

{
    "id": "John Henry-123456",
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

فيما يلي بيانات الربط في ملفfunction.json:

{
    "name": "employeeDocument",
    "type": "cosmosDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "createIfNotExists": true,
    "connectionStringSetting": "MyAccount_COSMOSDB",
    "direction": "out"
}

هذا هو كود البرنامج النصي #C:

    #r "Newtonsoft.Json"

    using Microsoft.Azure.WebJobs.Host;
    using Newtonsoft.Json.Linq;
    using Microsoft.Extensions.Logging;

    public static void Run(string myQueueItem, out object employeeDocument, ILogger log)
    {
      log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

      dynamic employee = JObject.Parse(myQueueItem);

      employeeDocument = new {
        id = employee.name + "-" + employee.employeeId,
        name = employee.name,
        employeeId = employee.employeeId,
        address = employee.address
      };
    }

مشغل قائمة الانتظار، كتابة مستندات باستخدام IAsyncCollector

لإنشاء مستندات متعددة، يمكنك الربط بـ ICollector<T> أو IAsyncCollector<T> حيث T أحد الأنواع المدعومة.

يشير هذا المثال إلى نوع ToDoItem بسيط:

namespace CosmosDBSamplesV2
{
    public class ToDoItem
    {
        public string id { get; set; }
        public string Description { get; set; }
    }
}

إليك الملف function.json:

{
  "bindings": [
    {
      "name": "toDoItemsIn",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "todoqueueforwritemulti",
      "connectionStringSetting": "AzureWebJobsStorage"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItemsOut",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "out"
    }
  ],
  "disabled": false
}

هذا هو كود البرنامج النصي #C:

using System;
using Microsoft.Extensions.Logging;

public static async Task Run(ToDoItem[] toDoItemsIn, IAsyncCollector<ToDoItem> toDoItemsOut, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed {toDoItemsIn?.Length} items");

    foreach (ToDoItem toDoItem in toDoItemsIn)
    {
        log.LogInformation($"Description={toDoItem.Description}");
        await toDoItemsOut.AddAsync(toDoItem);
    }
}

مشغل Azure Cosmos DB v1

يوضح المثال التالي ربط مشغل Azure Cosmos DB في ملف function.json ودالة البرنامج النصي C# التي تستخدم الربط. تكتب الدالة رسائل السجل عند تعديل سجلات Azure Cosmos DB.

فيما يلي بيانات الربط في ملفfunction.json:

{
    "type": "cosmosDBTrigger",
    "name": "documents",
    "direction": "in",
    "leaseCollectionName": "leases",
    "connectionStringSetting": "<connection-app-setting>",
    "databaseName": "Tasks",
    "collectionName": "Items",
    "createLeaseCollectionIfNotExists": true
}

هذا هو كود البرنامج النصي #C:

    #r "Microsoft.Azure.Documents.Client"
    
    using System;
    using Microsoft.Azure.Documents;
    using System.Collections.Generic;
    

    public static void Run(IReadOnlyList<Document> documents, TraceWriter log)
    {
        log.Info("Documents modified " + documents.Count);
        log.Info("First document Id " + documents[0].Id);
    }

إدخال Azure Cosmos DB v1

يحتوي هذا القسم على الأمثلة التالية:

تشير أمثلة مشغِّل HTTP إلى نوع ToDoItem بسيط:

namespace CosmosDBSamplesV1
{
    public class ToDoItem
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }
}

مشغِّل قائمة الانتظار، البحث عن معرّف من السلسلة

يظهر المثال التالي رابط إدخال Azure Cosmos DB في ملف function.json و دالة البرنامج النصي C#‎ التي تستخدم الرابط. تقرأ الدالة مستنداً واحداً وتحدِّث قيمة النص الخاصة بالمستند.

فيما يلي بيانات الربط في ملفfunction.json:

{
    "name": "inputDocument",
    "type": "documentDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "id" : "{queueTrigger}",
    "partitionKey": "{partition key value}",
    "connection": "MyAccount_COSMOSDB",
    "direction": "in"
}

هذا هو كود البرنامج النصي #C:

    using System;

    // Change input document contents using Azure Cosmos DB input binding
    public static void Run(string myQueueItem, dynamic inputDocument)
    {
        inputDocument.text = "This has changed.";
    }

مشغِّل قائمة الانتظار، الحصول على مستندات متعددة، وذلك باستخدام SqlQuery

يظهر المثال التالي رابط إدخال Azure Cosmos DB في ملف function.json و دالة البرنامج النصي C#‎ التي تستخدم الرابط. تسترد الدالة مستندات متعددة محددة بواسطة استعلام SQL، وذلك باستخدام مشغِّل قائمة انتظار لتخصيص معلمات الاستعلام.

يوفر مشغِّل قائمة الانتظار معلمة departmentId. رسالة قائمة انتظار { "departmentId" : "Finance" } سترجع جميع السجلات للإدارة المالية.

فيما يلي بيانات الربط في ملفfunction.json:

{
    "name": "documents",
    "type": "documentdb",
    "direction": "in",
    "databaseName": "MyDb",
    "collectionName": "MyCollection",
    "sqlQuery": "SELECT * from c where c.departmentId = {departmentId}",
    "connection": "CosmosDBConnection"
}

هذا هو كود البرنامج النصي #C:

    public static void Run(QueuePayload myQueueItem, IEnumerable<dynamic> documents)
    {
        foreach (var doc in documents)
        {
            // operate on each document
        }
    }

    public class QueuePayload
    {
        public string departmentId { get; set; }
    }

مشغِّل HTTP، البحث عن معرّف من سلسلة الاستعلام

يظهر المثال التالي دالة البرنامج النصي C#‎ التي تسترد مستنداً واحداً. يتم تشغيل الوظيفة بواسطة طلب بروتوكول نص تشعبي يستخدم سلسلة استعلام لتحديد المعرّف للبحث عنه. يُستخدم ذلك المعرّف لاسترداد ToDoItem مستند من قاعدة البيانات والمجموعة المحددة.

إليك الملف function.json:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "in",
      "Id": "{Query.id}"
    }
  ],
  "disabled": true
}

هذا هو كود البرنامج النصي #C:

using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
        log.Info($"ToDo item not found");
    }
    else
    {
        log.Info($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

مشغِّل HTTP، البحث عن معرّف من بيانات المسار

يظهر المثال التالي دالة البرنامج النصي C#‎ التي تسترد مستنداً واحداً. تُشغَّل الدالة بواسطة طلب HTTP يستخدم بيانات المسار لتحديد المعرّف المطلوب البحث عنه. يُستخدم ذلك المعرّف لاسترداد ToDoItem مستند من قاعدة البيانات والمجموعة المحددة.

إليك الملف function.json:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ],
      "route":"todoitems/{id}"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "in",
      "Id": "{id}"
    }
  ],
  "disabled": false
}

هذا هو كود البرنامج النصي #C:

using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
        log.Info($"ToDo item not found");
    }
    else
    {
        log.Info($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

مشغِّل HTTP، الحصول على مستندات متعددة، وذلك باستخدام SqlQuery

يظهر المثال التالي دالة البرنامج النصي C#‎ التي تسترد قائمة مستندات. تُشغَّل الدالة بواسطة طلب HTTP. يُحدد الاستعلام في خاصية السمة SqlQuery.

إليك الملف function.json:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "toDoItems",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "in",
      "sqlQuery": "SELECT top 2 * FROM c order by c._ts desc"
    }
  ],
  "disabled": false
}

هذا هو كود البرنامج النصي #C:

using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, IEnumerable<ToDoItem> toDoItems, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    foreach (ToDoItem toDoItem in toDoItems)
    {
        log.Info(toDoItem.Description);
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

مشغِّل HTTP، الحصول على مستندات متعددة، وذلك باستخدام DocumentClient

يظهر المثال التالي دالة البرنامج النصي C#‎ التي تسترد قائمة مستندات. تُشغَّل الدالة بواسطة طلب HTTP. تستخدم التعليمة البرمجية مثيل DocumentClient وفره ربط Azure Cosmos DB لقراءة قائمة المستندات. يمكن أيضاً استخدام المثيل DocumentClient لعمليات الكتابة.

إليك الملف function.json:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "client",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "inout"
    }
  ],
  "disabled": false
}

هذا هو كود البرنامج النصي #C:

#r "Microsoft.Azure.Documents.Client"

using System.Net;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, DocumentClient client, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    Uri collectionUri = UriFactory.CreateDocumentCollectionUri("ToDoItems", "Items");
    string searchterm = req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, "searchterm", true) == 0)
        .Value;

    if (searchterm == null)
    {
        return req.CreateResponse(HttpStatusCode.NotFound);
    }

    log.Info($"Searching for word: {searchterm} using Uri: {collectionUri.ToString()}");
    IDocumentQuery<ToDoItem> query = client.CreateDocumentQuery<ToDoItem>(collectionUri)
        .Where(p => p.Description.Contains(searchterm))
        .AsDocumentQuery();

    while (query.HasMoreResults)
    {
        foreach (ToDoItem result in await query.ExecuteNextAsync())
        {
            log.Info(result.Description);
        }
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

إخراج Azure Cosmos DB v1

يحتوي هذا القسم على الأمثلة التالية:

  • مشغل قائمة الانتظار، كتابة مستند واحد
  • مشغل قائمة الانتظار، كتابة مستندات باستخدام IAsyncCollector

مشغل قائمة الانتظار، كتابة مستند واحد

يظهر المثال التالي رابط إخراج Azure Cosmos DB في ملف function.json و دالة برنامج C# النصي التي تستخدم الرابط. تستخدم الدالة رابط إدخال قائمة انتظار لقائمة انتظار تتلقى JSON بالتنسيق التالي:

{
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

تقوم الدالة بإنشاء مستندات Azure Cosmos DB بالتنسيق التالي لكل سجل:

{
    "id": "John Henry-123456",
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

فيما يلي بيانات الربط في ملفfunction.json:

{
    "name": "employeeDocument",
    "type": "documentDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "createIfNotExists": true,
    "connection": "MyAccount_COSMOSDB",
    "direction": "out"
}

هذا هو كود البرنامج النصي #C:

    #r "Newtonsoft.Json"

    using Microsoft.Azure.WebJobs.Host;
    using Newtonsoft.Json.Linq;

    public static void Run(string myQueueItem, out object employeeDocument, TraceWriter log)
    {
        log.Info($"C# Queue trigger function processed: {myQueueItem}");

        dynamic employee = JObject.Parse(myQueueItem);

        employeeDocument = new {
            id = employee.name + "-" + employee.employeeId,
            name = employee.name,
            employeeId = employee.employeeId,
            address = employee.address
        };
    }

مشغل قائمة الانتظار، كتابة مستندات باستخدام IAsyncCollector

لإنشاء مستندات متعددة، يمكنك الربط بـ ICollector<T> أو IAsyncCollector<T> حيث T أحد الأنواع المدعومة.

يشير هذا المثال إلى نوع ToDoItem بسيط:

namespace CosmosDBSamplesV1
{
    public class ToDoItem
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }
}

إليك الملف function.json:

{
  "bindings": [
    {
      "name": "toDoItemsIn",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "todoqueueforwritemulti",
      "connection": "AzureWebJobsStorage"
    },
    {
      "type": "documentDB",
      "name": "toDoItemsOut",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "out"
    }
  ],
  "disabled": false
}

هذا هو كود البرنامج النصي #C:

using System;

public static async Task Run(ToDoItem[] toDoItemsIn, IAsyncCollector<ToDoItem> toDoItemsOut, TraceWriter log)
{
    log.Info($"C# Queue trigger function processed {toDoItemsIn?.Length} items");

    foreach (ToDoItem toDoItem in toDoItemsIn)
    {
        log.Info($"Description={toDoItem.Description}");
        await toDoItemsOut.AddAsync(toDoItem);
    }
}

مشغل Azure SQL

تتوفر المزيد من العينات لمشغل Azure SQL في مستودع GitHub.

يشير المثال إلى ToDoItem فئة وجدول قاعدة بيانات مطابق:

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

يتم تمكين تعقب التغييرات على قاعدة البيانات وعلى الجدول:

ALTER DATABASE [SampleDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE [dbo].[ToDo]
ENABLE CHANGE_TRACKING;

يرتبط مشغل SQL ب IReadOnlyList<SqlChange<T>>، قائمة الكائنات لكل منها SqlChange خاصيتين:

  • العنصر: العنصر الذي تم تغييره. يجب أن يتبع نوع العنصر مخطط الجدول كما هو ملاحظ في ToDoItem الفئة.
  • العملية: قيمة من SqlChangeOperation قائمة التعداد. والقيم المحتملة هي Insert و Update وDelete.

يوضح المثال التالي مشغل SQL في ملف function.json ودالة البرنامج النصي C# التي يتم استدعاؤها عند وجود تغييرات في ToDo الجدول:

فيما يلي هو ربط البيانات في ملف function.json:

{
    "name": "todoChanges",
    "type": "sqlTrigger",
    "direction": "in",
    "tableName": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

فيما يلي دالة البرنامج النصي C#‎:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static void Run(IReadOnlyList<SqlChange<ToDoItem>> todoChanges, ILogger log)
{
    log.LogInformation($"C# SQL trigger function processed a request.");

    foreach (SqlChange<ToDoItem> change in todoChanges)
    {
        ToDoItem toDoItem = change.Item;
        log.LogInformation($"Change operation: {change.Operation}");
        log.LogInformation($"Id: {toDoItem.Id}, Title: {toDoItem.title}, Url: {toDoItem.url}, Completed: {toDoItem.completed}");
    }
}

إدخال Azure SQL

يتوفر المزيد من العينات لربط إدخال البيانات Azure SQL في مستودع GitHub.

يحتوي هذا القسم على الأمثلة التالية:

تُشير الأمثلة إلى فئة ToDoItem وجدول قاعدة بيانات مطابق:

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

مشغل HTTP، الحصول على سجل حسب المعرّف من سلسلة الاستعلام

يوضح المثال التالي ربط إدخال Azure SQL في ملف function.json ودالة البرنامج النصي C# التي تستخدم الربط. تُشغّل الوظيفة بواسطة طلب HTTP يستخدم سلسلة استعلام لتحديد المعرّف. يُستخدم هذا المعرّف لاسترداد سجل ToDoItem باستخدام الاستعلام المحدد.

إشعار

معلمة سلسلة استعلام HTTP حساسة لحالة الأحرف.

فيما يلي بيانات الربط في ملفfunction.json:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "get"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItem",
    "type": "sql",
    "direction": "in",
    "commandText": "select [Id], [order], [title], [url], [completed] from dbo.ToDo where Id = @Id",
    "commandType": "Text",
    "parameters": "@Id = {Query.id}",
    "connectionStringSetting": "SqlConnectionString"
}

هذا هو كود البرنامج النصي #C:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Collections.Generic;

public static IActionResult Run(HttpRequest req, ILogger log, IEnumerable<ToDoItem> todoItem)
{
    return new OkObjectResult(todoItem);
}

مُشغّل HTTP، حذف السجلات

يوضح المثال التالي ربط إدخال Azure SQL في ملف function.json ودالة برنامج نصي C# تستخدم الربط لتنفيذ إجراء مخزن مع إدخال من معلمة استعلام طلب HTTP. وفي هذا المثال، يحذف الإجراء المخزن سجلاً واحدًا أو كافة السجلات اعتمادًا على قيمة المعلمة.

يجب إنشاء الإجراء المخزن dbo.DeleteToDo على قاعدة بيانات SQL.

CREATE PROCEDURE [dbo].[DeleteToDo]
    @Id NVARCHAR(100)
AS
    DECLARE @UID UNIQUEIDENTIFIER = TRY_CAST(@ID AS UNIQUEIDENTIFIER)
    IF @UId IS NOT NULL AND @Id != ''
    BEGIN
        DELETE FROM dbo.ToDo WHERE Id = @UID
    END
    ELSE
    BEGIN
        DELETE FROM dbo.ToDo WHERE @ID = ''
    END

    SELECT [Id], [order], [title], [url], [completed] FROM dbo.ToDo
GO

فيما يلي بيانات الربط في ملفfunction.json:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "get"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItems",
    "type": "sql",
    "direction": "in",
    "commandText": "DeleteToDo",
    "commandType": "StoredProcedure",
    "parameters": "@Id = {Query.id}",
    "connectionStringSetting": "SqlConnectionString"
}
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

namespace AzureSQL.ToDo
{
    public static class DeleteToDo
    {
        // delete all items or a specific item from querystring
        // returns remaining items
        // uses input binding with a stored procedure DeleteToDo to delete items and return remaining items
        [FunctionName("DeleteToDo")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "delete", Route = "DeleteFunction")] HttpRequest req,
            ILogger log,
            [Sql(commandText: "DeleteToDo", commandType: System.Data.CommandType.StoredProcedure, 
                parameters: "@Id={Query.id}", connectionStringSetting: "SqlConnectionString")] 
                IEnumerable<ToDoItem> toDoItems)
        {
            return new OkObjectResult(toDoItems);
        }
    }
}

هذا هو كود البرنامج النصي #C:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Collections.Generic;

public static IActionResult Run(HttpRequest req, ILogger log, IEnumerable<ToDoItem> todoItems)
{
    return new OkObjectResult(todoItems);
}

إخراج Azure SQL

يتوفر المزيد من العينات لربط إخراج Azure SQL في مستودع GitHub.

يحتوي هذا القسم على الأمثلة التالية:

تُشير الأمثلة إلى فئة ToDoItem وجدول قاعدة بيانات مطابق:

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

مشغل HTTP، اكتب السجلات إلى جدول

يوضح المثال التالي ربط إخراج SQL في ملف function.json ودالة برنامج نصي C# تضيف سجلات إلى جدول، باستخدام البيانات المتوفرة في طلب HTTP POST كنص JSON.

فيما يلي هو ربط البيانات في ملف function.json:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "post"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItem",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

فيما يلي نموذج التعليمات البرمجية للبرنامج النصي C#‎:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static IActionResult Run(HttpRequest req, ILogger log, out ToDoItem todoItem)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = new StreamReader(req.Body).ReadToEnd();
    todoItem = JsonConvert.DeserializeObject<ToDoItem>(requestBody);

    return new OkObjectResult(todoItem);
}

مشغل HTTP، اكتب على جدولين

يظهر المثال التالي ربط إخراج SQL في ملف function.json ودالة برنامج نصي C# تضيف سجلات إلى قاعدة بيانات في جدولين مختلفين (dbo.ToDo وdbo.RequestLog)، باستخدام البيانات المقدمة في طلب HTTP POST كنص JSON وروابط إخراج متعددة.

الجدول الثاني، dbo.RequestLog، يتوافق مع التعريف التالي:

CREATE TABLE dbo.RequestLog (
    Id int identity(1,1) primary key,
    RequestTimeStamp datetime2 not null,
    ItemCount int not null
)

فيما يلي هو ربط البيانات في ملف function.json:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "post"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItem",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
},
{
    "name": "requestLog",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.RequestLog",
    "connectionStringSetting": "SqlConnectionString"
}

فيما يلي نموذج التعليمات البرمجية للبرنامج النصي C#‎:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static IActionResult Run(HttpRequest req, ILogger log, out ToDoItem todoItem, out RequestLog requestLog)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = new StreamReader(req.Body).ReadToEnd();
    todoItem = JsonConvert.DeserializeObject<ToDoItem>(requestBody);

    requestLog = new RequestLog();
    requestLog.RequestTimeStamp = DateTime.Now;
    requestLog.ItemCount = 1;

    return new OkObjectResult(todoItem);
}

public class RequestLog {
    public DateTime RequestTimeStamp { get; set; }
    public int ItemCount { get; set; }
}

إخراج RabbitMQ

يُظهر النموذج التالي ارتباط مخرج RabbitMQ في ملف function.json ودالة C# script التي تستخدم الارتباط. تقرأ الدالة في الرسالة من مشغل HTTP وإخراجها إلى قائمة انتظار RabbitMQ.

فيما يلي بيانات الربط في ملفfunction.json:

{
    "bindings": [
        {
            "type": "httpTrigger",
            "direction": "in",
            "authLevel": "function",
            "name": "input",
            "methods": [
                "get",
                "post"
            ]
        },
        {
            "type": "rabbitMQ",
            "name": "outputMessage",
            "queueName": "outputQueue",
            "connectionStringSetting": "rabbitMQConnectionAppSetting",
            "direction": "out"
        }
    ]
}

هذا هو كود البرنامج النصي #C:

using System;
using Microsoft.Extensions.Logging;

public static void Run(string input, out string outputMessage, ILogger log)
{
    log.LogInformation(input);
    outputMessage = input;
}

إخراج SendGrid

يظهر المثال التالي ربط إخراج SendGrid في ملف function.json ودالة البرنامج النصي C# التي تستخدم الربط.

فيما يلي بيانات الربط في ملفfunction.json:

{
    "bindings": [
        {
          "type": "queueTrigger",
          "name": "mymsg",
          "queueName": "myqueue",
          "connection": "AzureWebJobsStorage",
          "direction": "in"
        },
        {
          "type": "sendGrid",
          "name": "$return",
          "direction": "out",
          "apiKey": "SendGridAPIKeyAsAppSetting",
          "from": "{FromEmail}",
          "to": "{ToEmail}"
        }
    ]
}

هذا هو كود البرنامج النصي #C:

#r "SendGrid"

using System;
using SendGrid.Helpers.Mail;
using Microsoft.Azure.WebJobs.Host;

public static SendGridMessage Run(Message mymsg, ILogger log)
{
    SendGridMessage message = new SendGridMessage()
    {
        Subject = $"{mymsg.Subject}"
    };
    
    message.AddContent("text/plain", $"{mymsg.Content}");

    return message;
}
public class Message
{
    public string ToEmail { get; set; }
    public string FromEmail { get; set; }
    public string Subject { get; set; }
    public string Content { get; set; }
}

مشغل SignalR

فيما يلي بيانات الربط في ملف function.json:

{
    "type": "signalRTrigger",
    "name": "invocation",
    "hubName": "SignalRTest",
    "category": "messages",
    "event": "SendMessage",
    "parameterNames": [
        "message"
    ],
    "direction": "in"
}

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

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using System;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
using Microsoft.Extensions.Logging;

public static void Run(InvocationContext invocation, string message, ILogger logger)
{
    logger.LogInformation($"Receive {message} from {invocationContext.ConnectionId}.");
}

إدخال SignalR

يوضح المثال التالي ربط إدخال معلومات اتصال SignalR في ملف function.json و دالة برنامج C# النصي التي تستخدم الربط لإعادة معلومات الاتصال.

إليك بيانات الربط في ملف function.json:

مثال function.json:

{
    "type": "signalRConnectionInfo",
    "name": "connectionInfo",
    "hubName": "chat",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "direction": "in"
}

هنا رمز برنامج C# النصي:

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static SignalRConnectionInfo Run(HttpRequest req, SignalRConnectionInfo connectionInfo)
{
    return connectionInfo;
}

يمكنك تعيين خاصية userIdالربط إلى القيمة من العنوان باستخدام تعبير ربط:{headers.x-ms-client-principal-id} أو {headers.x-ms-client-principal-name} .

مثال function.json:

{
    "type": "signalRConnectionInfo",
    "name": "connectionInfo",
    "hubName": "chat",
    "userId": "{headers.x-ms-client-principal-id}",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "direction": "in"
}

هنا رمز برنامج C# النصي:

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static SignalRConnectionInfo Run(HttpRequest req, SignalRConnectionInfo connectionInfo)
{
    // connectionInfo contains an access key token with a name identifier
    // claim set to the authenticated user
    return connectionInfo;
}

إخراج SignalR

إليك بيانات الربط في ملف function.json:

مثال function.json:

{
  "type": "signalR",
  "name": "signalRMessages",
  "hubName": "<hub_name>",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}

هنا رمز برنامج C# النصي:

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    object message,
    IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage
        {
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

يمكنك إرسال رسالة فقط إلى الاتصالات التي تمت مصادقتها إلى مستخدم عن طريق إعداد معرف المستخدم في رسالة SignalR.

مثال function.json:

{
  "type": "signalR",
  "name": "signalRMessages",
  "hubName": "<hub_name>",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}

هذا هو كود البرنامج النصي #C:

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    object message,
    IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage
        {
            // the message will only be sent to this user ID
            UserId = "userId1",
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

يمكنك إرسال رسالة فقط إلى الاتصالات التي تمت إضافتها إلى مجموعة عن طريق إعداد اسم المجموعة في رسالة SignalR.

مثال function.json:

{
  "type": "signalR",
  "name": "signalRMessages",
  "hubName": "<hub_name>",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}

هنا رمز برنامج C# النصي:

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    object message,
    IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage
        {
            // the message will be sent to the group with this name
            GroupName = "myGroup",
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

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

يضيف المثال التالي مستخدمًا إلى مجموعة.

مثال function.json

{
    "type": "signalR",
    "name": "signalRGroupActions",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "hubName": "chat",
    "direction": "out"
}

Run.csx

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    HttpRequest req,
    ClaimsPrincipal claimsPrincipal,
    IAsyncCollector<SignalRGroupAction> signalRGroupActions)
{
    var userIdClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier);
    return signalRGroupActions.AddAsync(
        new SignalRGroupAction
        {
            UserId = userIdClaim.Value,
            GroupName = "myGroup",
            Action = GroupAction.Add
        });
}

يقوم المثال التالي بإزالة مستخدم من مجموعة.

مثال function.json

{
    "type": "signalR",
    "name": "signalRGroupActions",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "hubName": "chat",
    "direction": "out"
}

Run.csx

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    HttpRequest req,
    ClaimsPrincipal claimsPrincipal,
    IAsyncCollector<SignalRGroupAction> signalRGroupActions)
{
    var userIdClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier);
    return signalRGroupActions.AddAsync(
        new SignalRGroupAction
        {
            UserId = userIdClaim.Value,
            GroupName = "myGroup",
            Action = GroupAction.Remove
        });
}

إخراج Twilio

يظهر المثال التالي ربط إخراج Twilio في ملف function.json ودالة البرنامج النصي C# التي تستخدم الربط. تستخدم الدالة معلمة out لإرسال رسالة نصية.

إليك بيانات الربط في ملف function.json:

مثال function.json:

{
  "type": "twilioSms",
  "name": "message",
  "accountSidSetting": "TwilioAccountSid",
  "authTokenSetting": "TwilioAuthToken",
  "from": "+1425XXXXXXX",
  "direction": "out",
  "body": "Azure Functions Testing"
}

إليك رمز البرنامج النصي C#‎:

#r "Newtonsoft.Json"
#r "Twilio"
#r "Microsoft.Azure.WebJobs.Extensions.Twilio"

using System;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;

public static void Run(string myQueueItem, out CreateMessageOptions message,  ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

    // In this example the queue item is a JSON string representing an order that contains the name of a
    // customer and a mobile number to send text updates to.
    dynamic order = JsonConvert.DeserializeObject(myQueueItem);
    string msg = "Hello " + order.name + ", thank you for your order.";

    // You must initialize the CreateMessageOptions variable with the "To" phone number.
    message = new CreateMessageOptions(new PhoneNumber("+1704XXXXXXX"));

    // A dynamic message can be set instead of the body in the output binding. In this example, we use
    // the order information to personalize a text message.
    message.Body = msg;
}

لا يمكنك استخدام المعلمات في الرمز غير المتزامن. إليك مثال غير متزامن لرمز البرنامج النصي C#‎:

#r "Newtonsoft.Json"
#r "Twilio"
#r "Microsoft.Azure.WebJobs.Extensions.Twilio"

using System;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;

public static async Task Run(string myQueueItem, IAsyncCollector<CreateMessageOptions> message,  ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

    // In this example the queue item is a JSON string representing an order that contains the name of a
    // customer and a mobile number to send text updates to.
    dynamic order = JsonConvert.DeserializeObject(myQueueItem);
    string msg = "Hello " + order.name + ", thank you for your order.";

    // You must initialize the CreateMessageOptions variable with the "To" phone number.
    CreateMessageOptions smsText = new CreateMessageOptions(new PhoneNumber("+1704XXXXXXX"));

    // A dynamic message can be set instead of the body in the output binding. In this example, we use
    // the order information to personalize a text message.
    smsText.Body = msg;

    await message.AddAsync(smsText);
}

مشغل التجهيز

يوضح المثال التالي مشغل إحماء في ملف function.json ووظيفة البرنامج النصي C#‎ التي يتم تشغيلها في كل مثيل جديد عند إضافته إلى تطبيقك.

غير مدعوم للإصدار 1.x من وقت تشغيل الوظائف.

إليك الملف function.json:

{
    "bindings": [
        {
            "type": "warmupTrigger",
            "direction": "in",
            "name": "warmupContext"
        }
    ]
}
public static void Run(WarmupContext warmupContext, ILogger log)
{
    log.LogInformation("Function App instance is warm.");  
}

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