لربط مشغل خدمة SignalR لوظائف Azure

استخدم رابط مشغل SignalR للرد على الرسائل المرسلة من خدمة Azure SignalR. عند تشغيل الوظيفة، يتم توزيع الرسائل التي تم تمريرها إلى الوظيفة كعنصر json.

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

SignalR Trigger Architecture

للحصول على معلومات حول تفاصيل الإعداد والتكوين، راجع نظرة عامة.

مثال

يمكن إنشاء الدالة C # باستخدام أحد أوضاع C # التالية:

يحتوي ربط مشغل خدمة SignalR لـ C# على نموذجين للبرمجة. النموذج المستند إلى الفئة والنموذج التقليدي. يوفر النموذج المستند إلى الفئة تجربة برمجة متسقة من جانب خادم SignalR. يوفر النموذج التقليدي المزيد من المرونة ويشبه روابط الوظائف الأخرى.

مع نموذج قائم على الفئة

راجع النموذج المستند إلى الفئة للحصول على التفاصيل.

public class SignalRTestHub : ServerlessHub
{
    [FunctionName("SignalRTest")]
    public async Task SendMessage([SignalRTrigger]InvocationContext invocationContext, string message, ILogger logger)
    {
        logger.LogInformation($"Receive {message} from {invocationContext.ConnectionId}.");
    }
}

مع نموذج تقليدي

يطيع النموذج التقليدي اتفاقية وظيفة Azure المطورة بواسطة C#. إذا لم تكن على دراية به، يمكنك التعلم من المستندات.

[FunctionName("SignalRTest")]
public static async Task Run([SignalRTrigger("SignalRTest", "messages", "SendMessage", parameterNames: new string[] {"message"})]InvocationContext invocationContext, string message, ILogger logger)
{
    logger.LogInformation($"Receive {message} from {invocationContext.ConnectionId}.");
}

نظرا لأنه قد يكون من الصعب استخدامه ParameterNames في المشغل، يوضح لك المثال التالي كيفية استخدام السمة SignalRParameter لتعريف السمة message .

[FunctionName("SignalRTest")]
public static async Task Run([SignalRTrigger("SignalRTest", "messages", "SendMessage")]InvocationContext invocationContext, [SignalRParameter]string message, ILogger logger)
{
    logger.LogInformation($"Receive {message} from {invocationContext.ConnectionId}.");
}

مشغل SignalR غير مدعوم حاليا ل Java.

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

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

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

module.exports = async function (context, invocation) {
    context.log(`Receive ${context.bindingData.message} from ${invocation.ConnectionId}.`)
};

أمثلة PowerShell الكاملة معلقة.

إليك التعليمة البرمجية لـ Python:

import logging
import json
import azure.functions as func

def main(invocation) -> None:
    invocation_json = json.loads(invocation)
    logging.info("Receive {0} from {1}".format(invocation_json['Arguments'][0], invocation_json['ConnectionId']))

السمات

تستخدم كل من مكتبات C#‎ قيد المعالجةوالعملية المعزولة السمة SignalRTrigger لتحديد الدالة. يستخدم البرنامج النصي C # بدلا من ذلك ملف تكوين function.json.

يشرح الجدول التالي خصائص SignalRTrigger السمة.

خاصية السمة الوصف
HubName يجب تعيين هذه القيمة إلى اسم SignalR hub للوظيفة التي سيتم تشغيلها.
الفئة يجب تعيين هذه القيمة كفئة رسائل للوظيفة التي سيتم تشغيلها. قد تكون الفئة واحدة من القيم التالية:
  • الاتصالات: بما في ذلك الأحداث المتصلةوالمنفصلة
  • الرسائل: بما في ذلك جميع الأحداث الأخرى باستثناء تلك الموجودة في فئة الاتصالات
الحدث يجب تعيين هذه القيمة كحدث رسائل للوظيفة التي سيتم تشغيلها. بالنسبة إلى فئة الرسائل، الحدث هو الهدففي رسالة الاستدعاء التي يرسلها العملاء. بالنسبة إلى فئة الاتصالات، يتم استخدام الاتصال وقطع الاتصال فقط.
أسماء المعلمات (اختياري) قائمة بالأسماء التي ترتبط بالمعلمات.
ConnectionStringSetting اسم إعداد التطبيق الذي يحتوي على سلسلة اتصال خدمة SignalR، والتي يتم تعيينها افتراضيا إلى AzureSignalRConnectionString.

