ajax+asp.net+mssql无刷新聊天室

Go 旅城通票 2009-09-07 11:38:47
加精
ajax+asp.net+mssql实现的ajax无刷新聊天室,支持html web编辑器。供大家参考下。

不过有个小问题,就是firefox下如果使用快捷键ctrl+enter发送信息时,如果不延时调用发送函数,会弹出ff的下载对话框,奇怪。

谁能解决这个问题,100分归他,其他100分当作散分。

if(e.ctrlKey&&e.keyCode==13){
e.preventDefault();
e.stopPropagation();
setTimeout("Showbo.Chat.send()",50);//在ff中马上使用alert提示时尽然弹出下载工具,奇怪.
return false;}
},false);






为了加快速度,使用了存储过程。

aspphp版本请看下面的文章

ajax+asp+mssql无刷新聊天室
ajax+php+mssql无刷新聊天室


要使用不同的动态页面,只需要更改lib.js文件中RequstUrl变量的值即可。

完整示例下载

效果如下









内容长度限制,所以就不贴出所有的代码了,要看全部代码请下载示例或者查看下面这篇文章
ajax+asp.net+mssql无刷新聊天室


下面贴出C#的主要的代码,其他版本请查看上面的链接

ajax.cs
using System;
using System.Web;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
public class Ajax
{

private static bool IsNull(string v)
{
if (v == null || v.Trim() == "") return true;
else return false;
}

private static string Js(string v)
{
return v.Replace("'", "\\'");
}

public static string Login()
{
HttpRequest Request = HttpContext.Current.Request;
string rStr = "";

string UserName = Request.Form["nn"];
if (IsNull(UserName))
{
rStr = "success:false,err:'昵称不能为空!'";
}
else if (UserName.Length > 20)
{
rStr = "success:false,err:'昵称不能超过20个字符!'";
}
else
{
string UserId = "", Key = "";
SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);
cn.Open();
try
{
SqlCommand cm = new SqlCommand("ajaxLogin", cn);
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.Add(new SqlParameter("@UserName", SqlDbType.NVarChar, 50));
cm.Parameters["@UserName"].Value = UserName;
//==========输出参数
cm.Parameters.Add(new SqlParameter("@UserId", SqlDbType.NVarChar, 18));
cm.Parameters["@UserId"].Direction = ParameterDirection.Output;
cm.Parameters.Add(new SqlParameter("@UserKey", SqlDbType.NVarChar, 5));
cm.Parameters["@UserKey"].Direction = ParameterDirection.Output;

cm.ExecuteNonQuery();
UserId = cm.Parameters["@UserId"].Value.ToString().Trim();
Key = cm.Parameters["@UserKey"].Value.ToString().Trim();
if (UserId == "-1") rStr = @"success:false,err:'发生错误,请稍后再试!'";
else if (UserId == "0") rStr = @"success:false,err:'已经存在此用户昵称,请修改您的昵称!'";
else rStr += "success:true,UserId:'" + UserId + "',Key:'" + Key + "'";
cm.Dispose();
}
catch (Exception e)
{
rStr = @"success:false,err:'原因\\n" + Js(e.Message) + "'";
}
cn.Close();
}

return rStr;
}

public static string Logout()
{
HttpRequest Request = HttpContext.Current.Request;
string rStr = "", UserId = Request.Form["uid"], Key = Request.Form["key"];
if (IsNull(UserId) || IsNull(Key)) return "success:false,err:'用户信息丢失!'";

SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);
cn.Open();
try
{
SqlCommand cm = new SqlCommand("ajaxLogout", cn);
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.Add(new SqlParameter("@UserId", SqlDbType.NVarChar, 18));
cm.Parameters["@UserId"].Value = UserId;
cm.Parameters.Add(new SqlParameter("@UserKey", SqlDbType.NVarChar, 5));
cm.Parameters["@UserKey"].Value = Key;
cm.Parameters.Add(new SqlParameter("@Result", SqlDbType.Int));
cm.Parameters["@Result"].Direction = ParameterDirection.Output;

cm.ExecuteNonQuery();

if(cm.Parameters["@UserId"].Value.ToString().Trim()=="0")rStr = "success:false,err:'用户信息不存在!'";
else rStr="success:true";
cm.Dispose();
}
catch (Exception e)
{

}
cn.Close();
return rStr;
}

