Ошибка переполнения стека при использовании JQuery / ASP.NET для простого чата ajax - PullRequest
1 голос
/ 07 апреля 2009

Я пытаюсь создать простой чат ajax, используя JQuery и ASP.NET. Мой код работает так:

  1. Когда страница загружается, она обновляет div 'chatbox' с запросом к странице messages.aspx, которая обрабатывает получение новых сообщений из базы данных и запускает автоматическое обновление с помощью setTimeout ().
  2. Каждый раз, когда пользователь нажимает кнопку отправки, он добавляет сообщение в базу данных внутри кода messages.aspx page_load.

Я получаю ошибку переполнения стека с самого начала, когда начинается тайм-аут, и я не уверен, что это может вызвать? Это может быть кеширование? Может быть, код в messages.aspx не может завершиться в течение этих 5 секунд? Любая помощь будет оценена!

Кроме того, я не беспокоился об атаках с использованием SQL-инъекций, поскольку я просто пытался заставить его работать с простым кодом.

Вот мой код:

на стороне клиента:

<%@ 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>

Сторона сервера:

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();
    }
}

Ответы [ 2 ]

6 голосов
/ 07 апреля 2009

Ваш javascript refreshChat функция рекурсивно вызывает себя. Измените код на:

        function refreshChat()
        {
            $.get("messages.aspx", function(data) {  
                $("#chatbox").empty();
                $("#chatbox").prepend(data);
            });
            setTimeout(refreshChat, 5000);
        }
3 голосов
/ 07 апреля 2009

Вам нужно обернуть вызов функции в setTimeout в кавычки, в противном случае он вычисляется немедленно, вызывая бесконечную рекурсию и переполнение стека:

setTimeout("refreshChat()", 5000);
...