ربط ناتج خدمة SignalR لوظائف Azure

استخدم ربط ناتج SignalR لإرسال رسالة واحدة أو أكثر باستخدام خدمة SignalR من Azure. يمكنك بث رسالة إلى:

  • جميع العملاء المتصلين
  • عملاء متصلون تمت مصادقتهم لمستخدم معين

ربط الناتج يسمح لك أيضًا بإدارة المجموعات.

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

مثال

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

البث لجميع العملاء

يُظِهر المثال التالي وظيفة تُرسل رسالة باستخدام ربط الناتج لكافة العملاء المتصلين. الهدف هو اسم الأسلوب الذي سيتم استدعاؤه على كل عميل. خاصية الوسائط هي صفيفة من صفر أو أكثر من العناصر لتمريرها إلى أسلوب العميل.

[FunctionName("SendMessage")]
public static Task SendMessage(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]object message, 
    [SignalR(HubName = "chat")]IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage 
        {
            Target = "newMessage", 
            Arguments = new [] { message } 
        });
}

البث لجميع العملاء

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

مثال function.json:

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

هنا رمز JavaScript:

module.exports = async function (context, req) {
    context.bindings.signalRMessages = [{
        "target": "newMessage",
        "arguments": [ req.body ]
    }];
};

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

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

def main(req: func.HttpRequest, outMessage: func.Out[str]) -> func.HttpResponse:
    message = req.get_json()
    outMessage.set(json.dumps({
        'target': 'newMessage',
        'arguments': [ message ]
    }))

البث لجميع العملاء

@FunctionName("sendMessage")
@SignalROutput(name = "$return", hubName = "chat")
public SignalRMessage sendMessage(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST },
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req) {

    SignalRMessage message = new SignalRMessage();
    message.target = "newMessage";
    message.arguments.add(req.getBody());
    return message;
}

إرسال إلى مستخدم

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

[FunctionName("SendMessage")]
public static Task SendMessage(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]object message, 
    [SignalR(HubName = "chat")]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": "outRMessages",
  "hubName": "<hub_name>",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}

هنا رمز JavaScript:

module.exports = async function (context, req) {
    context.bindings.signalRMessages  = [{
        // message will only be sent to this user ID
        "userId": "userId1",
        "target": "newMessage",
        "arguments": [ req.body ]
    }];
};

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

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

def main(req: func.HttpRequest, outMessages: func.Out[str]) -> func.HttpResponse:
    message = req.get_json()
    outMessage.set(json.dumps({
        #message will only be sent to this user ID
        'userId': 'userId1',
        'target': 'newMessage',
        'arguments': [ message ]
    }))

إرسال إلى مستخدم

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

@FunctionName("sendMessage")
@SignalROutput(name = "$return", hubName = "chat")
public SignalRMessage sendMessage(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST },
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req) {

    SignalRMessage message = new SignalRMessage();
    message.userId = "userId1";
    message.target = "newMessage";
    message.arguments.add(req.getBody());
    return message;
}

إرسال إلى مجموعة

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

[FunctionName("SendMessage")]
public static Task SendMessage(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]object message,
    [SignalR(HubName = "chat")]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.

مثال function.json:

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

هنا رمز JavaScript:

module.exports = async function (context, req) {
    context.bindings.signalRMessages = [{
        // message will only be sent to this group
        "groupName": "myGroup",
        "target": "newMessage",
        "arguments": [ req.body ]
    }];
};

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

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

def main(req: func.HttpRequest, outMessage: func.Out[str]) -> func.HttpResponse:
    message = req.get_json()
    outMessage.set(json.dumps({
        #message will only be sent to this group
        'groupName': 'myGroup',
        'target': 'newMessage',
        'arguments': [ message ]
    }))

إرسال إلى مجموعة

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

@FunctionName("sendMessage")
@SignalROutput(name = "$return", hubName = "chat")
public SignalRMessage sendMessage(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST },
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req) {

    SignalRMessage message = new SignalRMessage();
    message.groupName = "myGroup";
    message.target = "newMessage";
    message.arguments.add(req.getBody());
    return message;
}

إدارة المجموعة

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