تعليقات توضيحية

لا يوجد حاليا تعليق توضيحي مدعوم من Java لمشغلات SignalR.

التكوين

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

خاصية function.json الوصف
النوع يجب تعيينها إلى SignalRTrigger.
⁩direction⁧ يجب تعيينها إلى in.
الاسم الاسم المتغير المستخدم في رمز الوظيفة للعنصر في سياق استدعاء المشغل.
hubName يجب تعيين هذه القيمة إلى اسم SignalR hub للوظيفة التي سيتم تشغيلها.
الفئة يجب تعيين هذه القيمة كفئة رسائل للوظيفة التي سيتم تشغيلها. قد تكون الفئة واحدة من القيم التالية:
  • الاتصالات: بما في ذلك الأحداث المتصلةوالمنفصلة
  • الرسائل: بما في ذلك جميع الأحداث الأخرى باستثناء تلك الموجودة في فئة الاتصالات
الحدث يجب تعيين هذه القيمة كحدث رسائل للوظيفة التي سيتم تشغيلها. بالنسبة إلى فئة الرسائل، الحدث هو الهدففي رسالة الاستدعاء التي يرسلها العملاء. بالنسبة إلى فئة الاتصالات، يتم استخدام الاتصال وقطع الاتصال فقط.
أسماء المعلمات (اختياري) قائمة بالأسماء التي ترتبط بالمعلمات.
تعيين سلسلة الاتصال اسم إعداد التطبيق الذي يحتوي على سلسلة اتصال خدمة SignalR، والتي يتم تعيينها افتراضيا إلى AzureSignalRConnectionString.

راجع قسم المثال للحصول على أمثلة كاملة.

الاستخدام

الحمولات

يتم تعريف نوع إدخال المشغل إما كنوع InvocationContext مخصص. إذا اخترت InvocationContext يمكنك الحصول على حق الوصول الكامل إلى محتوى الطلب. لنوع مخصص يحاول وقت التشغيل تحليل نص طلب JSON لتعيين خصائص الكائن.

InvocationContext

InvocationContext يحتوي على كل المحتوى الموجود في الرسالة المرسلة من خدمة aa SignalR ، والتي تتضمن الخصائص التالية:

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

استخدام ParameterNames

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

لنفترض أن لديك عميل JavaScript SignalR يحاول الاحتجاج بالأسلوبbroadcast في وظيفة Azure باستخدام الوسيطتين message1،message2.

await connection.invoke("broadcast", message1, message2);

بعد التعيين ، تتوافق الأسماء التي قمت بتعريفها مع الوسيطات parameterNamesالمرسلة على جانب العميل.

[SignalRTrigger(parameterNames: new string[] {"arg1, arg2"})]

ثم، arg1 سوف تحتوي على محتوى message1، وسوف تحتوي على محتوى arg2message2.

ParameterNames الاعتبارات

بالنسبة إلى ربط المعلمة، فإن الأمر مهم. إذا كنت تستخدم ParameterNames، فإن الترتيب يطابق ParameterNames ترتيب الوسيطات التي تستدعيها في العميل. إذا كنت تستخدم سمة [SignalRParameter] في C#، فإن ترتيب الوسيطات في أساليب Azure Function يتطابق مع ترتيب الوسيطات في العملاء.

ParameterNamesولا يمكن استخدام السمة [SignalRParameter] في نفس الوقت ، أو ستحصل على استثناء.

خدمة SignalR المتكاملة

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

Upstream Portal

عند استخدام مشغل خدمة SignalR يمكن أن يكون عنوان URL بسيطًا ومنسقًا كما هو موضح أدناه:

<Function_App_URL>/runtime/webhooks/signalr?code=<API_KEY>

يمكنFunction_App_URL العثور على صفحة الاستعراض العام على تطبيق الوظائف والتيAPI_KEY أنشأت بواسطة وظيفة Azure. يمكنك الحصول على API_KEY من signalr_extension في شفرة مفاتيح التطبيق من التطبيق الوظائف. API key

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

عينة خطوة بخطوة

يمكنك متابعة العينة في GitHub لنشر غرفة دردشة على تطبيق الوظائف مع ربط مشغل خدمة SignalR وميزة المصدر: عينة غرفة محادثة ثنائية الاتجاه

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