Frage

Ich versuche, einen einfachen Ajax-Chat mit JQuery und ASP.NET zu erstellen. Mein Code funktioniert wie folgt:

  1. Wenn die Seite geladen wird es erfrischt die div ‚Chatbox‘ mit einer Anfrage an der messages.aspx Seite, die aus der Datenbank immer neue Nachrichten verarbeitet und startet eine automatische Aktualisierung mit der setTimeout ().
  2. Jedes Mal, wenn der Benutzer den Senden-Button klickt, fügt es die Nachricht an die Datenbank innerhalb des messages.aspx page_load Code.

Ich erhalte einen Stapelüberlauf-Fehler von Anfang an, wenn das Timeout beginnt, und ich bin nicht sicher, was das verursachen würde? Könnte es das Caching werden? Vielleicht füllen Sie bitte den Code in messages.aspx kann nicht innerhalb dieser 5 Sekunden laufen? Jede mögliche Hilfe würde geschätzt!

Auch ich habe mich keine Sorgen über SQL-Injection-Angriffe noch b / c Ich hatte nur versucht, es mit einfachen Code arbeiten zu lassen.

Hier ist mein Code:

Client-Seite:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
        <script src="jquery.js" type="text/javascript"></script>
        <script type="text/javascript">
            $(document).ready(function() {
                refreshChat();
                $("#btnSend").click(function() {
                    addMessage();               
                });
                return false;
            });

            function refreshChat()
            {
                $.get("messages.aspx", function(data) {  
                    $("#chatbox").empty();
                    $("#chatbox").prepend(data);
                });
                setTimeout(refreshChat(), 5000);
            }

            function addMessage()
            {
                $.get("messages.aspx", {usr: $("#usr").val(), msg: $("#msg").val()} );
            }
        </script>
    </head>
    <body>
        <form id="form1" runat="server">

            <div id="input">
                username: <input type="text" name="usr" id="usr" /><br />
                message:<br />
                <textarea id="msg" name="msg" rows="5" cols="30"></textarea><br /><br />
                <input type="button" id="btnSend" name="btnSend" value="Send" />
            </div>

            <div id="chatbox"></div>

        </form>
    </body>
    </html>

Server-Seite:

using System;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections;
using System.IO;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class messages : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {     
        SqlConnection conn = 
            new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=F:\\Chatter\\App_Data\\messages.mdf;Integrated Security=True;User Instance=True");
        conn.Open();

        string sql;
        SqlCommand comm;

        if (Request["usr"] != null)
        {
            string user = Request["usr"].ToString();
            string message = Request["msg"].ToString();
            sql = "insert into messages (usr, msg, [date]) values ('"
                + user + "', '" + message + "', '" + DateTime.Now + "')";
            comm = new SqlCommand(sql, conn);
            comm.ExecuteNonQuery();
        }

        sql = "select top 5 usr, msg from messages order by [date] desc";
        comm = new SqlCommand(sql, conn);
        SqlDataReader dr = comm.ExecuteReader();

        while (dr.Read())
        {
            Response.Write(dr["usr"].ToString() + ": <br/>" + dr["msg"] + "<br/><br/>");
        }
        dr.Close();

        conn.Close();
    }
}
War es hilfreich?

Lösung

Ihre Javascript refreshChat Funktion rekursiv ruft selbst. Ändern Sie den Code an:

        function refreshChat()
        {
            $.get("messages.aspx", function(data) {  
                $("#chatbox").empty();
                $("#chatbox").prepend(data);
            });
            setTimeout(refreshChat, 5000);
        }

Andere Tipps

Sie müssen den Funktionsaufruf in Ihrem SetTimeout in Anführungszeichen wickeln, sonst wird es sofort ausgewertet ist, wodurch eine unendliche Rekursion und einen Stapelüberlauf:

setTimeout("refreshChat()", 5000);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top