간단한 ajax 채팅에 jquery/asp.net을 사용할 때 오버플로 오류 스택
-
05-09-2019 - |
문제
JQuery와 ASP.Net을 사용하여 간단한 Ajax 채팅을 만들려고합니다. 내 코드는 다음과 같이 작동합니다.
- 페이지가로드되면 Messages.aspx 페이지에 대한 요청으로 'Chatbox'Div를 새로 고침하여 데이터베이스에서 새 메시지를 가져오고 settimeout ()로 자동 새로 고침을 시작합니다.
- 사용자가 보내기 버튼을 클릭 할 때마다 메시지를 메시지 내부의 데이터베이스에 추가합니다.
타임 아웃이 시작될 때 시작부터 스택 오버 플로우 오류가 발생했는데 이것이 원인이 무엇인지 잘 모르겠습니다. 캐싱 일 수 있습니까? 아마도 Messages.aspx의 코드가 5 초 안에 실행할 수 없습니까? 모든 도움이 감사하겠습니다!
또한 SQL 주입 공격에 대해 걱정하지 않았지만 B/C는 간단한 코드로 작동하도록 노력했습니다.
내 코드는 다음과 같습니다.
고객 입장에서:
<%@ 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();
}
}
해결책
JavaScript ComphentChat 함수는 재귀 적으로 스스로 호출됩니다. 코드를 다음으로 변경합니다.
function refreshChat()
{
$.get("messages.aspx", function(data) {
$("#chatbox").empty();
$("#chatbox").prepend(data);
});
setTimeout(refreshChat, 5000);
}
다른 팁
설정 타임 아웃에서 함수 호출을 따옴표로 랩핑해야합니다. 그렇지 않으면 즉시 평가되어 무한 재귀와 스택 오버플로가 발생합니다.
setTimeout("refreshChat()", 5000);
제휴하지 않습니다 StackOverflow