مشاركة عبر


استخدام خدمة Azure SignalR

توضح هذه المقالة كيفية استخدام SDK في جانب خادم التطبيق للاتصال بخدمة SignalR عند استخدام SignalR في خادم التطبيق.

هام

تظهر سلسلة الاتصال الأولية في هذه المقالة لأغراض العرض التوضيحي فقط.

يتضمن سلسلة الاتصال معلومات التخويل المطلوبة لتطبيقك للوصول إلى خدمة Azure SignalR. مفتاح الوصول داخل سلسلة الاتصال يشبه كلمة مرور الجذر للخدمة الخاصة بك. في بيئات الإنتاج، قم دائما بحماية مفاتيح الوصول الخاصة بك. استخدم Azure Key Vault لإدارة مفاتيحك وتدويرها بأمان وتأمين سلسلة الاتصال باستخدام معرف Microsoft Entra وتخويل الوصول باستخدام معرف Microsoft Entra.

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

قم بإنشاء مثيل Azure SignalR Service

اتبع التشغيل السريع: استخدم قالب ARM لنشر Azure SignalR لإنشاء مثيل خدمة SignalR.

بالنسبة إلى ASP.NET Core SignalR

تثبيت حزمة SDK

قم بتشغيل الأمر لتثبيت SignalR Service SDK إلى مشروع ASP.NET Core.

dotnet add package Microsoft.Azure.SignalR

في الفئة الخاصة بك Startup ، استخدم SignalR Service SDK كمقتطف التعليمات البرمجية التالي.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR()
            .AddAzureSignalR();
}

public void Configure(IApplicationBuilder app)
{
    app.UseEndpoints(routes =>
    {
        routes.MapHub<YourHubClass>("/path_for_your_hub");
    });
}

تكوين سلسلة الاتصال

تظهر سلسلة الاتصال الأولية في هذه المقالة لأغراض العرض التوضيحي فقط. في بيئات الإنتاج، قم دائما بحماية مفاتيح الوصول الخاصة بك. استخدم Azure Key Vault لإدارة مفاتيحك وتدويرها بأمان وتأمين سلسلة الاتصال باستخدام معرف Microsoft Entra وتخويل الوصول باستخدام معرف Microsoft Entra.

هناك نهجان لتكوين سلسلة الاتصال SignalR Service في التطبيق الخاص بك.

  • تعيين متغير بيئة باسم Azure:SignalR:ConnectionString أو Azure__SignalR__ConnectionString.

    • في Azure App Service، ضعها في إعدادات التطبيق.
  • مرر سلسلة الاتصال كمعلمة ل AddAzureSignalR().

    services.AddSignalR()
            .AddAzureSignalR("<replace with your connection string>");
    

    أو

    services.AddSignalR()
            .AddAzureSignalR(options => options.ConnectionString = "<replace with your connection string>");
    

تكوين الخيارات

هناك بعض الخيارات التي يمكنك تخصيصها عند استخدام Azure SignalR Service SDK.

ConnectionString

  • القيمة الافتراضية هي أو Azure:SignalR:ConnectionStringconnectionStringappSetting في web.config الملف.
  • يمكن إعادة تكوينه، ولكن تأكد من أن القيمة غير مشفرة.

InitialHubServerConnectionCount

  • القيمة الافتراضية هي 5.
  • يتحكم هذا الخيار في العدد الأولي للاتصالات لكل مركز بين خادم التطبيق وخدمة Azure SignalR. عادة ما تحتفظ به لأن القيمة الافتراضية كافية. أثناء وقت التشغيل، قد يبدأ SDK اتصالات خادم جديدة لضبط الأداء أو موازنة التحميل. عندما يكون لديك عدد كبير من العملاء، يمكنك منحه عددا أكبر من أجل معدل نقل أفضل. على سبيل المثال، إذا كان لديك 100000 عميل إجمالا، يمكن زيادة عدد الاتصالات إلى 10 أو 15.

