سؤال

لدي httphandler التالية. أنا أستخدمه لدفع التحديثات إلى المتصفح (حيث يتم تنفيذ jQuery و Growlui) دون الحاجة إلى الاستطلاع للمتصفح. أعتقد أن كل ما أنجزته هو نقل حلقة الاقتراع إلى الخادم.

هل يمكن لأي شخص أن يخبرني كيف يمكنني جعل هذا الفصل أكثر قوة وقابلية للتطوير؟

هنا هو الرمز.

public class LiveUpdates : IHttpHandler
{
    //TODO: Replace this with a repository that the application can log to.
    private static readonly Dictionary<string, Queue<string>> updateQueue;
    static LiveUpdates()
    {
        updateQueue = new Dictionary<string, Queue<string>>();
    }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.Buffer = true;

        while (context.Response.IsClientConnected)
        {
            if (context.User == null) return;
            if (!context.User.Identity.IsAuthenticated) return;

            Thread.Sleep(1000);
            if (!updateQueue.ContainsKey(context.User.Identity.Name)) continue;
            if (updateQueue[context.User.Identity.Name].Count == 0) continue;

            GrowlStatus(context.Response, updateQueue[context.User.Identity.Name].Dequeue());
        }


    }

    protected static void GrowlStatus(HttpResponse Response, string Message)
    {
        // Write out the parent script callback.
        Response.Write(String.Format("<script type=\"text/javascript\">parent.$.growlUI('Message', '{0}');</script>", Message));
        // To be sure the response isn't buffered on the server.    
        Response.Flush();
    }

    public static void QueueUpdate(IPrincipal User, string UpdateMessage)
    {
        if (!updateQueue.ContainsKey(User.Identity.Name))
        {
            updateQueue.Add(User.Identity.Name, new Queue<string>());
        }
        updateQueue[User.Identity.Name].Enqueue(UpdateMessage);
    }

    public static void ClearUpdates(IPrincipal User)
    {
        if (updateQueue.ContainsKey(User.Identity.Name)) updateQueue.Remove(User.Identity.Name);
    }
هل كانت مفيدة؟

المحلول

إذا كنت تخطط للاستخدام Thread.Sleep(), ، يجب أن تنفذ system.web.ihtpasynchandler أو أن معالجك لن يتوسع.

نصائح أخرى

كيف يتم استدعاء QueueUpdate؟ لقد لاحظت أنك تأخذ سلاسل من ذلك ووضعها مباشرة في جافا سكريبت التي ترسلها إلى المستخدم. هل هناك أي فرصة يمكن للمستخدم إدراج JavaScript في إدخال ووجود QueUeUpdate يعرضه بطريقة ما؟

أيضًا ، أود أن أتطابق مع رسالة ضد رسالة سارية المفعول قبل وضعها في سلسلة JavaScript الخاصة بك. يبدو أن شخصًا ما يمكنه إكمال مكالمة Growlui ثم أدخل JavaScript الخاصة به بسهولة تامة. على الأقل ، يمكنك التأكد من أن الرسالة التي تقوم بإدراجها لا تحتوي على عرض أسعار واحد (') يمكنه إنهاء السلسلة وبدء أمر JavaScript جديد.

ربما هذا مجرد جنون العظمة ، لكنه سيجعله أكثر قوة :)

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