[FunctionName("addToGroup")]
public static Task AddToGroup(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]HttpRequest req,
    ClaimsPrincipal claimsPrincipal,
    [SignalR(HubName = "chat")]
        IAsyncCollector<SignalRGroupAction> signalRGroupActions)
{
    var userIdClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier);
    return signalRGroupActions.AddAsync(
        new SignalRGroupAction
        {
            UserId = userIdClaim.Value,
            GroupName = "myGroup",
            Action = GroupAction.Add
        });
}

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

[FunctionName("removeFromGroup")]
public static Task RemoveFromGroup(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]HttpRequest req,
    ClaimsPrincipal claimsPrincipal,
    [SignalR(HubName = "chat")]
        IAsyncCollector<SignalRGroupAction> signalRGroupActions)
{
    var userIdClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier);
    return signalRGroupActions.AddAsync(
        new SignalRGroupAction
        {
            UserId = userIdClaim.Value,
            GroupName = "myGroup",
            Action = GroupAction.Remove
        });
}

ملاحظة

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

إدارة المجموعة

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

مثال function.json الذي يعرف ربط المخرجات:

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

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

module.exports = async function (context, req) {
  context.bindings.signalRGroupActions = [{
    "userId": req.query.userId,
    "groupName": "myGroup",
    "action": "add"
  }];
};

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

module.exports = async function (context, req) {
  context.bindings.signalRGroupActions = [{
    "userId": req.query.userId,
    "groupName": "myGroup",
    "action": "remove"
  }];
};

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

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

def main(req: func.HttpRequest, action: func.Out[str]) -> func.HttpResponse:
    action.set(json.dumps({
        'userId': 'userId1',
        'groupName': 'myGroup',
        'action': 'add'
    }))

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

def main(req: func.HttpRequest, action: func.Out[str]) -> func.HttpResponse:
    action.set(json.dumps({
        'userId': 'userId1',
        'groupName': 'myGroup',
        'action': 'remove'
    }))

إدارة المجموعة

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

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

@FunctionName("addToGroup")
@SignalROutput(name = "$return", hubName = "chat")
public SignalRGroupAction addToGroup(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST },
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req,
        @BindingName("userId") String userId) {

    SignalRGroupAction groupAction = new SignalRGroupAction();
    groupAction.action = "add";
    groupAction.userId = userId;
    groupAction.groupName = "myGroup";
    return action;
}

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

@FunctionName("removeFromGroup")
@SignalROutput(name = "$return", hubName = "chat")
public SignalRGroupAction removeFromGroup(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST },
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Object> req,
        @BindingName("userId") String userId) {

    SignalRGroupAction groupAction = new SignalRGroupAction();
    groupAction.action = "remove";
    groupAction.userId = userId;
    groupAction.groupName = "myGroup";
    return action;
}

السمات

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

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

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

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

يشرح الجدول التالي الإعدادات المدعومة للتعليق التوضيحي SignalROutput .

الإعداد الوصف
⁩الاسم⁧ اسم المتغير المستخدم في تعليمات الوظيفة البرمجية لعنصر معلومات الاتصال.
hubName يجب تعيين هذه القيمة إلى اسم مركز SignalR الذي يتم إنشاء معلومات الاتصال له.
connectionStringSetting اسم إعداد التطبيق الذي يحتوي على سلسلة اتصال خدمة SignalR، والتي يتم تعيينها افتراضيا إلى AzureSignalRConnectionString.

التكوين

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

خاصية function.json الوصف
النوع يجب تعيينها إلى signalR.
⁩direction⁧ يجب تعيينها إلى out.
⁩الاسم⁧ اسم المتغير المستخدم في تعليمات الوظيفة البرمجية لعنصر معلومات الاتصال.
hubName يجب تعيين هذه القيمة إلى اسم مركز SignalR الذي يتم إنشاء معلومات الاتصال له.
connectionStringSetting اسم إعداد التطبيق الذي يحتوي على سلسلة اتصال خدمة SignalR، والتي يتم تعيينها افتراضيا إلى AzureSignalRConnectionString.

عند التطوير محليا، أضف إعدادات التطبيق في الملف local.settings.json في Values المجموعة.

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