MaxHubServerConnectionCount

  • القيمة الافتراضية هي null.
  • يتحكم هذا الخيار في الحد الأقصى لعدد الاتصالات المسموح بها لكل مركز بين خادم التطبيق وخدمة Azure SignalR. أثناء وقت التشغيل، قد يبدأ SDK اتصالات خادم جديدة لضبط الأداء أو موازنة التحميل. بشكل افتراضي، يبدأ اتصال خادم جديد كلما لزم الأمر. عند تكوين الحد الأقصى المسموح به لعدد اتصالات الخادم، لا يبدأ SDK اتصالات جديدة عندما يصل عدد اتصالات الخادم إلى الحد الأقصى.

ApplicationName

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

ClaimsProvider

  • القيمة الافتراضية هي null.
  • يتحكم هذا الخيار في المطالبات التي تريد إقرانها باتصال العميل. يتم استخدامه عندما تقوم Service SDK بإنشاء رمز مميز للوصول للعميل في طلب التفاوض الخاص بالعميل. بشكل افتراضي، يتم حجز جميع المطالبات من HttpContext.User الطلب المتفاوض عليه. يمكن الوصول إليها في Hub.Context.User.
  • عادة يجب أن تترك هذا الخيار كما هو. تأكد من فهم ما يحدث قبل تخصيصه.

AccessTokenLifetime

  • القيمة الافتراضية هي 1 hour.
  • يتحكم هذا الخيار في العمر الصحيح للرمز المميز للوصول، الذي تنشئه Service SDK لكل عميل. يتم إرجاع الرمز المميز للوصول استجابة لطلب التفاوض الخاص بالعميل.
  • عند ServerSentEvent أو LongPolling يتم استخدامه كنقل، سيتم إغلاق اتصال العميل بسبب فشل المصادقة بعد وقت انتهاء الصلاحية. يمكنك زيادة هذه القيمة لتجنب قطع اتصال العميل.

AccessTokenAlgorithm

  • القيمة الافتراضية هي HS256
  • يوفر هذا الخيار اختيار SecurityAlgorithms عند إنشاء رمز مميز للوصول. القيم الاختيارية المدعومة الآن هي HS256 و HS512. لاحظ أن HS512 أكثر أمانا ولكن الرمز المميز الذي تم إنشاؤه أطول نسبيا من ذلك باستخدام HS256.

ServerStickyMode

  • القيمة الافتراضية هي Disabled.
  • يحدد هذا الخيار وضع ثبات الخادم. عندما يتم توجيه العميل إلى الخادم الذي يتفاوض معه أولا، نسميه لزجا على الخادم.
  • في السيناريوهات الموزعة، يمكن أن يكون هناك عدة خوادم تطبيقات متصلة بمثيل Azure SignalR واحد. كما توضح الأقسام الداخلية لاتصالات العميل، يتفاوض العميل أولا مع خادم التطبيق، ثم يعيد التوجيه إلى Azure SignalR لتأسيس الاتصال المستمر. ثم يعثر Azure SignalR على خادم تطبيق واحد لخدمة العميل، كما توضح بيانات النقل بين العميل والخادم .
    • عندما Disabled، يوجه العميل إلى خادم تطبيق عشوائي. بشكل عام، تحتوي خوادم التطبيقات على اتصالات عميل متوازنة مع هذا الوضع. إذا كانت السيناريوهات الخاصة بك يتم بثها أو إرسال مجموعة، فاستخدم هذا الخيار الافتراضي كاف.
    • عندما Preferredيحاول Azure SignalR العثور على خادم التطبيق الذي يتفاوض معه العميل أولا بطريقة لا تحتاج إلى أي تكلفة أخرى أو توجيه عمومي. يمكن أن يكون هذا مفيدا عند إرسال السيناريو الخاص بك إلى الاتصال*. يمكن أن يكون الإرسال إلى الاتصال أداء أفضل وزمن انتقال أقل عند توجيه المرسل والمتلقي إلى نفس خادم التطبيق.
    • عندما Requiredيحاول Azure SignalR دائما العثور على خادم التطبيق الذي يتفاوض معه العميل أولا. يمكن أن يكون هذا الخيار مفيدا عند إحضار بعض سياق العميل من negotiate الخطوة وتخزينه في الذاكرة، ثم استخدامه داخل Hubs. ومع ذلك، قد يكون لهذا الخيار عيوب في الأداء لأنه يتطلب من Azure SignalR بذل جهود أخرى للعثور على خادم التطبيق المحدد هذا عالميا، والاحتفاظ بحركة مرور التوجيه عالميا بين العميل والخادم.