public static string Say()
{
HttpRequest Request = HttpContext.Current.Request;
string From = Request.Form["from"], To = Request.Form["to"]
, Key = Request.Form["key"], Msg = Request.Form["ct"], rStr = "";
if (IsNull(From) || IsNull(Key) || IsNull(To) || IsNull(Msg)) rStr = "success:false,err:'信息传递不完整!'";
else
{
SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);
cn.Open();
try
{
SqlCommand cm = new SqlCommand("ajaxSay", cn);
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.Add(new SqlParameter("@UserKey", SqlDbType.NVarChar, 5));
cm.Parameters["@UserKey"].Value = Key;
cm.Parameters.Add(new SqlParameter("@From", SqlDbType.NVarChar, 18));
cm.Parameters["@From"].Value = From;
cm.Parameters.Add(new SqlParameter("@To", SqlDbType.NVarChar, 18));
cm.Parameters["@To"].Value = To;
cm.Parameters.Add(new SqlParameter("@Msg", SqlDbType.NVarChar, 800));
cm.Parameters["@Msg"].Value = Msg;
cm.Parameters.Add(new SqlParameter("@Result", SqlDbType.Int));
cm.Parameters["@Result"].Direction = ParameterDirection.Output;
cm.ExecuteNonQuery();
if (cm.Parameters["@Result"].Value.ToString() == "0") rStr = "sucess:false,err:'发表失败!\\n原因:接收者已经不存在!'";
else rStr = "success:true";
cm.Dispose();
}
catch (Exception e)
{
rStr = "sucess:false,err:'发表失败!原因\\n" + Js(e.Message) + "'";
}
cn.Close();
}
return rStr;
}

public static string ReadUser()
{
HttpRequest Request = HttpContext.Current.Request;
string rStr = "", UserId = Request.Form["uid"];
if (IsNull(UserId)) rStr += "success:false,err:'用户id丢失!'";
else
{
SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);
cn.Open();
try
{
SqlCommand cm = new SqlCommand("ajaxReadUser", cn);
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.Add(new SqlParameter("@UserId", SqlDbType.NVarChar, 18));
cm.Parameters["@UserId"].Value = UserId;
string j = "";
SqlDataReader dr = cm.ExecuteReader();
while (dr.Read()) j += ",{id:'" + dr[0] + "',nn:'" + Js(dr[1].ToString()) + "'}";
dr.Close();
cm.Dispose();
rStr = "success:true,data:[" + (j == "" ? "" : j.Substring(1)) + "]";
}
catch (Exception e)
{
rStr = @"success:false,err:'发生如下错误\\n" + Js(e.Message) + "'";
}
cn.Close();
}
return rStr;
}

public static string Read()
{
HttpRequest Request = HttpContext.Current.Request;
string rStr = "";
string UserId = Request.Form["uid"], Key = Request.Form["key"];
if (IsNull(UserId) || IsNull(Key)) rStr = "success:false,err:'用户信息丢失!'";
else
{
SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);
cn.Open();
try
{
SqlCommand cm = new SqlCommand("ajaxRead", cn);
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.Add(new SqlParameter("@UserId", SqlDbType.NVarChar, 18));
cm.Parameters["@UserId"].Value = UserId;
cm.Parameters.Add(new SqlParameter("@UserKey", SqlDbType.NVarChar, 5));
cm.Parameters["@UserKey"].Value = Key;
SqlDataReader dr = cm.ExecuteReader();
string j = "";
while (dr.Read()) j += ",'" + Js(dr[0].ToString()) + "'";
dr.Close();
cm.Dispose();
rStr = "success:true,data:[" + (j == "" ? "" : j.Substring(1)) + "]";
}
catch (Exception e)
{
rStr = "success:false,err:'发生以下错误" + Js(e.Message) + "'";
}
cn.Close();
}
return rStr;
}
}
...全文
12934 255 打赏 收藏 转发到动态 举报
写回复
用AI写文章
255 条回复
切换为时间正序
请发表友善的回复…
发表回复
adolfyunlong 2012-08-20
  • 打赏
  • 举报
