使用 JQuery/ASP.NET 进行简单 ajax 聊天时出现堆栈溢出错误

发布于 2024-07-16 18:24:18 字数 3585 浏览 6 评论 0原文

我正在尝试使用 JQuery 和 ASP.NET 创建一个简单的 ajax 聊天。 我的代码是这样工作的:

  1. 当页面加载时,它会通过对 messages.aspx 页面的请求来刷新“chatbox”div,该页面处理从数据库获取新消息并使用 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();
    }
}

I am trying to create a simple ajax chat using JQuery and ASP.NET. My code works like this:

  1. When the page loads it refreshes the 'chatbox' div with a request to the messages.aspx page, which handles getting new messages from the database and kicks off an auto-refresh with the setTimeout().
  2. Whenever the user clicks the send button, it adds the message to the database inside the messages.aspx page_load code.

I am getting a stack overflow error right from the start when the timeout starts, and I am not sure what would cause this? Could it be caching? Maybe the code in messages.aspx can't complete running within those 5 seconds? Any help would be appreciated!

Also, I didn't worry about sql injection attacks yet b/c I was just trying to get it working with simple code.

Here's my code:

Client side

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

酷到爆炸 2024-07-23 18:24:18

您的 JavaScript 刷新聊天函数正在递归地调用自身。 将代码更改为:

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

Your javascript refreshChat function is recursively calling itself. Change the code to:

function refreshChat() {
    $.get("messages.aspx", function (data) {
        $("#chatbox").empty();
        $("#chatbox").prepend(data);
    });
    setTimeout(refreshChat, 5000);
}
薄荷梦 2024-07-23 18:24:18

您需要将 setTimeout 中的函数调用用引号引起来,否则它会立即计算,导致无限递归和堆栈溢出:

setTimeout("refreshChat()", 5000);

You need to wrap the function call in your setTimeout in quotes, otherwise it's evaluated immediately, causing infinite recursion and a stack overflow:

setTimeout("refreshChat()", 5000);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文