GracefulShutdown

GracefulShutdown.Mode
  • القيمة الافتراضية هي Off
  • يحدد هذا الخيار السلوك بعد أن يتلقى خادم التطبيق SIGINT (CTRL + C).
  • عند التعيين إلى WaitForClientsClose، بدلا من إيقاف الخادم على الفور، نقوم بإزالته من خدمة Azure SignalR لمنع تعيين اتصالات عميل جديدة إلى هذا الخادم.
  • عند التعيين إلى MigrateClients، بالإضافة إلى ذلك، نحاول ترحيل اتصالات العميل إلى خادم صالح آخر. سيتم تشغيل الترحيل فقط بعد تسليم رسالة.
    • OnConnected OnDisconnected ويتم تشغيلها عند ترحيل الاتصالات داخل/خارج.
    • IConnectionMigrationFeature يمكن أن يساعدك في تحديد ما إذا كان الاتصال قد تم ترحيله إلى داخل/خارج.
    • راجع نماذج التعليمات البرمجية الخاصة بنا للحصول على تفاصيل الاستخدام.
GracefulShutdown.Timeout
  • القيمة الافتراضية هي 30 seconds
  • يحدد هذا الخيار أطول وقت في انتظار إغلاق/ترحيل العملاء.

ServiceScaleTimeout

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

MaxPollIntervalInSeconds

  • القيمة الافتراضية هي 5
  • يحدد هذا الخيار الحد الأقصى للفاصل الزمني للاستقصاء المسموح به للاتصالات LongPolling في Azure SignalR Service. إذا لم يأتي طلب الاستقصاء التالي ضمن MaxPollIntervalInSeconds، فإن Azure SignalR Service ينظف اتصال العميل.
  • تقتصر القيمة على [1, 300].

TransportTypeDetector

  • القيمة الافتراضية: يتم تمكين كافة عمليات النقل.
  • يحدد هذا الخيار دالة لتخصيص عمليات النقل التي يمكن للعملاء استخدامها لإرسال طلبات HTTP.
  • استخدم هذه الخيارات بدلا من HttpConnectionDispatcherOptions.Transports لتكوين عمليات النقل.

AllowStatefulReconnects

  • القيمة الافتراضية هي null
  • يتيح هذا الخيار أو يعطل عمليات إعادة الاتصال ذات الحالة لجميع المراكز.
  • إذا ، nullفستقرأ SDK إعدادات المركز.
  • إذا ، trueستمكن Azure SignalR Service عمليات إعادة الاتصال ذات الحالة في جميع المراكز المعلن عنها. ويحتاج العملاء إلى تمكين عمليات إعادة الاتصال ذات الحالة في جانب العميل.
  • إذا ، falseستقوم خدمة Azure SignalR بتعطيل عمليات إعادة الاتصال ذات الحالة في جميع المراكز المعلن عنها.

عينة

يمكنك تكوين الخيارات أعلاه مثل نموذج التعليمات البرمجية التالي.

services.AddSignalR()
        .AddAzureSignalR(options =>
            {
                options.InitialHubServerConnectionCount = 10;
                options.AccessTokenLifetime = TimeSpan.FromDays(1);
                options.ClaimsProvider = context => context.User.Claims;

                options.GracefulShutdown.Mode = GracefulShutdownMode.WaitForClientsClose;
                options.GracefulShutdown.Timeout = TimeSpan.FromSeconds(10);
                options.TransportTypeDetector = httpContext => AspNetCore.Http.Connections.HttpTransportType.WebSockets | AspNetCore.Http.Connections.HttpTransportType.LongPolling;
            });

بالنسبة إلى ASP.NET SignalR القديم

إشعار