回复
楼主有没有cs架构的相关代码 提供给偶们啊
adolfyunlong 2012-08-20
  • 打赏
  • 举报
回复
ajax的功能就是强大
xulisha_bendan 2012-08-10
  • 打赏
  • 举报
回复
下载不了 求源码
jiao759399125 2012-02-24
  • 打赏
  • 举报
回复
友情顶
my328420969 2012-01-09
  • 打赏
  • 举报
回复
悄悄。。
vsun6 2011-09-26
  • 打赏
  • 举报
回复
感谢分享
jk203mn 2011-07-06
  • 打赏
  • 举报
回复
收藏了
hengo2011 2011-06-17
  • 打赏
  • 举报
回复
看了正需要,不顶就太不仁道了~~
w_l_851110 2010-11-23
  • 打赏
  • 举报
回复
楼主此等高人必须被表扬一下!
米娅 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用 98 楼 wz78610876 的回复:]
呵呵 学习看看
[/Quote]
。。。
namegz 2010-10-25
  • 打赏
  • 举报
回复
看不懂啊!
Still_Forward 2010-08-08
  • 打赏
  • 举报
回复
楼主厉害。
浅陌游离 2010-07-22
  • 打赏
  • 举报
回复
学习下、。
fzzfly 2010-07-12
  • 打赏
  • 举报
回复
顶吧~~~~~~~~~~
petrie 2010-07-03
  • 打赏
  • 举报
回复
为什么会提示:“动态页发生严重错误,请联系管理员。<html>...</html>”烦躁啊
petrie 2010-07-03
  • 打赏
  • 举报
回复
跪谢 等等
guolunfeng 2010-06-25
  • 打赏
  • 举报
回复
MARK
Gillber 2010-06-21
  • 打赏
  • 举报
回复
这个绝对得顶,学习。。
qcfking 2010-06-21
  • 打赏
  • 举报
回复
感谢分享,学习了。
ericle03 2010-04-19
  • 打赏
  • 举报
回复
这个也要顶啊? 晕,

大哥 , 如果能避开数据库操作, 那我就顶了,

如果直接用TCP/IP 协议连接到主机,像C/S架构一样, 我就佩服得五体投地,

问题是, 这个站的资源也太大了咯,伤心~
加载更多回复(219)
最近利用闲暇时间,作了个简单的聊天室,该聊天室使用 prototype.js (v1.4) 类库,主要应用Ajax技术、Application变量,做到小型架构,页面无刷新,[b]无数据库[/b],能查看在线用户等特点。

刚开始打算用access小型数据库,但考虑到多人在线时,这种轻量级的数据库承受能力将不能胜任存储任务,MSsql又不熟悉,我的空间也不支持,所以只往小型方向开发。所有聊天数据都存入服务器变量中,客户端与服务器的交互采用json的数据结构,效率还是相当高的。

写js也有一段时间了,发现再用vbscript写asp,有点不适应vb的语法,因此服务端application的全部使用Jscript操作。(js真tmd的自由!自由到连个像样子的IDE都没有-_-)。

当前已知的bug:
如果用户在任务管理器里终止ie进程,那么在线用户列表里将不能删除该用户名。(因为body元素的onunload没法运行-_-)

可以改进的地方:
1、客户端每隔n毫秒取一次数据,但当前返回的数据是整个application变量,比较长,可以只取最新的消息。这样可以改进数据交换的效率。
2、因为application不能太大,否则服务器必定挂掉,所以只好设置长度限制,超过n条记录后自动删除之前的消息,自动维护application的长度,听起来似乎是个好消息,但客户端也只能保存n条记录-_-,完全可以把所有记录在客户端缓存嘛。

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