Вопрос

У меня есть следующий httphandler; Я использую его, чтобы продвигать обновления в браузер (где реализуются jQuery и Gollui) без необходимости опросить браузер. Я думаю, что все, что я достиг, это перемещение цикла опроса на сервер.

Кто -нибудь может сказать мне, как я могу сделать этот класс более надежным и масштабируемым?

Вот код.

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.ihttpasynchandler Или ваш обработчик не будет масштабироваться.

Другие советы

Как называется Queueupdate? Я заметил, что вы берете из этого строки и помещаете их непосредственно в JavaScript, который вы отправляете обратно пользователю. Есть ли шанс, что пользователь может вставить JavaScript в запись и как -то отобразить его обратно?

Кроме того, я бы соответствовал сообщению с действительным режимом сообщения, прежде чем положить его в свою строку JavaScript. Кажется, что кто -то может легко завершить ваш звонок Gollui, а затем довольно легко вставить свой собственный JavaScript. По крайней мере, вы могли бы убедиться, что сообщение, которое вы вставляете, не содержит ни одной цитаты ('), которая может завершить строку и начать новую команду JavaScript.

Может быть, это просто паранойя, но это сделает его более надежным :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top