إذا كانت هذه هي المرة الأولى التي تحاول فيها SignalR، نوصيك باستخدام ASP.NET Core SignalR، فهو أبسط وأكثر موثوقية وأسهل في الاستخدام.

تثبيت حزمة SDK

تثبيت SignalR Service SDK إلى مشروع ASP.NET الخاص بك باستخدام وحدة تحكم مدير الحِزَم:

Install-Package Microsoft.Azure.SignalR.AspNet

في الفئة الخاصة بك Startup ، استخدم SignalR Service SDK كمقتطف التعليمات البرمجية التالي، استبدل MapSignalR() ب MapAzureSignalR({your_applicationName}). استبدل {YourApplicationName} باسم التطبيق الخاص بك، هذا هو الاسم الفريد لتمييز هذا التطبيق مع التطبيقات الأخرى. يمكنك استخدام this.GetType().FullName كقيمة.

public void Configuration(IAppBuilder app)
{
    app.MapAzureSignalR(this.GetType().FullName);
}

تكوين سلسلة الاتصال

قم بتعيين سلسلة الاتصال في web.config الملف، إلى connectionStrings القسم :

<configuration>
    <connectionStrings>
        <add name="Azure:SignalR:ConnectionString" connectionString="Endpoint=...;AccessKey=..."/>
    </connectionStrings>
    ...
</configuration>

تكوين الخيارات

هناك بعض الخيارات التي يمكنك تخصيصها عند استخدام Azure SignalR Service SDK.

ConnectionString

  • القيمة الافتراضية هي أو Azure:SignalR:ConnectionStringconnectionStringappSetting في web.config الملف.
  • يمكن إعادة تكوينه، ولكن تأكد من أن القيمة غير مشفرة.

InitialHubServerConnectionCount

  • القيمة الافتراضية هي 5.
  • يتحكم هذا الخيار في العدد الأولي للاتصالات لكل مركز بين خادم التطبيق وخدمة Azure SignalR. عادة ما تحتفظ به لأن القيمة الافتراضية كافية. أثناء وقت التشغيل، قد يبدأ SDK اتصالات خادم جديدة لضبط الأداء أو موازنة التحميل. عندما يكون لديك عدد كبير من العملاء، يمكنك منحه عددا أكبر من أجل معدل نقل أفضل. على سبيل المثال، إذا كان لديك 100000 عميل إجمالا، يمكن زيادة عدد الاتصالات إلى 10 أو 15.

MaxHubServerConnectionCount

  • القيمة الافتراضية هي null.
  • يتحكم هذا الخيار في الحد الأقصى لعدد الاتصالات المسموح بها لكل مركز بين خادم التطبيق وخدمة Azure SignalR. أثناء وقت التشغيل، قد يبدأ SDK اتصالات خادم جديدة لضبط الأداء أو موازنة التحميل. بشكل افتراضي، يبدأ اتصال خادم جديد كلما لزم الأمر. عند تكوين الحد الأقصى المسموح به لعدد اتصالات الخادم، لا يبدأ SDK اتصالات جديدة عندما يصل عدد اتصالات الخادم إلى الحد الأقصى.

ApplicationName

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

ClaimProvider

  • القيمة الافتراضية هي null.
  • يتحكم هذا الخيار في المطالبات التي تريد إقرانها باتصال العميل. يتم استخدامه عندما تقوم Service SDK بإنشاء رمز مميز للوصول للعميل في طلب التفاوض الخاص بالعميل. بشكل افتراضي، يتم حجز جميع المطالبات من IOwinContext.Authentication.User الطلب المتفاوض عليه.
  • عادة يجب أن تترك هذا الخيار كما هو. تأكد من فهم ما يحدث قبل تخصيصه.

AccessTokenLifetime

  • القيمة الافتراضية هي 1 hour.
  • يتحكم هذا الخيار في العمر الصحيح للرمز المميز للوصول، الذي تنشئه Service SDK لكل عميل. يتم إرجاع الرمز المميز للوصول استجابة لطلب التفاوض الخاص بالعميل.
  • عند ServerSentEvent أو LongPolling يتم استخدامه كنقل، سيتم إغلاق اتصال العميل بسبب فشل المصادقة بعد وقت انتهاء الصلاحية. يمكنك زيادة هذه القيمة لتجنب قطع اتصال العميل.

