Question

Je donne les résultats suivants HttpHandler; Je l'utilise pour pousser les mises à jour au navigateur (où jQuery et GrowlUI sont mis en œuvre) sans qu'il soit nécessaire pour que le navigateur sondage. Je pense que tout ce que j'ai accompli est le déplacement de la boucle d'interrogation sur le serveur.

Quelqu'un peut-il me dire comment je peux faire de cette classe plus robuste et évolutive?

Voici le code.

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);
    }
Était-ce utile?

La solution

Si vous prévoyez d'utiliser Thread.Sleep(), vous devez implémenter système .Web.IHttpAsyncHandler ou votre gestionnaire ne sera pas l'échelle.

Autres conseils

Comment est QueueUpdate appelé? J'ai remarqué que vous prenez les chaînes de cela et le placer directement dans le javascript que vous envoyez à l'utilisateur. Est-il possible qu'un utilisateur peut insérer javascript dans une entrée et ont QueueUpdate afficher en quelque sorte revenir?

En outre, je correspondre un message contre un regex de message valide avant de le mettre dans votre chaîne javascript. Il semble que quelqu'un pourrait compléter votre appel growlUi puis insérer leur propre javascript assez facilement. Au moins, vous pourriez très vous assurer que le message que vous insérez ne contient pas une seule citation ( ') qui pourrait mettre fin à la chaîne et de commencer une nouvelle commande javascript.

Peut-être que tout simplement la paranoïa, mais il va le rendre plus robuste:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top