سؤال

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

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

هذا هو ما يظهر فيدلر في نموذج ويب الطلب (باستخدام الاقتراع الطويل لعلة أزور):

transport   longPolling
connectionId    bbed6f35-8379-4be3-ac28-ef3e618382ae
connectionData  [{"name":"jethub"}]
messageId   85
groups  ["JetHub.f9f81bcc-8417-46bd-bae5-c4134972601d","JetHub.5139a8de-04c2-48da-9427-39666e52fabd","JetHub.6b12e333-4d22-47c3-8587-7a9ad5026184","JetHub.252ea279-7a71-40e7-b03c-7d63e69f07ab","JetHub.a4843a77-1e6d-4693-b3de-b392ef465410","JetHub.27feb53a-3c2d-4b11-92f7-dbdffb874b25","JetHub.8840dfcf-e6be-4b72-965b-b282a60446e8","JetHub.bf7d3301-6fc0-4499-bee8-fe22f1bc2281","JetHub.655cba0e-7f72-402c-b80b-dcb740546163","JetHub.85d817e2-67a3-4291-b564-5320598339f6","JetHub.e3079263-3f6e-4a54-ad88-0dfc5dd2ce18","JetHub.33f00a67-9b05-4293-8119-4617e2fed9b0","JetHub.6323cfe8-fb81-4716-b553-79b9d72641a5","JetHub.b4359f8a-030a-4ac9-aacd-c05b42163bcc", ... many more]

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

شكرا.

هل كانت مفيدة؟

المحلول

كما يتم إدخال مجموعات عبر سلسلة الاستعلام في Signalr 0.5.3، لديك الخيارات التالية: أ) زيادة الحد الأقصى لحجم سلسلة الاستعلام ب) استخدام أسماء المجموعة الأقصر ج) التعامل مع تجميع نفسك على الخادم والبث بشكل منفصل لكل مستخدم

persistentconnections لن يساعد هنا كما تم بناء واجهة برمجة تطبيقات HUB على رأسها، لذلك سوف تعمل في نفس المشكلة.

نصائح أخرى

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

using System.Collections.Generic;
using SignalR;
using SignalR.Hubs;

namespace My.Hubs
{
    public class MyHubDispatcher : HubDispatcher
    {
        public MyHubDispatcher() : base("/myhubs") { }

        protected override Connection CreateConnection(string connectionId, IEnumerable<string> signals, IEnumerable<string> groups)
        {
            //ex: IEnumerable<string> myGroups = new string[] { "MyHub.MyGroup", "MyHub.MyOtherGroup", "MyOtherHub.MyGroup" };
            IEnumerable<string> myGroups = GetGroups(connectionId);
            return base.CreateConnection(connectionId, signals, myGroups);
        }
    }
}

يمكنك بعد ذلك إعداد التوجيه مثل أي اتصال دائم آخر:

using System.Web;
using System.Web.Routing;
using SignalR;

namespace My
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class Application : HttpApplication
    {
        protected void Application_Start()
        {
            RouteTable.Routes.MapConnection<Hubs.MyHubDispatcher>("myhubs", "myhubs/{*operation}");
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }
}

ثم يمكنك استخدام المجموعات على المحاور كما تفعل عادة:

using SignalR.Hubs;

namespace My.Hubs
{
    public class MyHub : Hub
    {
        public void AlertClients(string id, int duration)
        {
            Clients["MyGroup"].Alert("MyGroup");
            Clients["MyOtherGroup"].Alert("MyOtherGroup");
        }
    }
}

إذا كنت تستخدم العميل جس يمكنك ببساطة تضمين البرنامج النصي في ~/myhubs/hubs بدلا من ~/signalr/hubs.إذا كنت تستخدم العميل صافي كنت مجرد استخدام new Client.Hubs.HubConnection("http://foo/myhubs", useDefaultUrl: false);

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top