AccessTokenAlgorithm

  • القيمة الافتراضية هي HS256
  • يوفر هذا الخيار اختيار SecurityAlgorithms عند إنشاء رمز مميز للوصول. القيم الاختيارية المدعومة الآن هي HS256 و HS512. لاحظ أن HS512 أكثر أمانا ولكن الرمز المميز الذي تم إنشاؤه أطول نسبيا من ذلك باستخدام HS256.

ServerStickyMode

  • القيمة الافتراضية هي Disabled.
  • يحدد هذا الخيار وضع ثبات الخادم. عندما يتم توجيه العميل إلى الخادم الذي يتفاوض معه أولا، نسميه لزجا على الخادم.
  • في السيناريوهات الموزعة، يمكن أن يكون هناك عدة خوادم تطبيقات متصلة بمثيل Azure SignalR واحد. كما توضح الأقسام الداخلية لاتصالات العميل، يتفاوض العميل أولا مع خادم التطبيق، ثم يعيد التوجيه إلى Azure SignalR لتأسيس الاتصال المستمر. ثم يعثر Azure SignalR على خادم تطبيق واحد لخدمة العميل، كما توضح بيانات النقل بين العميل والخادم .
    • عندما Disabled، يوجه العميل إلى خادم تطبيق عشوائي. بشكل عام، تحتوي خوادم التطبيقات على اتصالات عميل متوازنة مع هذا الوضع. إذا كانت السيناريوهات الخاصة بك يتم بثها أو إرسال مجموعة، فاستخدم هذا الخيار الافتراضي كاف.
    • عندما Preferredيحاول Azure SignalR العثور على خادم التطبيق الذي يتفاوض معه العميل أولا بطريقة لا تحتاج إلى أي تكلفة أخرى أو توجيه عمومي. يمكن أن يكون هذا مفيدا عند إرسال السيناريو الخاص بك إلى الاتصال*. يمكن أن يكون الإرسال إلى الاتصال أداء أفضل وزمن انتقال أقل عند توجيه المرسل والمتلقي إلى نفس خادم التطبيق.
    • عندما Requiredيحاول Azure SignalR دائما العثور على خادم التطبيق الذي يتفاوض معه العميل أولا. يمكن أن يكون هذا الخيار مفيدا عند إحضار بعض سياق العميل من negotiate الخطوة وتخزينه في الذاكرة، ثم استخدامه داخل Hubs. ومع ذلك، قد يكون لهذا الخيار عيوب في الأداء لأنه يتطلب من Azure SignalR بذل جهود أخرى للعثور على خادم التطبيق المحدد هذا عالميا، والاحتفاظ بحركة مرور التوجيه عالميا بين العميل والخادم.

MaxPollIntervalInSeconds

  • القيمة الافتراضية هي 5
  • يحدد هذا الخيار الحد الأقصى لوقت الخمول المسموح به للاتصالات غير النشطة في Azure SignalR Service. في ASP.NET SignalR، ينطبق على نوع نقل الاستقصاء الطويل أو إعادة الاتصال. إذا لم يأتي الطلب أو /poll التالي /reconnect ضمن MaxPollIntervalInSeconds، فإن Azure SignalR Service ينظف اتصال العميل.
  • تقتصر القيمة على [1, 300].

عينة

يمكنك تكوين الخيارات أعلاه مثل نموذج التعليمات البرمجية التالي.

app.Map("/signalr",subApp => subApp.RunAzureSignalR(this.GetType().FullName, new HubConfiguration(), options =>
{
    options.InitialHubServerConnectionCount = 1;
    options.AccessTokenLifetime = TimeSpan.FromDays(1);
    options.ClaimProvider = context => context.Authentication?.User.Claims;
}));

توسيع نطاق خادم التطبيق

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

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

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

في هذه المقالة، ستتعلم كيفية استخدام SignalR Service في تطبيقاتك. تحقق من المقالات التالية لمعرفة المزيد حول SignalR Service.