.net ajax 异步请求发布到IIS失效
以下是一般处理程序using System;
using System.Collections;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
namespace message.ashx
{
/// <summary>
/// $codebehindclassname$ 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Login : IHttpHandler
{
UsersInfo user;
string sign;
public void ProcessRequest(HttpContext context)
{
context.Response.Clear();
string username = context.Request.QueryString["UserName"];
string userPass = context.Request.QueryString["UserPass"];
try
{
if (FormCheck(username, userPass))
{
string md5pass = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(user.LoginPass, "MD5").ToLower();
string sql = "select count(*) from Users where LoginName='" + username + "' and LoginPass='" + md5pass + "'";
if (Convert.ToInt32(PubSqlHelperFunc.ExecuteScalar(CommandType.Text, sql, null)) > 0)
{
sign = "登录成功";
AdminSession.setSession(user.LoginName);
}
else
{
sign = "您输入的帐号密码有误";
}
}
}
catch (Exception ex)
{
}
context.Response.ContentType = "text/html";
context.Response.Write(sign);
context.Response.Flush();
context.Response.Close();
}
private bool FormCheck(string username,string userpass)//验证数据
{
user = new UsersInfo();
user.LoginName = PubCheckDataFunc.ReplaceAndFilterData(username);
if (PubCheckDataFunc.CheckDataByMaxMin(user.LoginName,0, 50) == false)
{
sign = "用户名不能为空";
return false;
}
user.LoginPass = PubCheckDataFunc.ReplaceAndFilterData(userpass);
if (PubCheckDataFunc.CheckDataByMaxMin(user.LoginPass, 0, 50) == false)
{
sign = "密码不能为空";
return false;
}
return true;
}
private string GetSixteen(string str)//如果帐号或者密码大于16为就截取16位
{
if (str.Trim().Length > 16)
{
str = str.Trim().Substring(0, 16);
}
return str;
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
以下是JS代码
// JavaScript Document
var xmlHttp;
//创建XMLHttpRequest对象函数
function GetXMLHttpRequest() {
//这里应该根据浏览器版本判断,假设是ie,简单处理
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
return xmlHttp;
}
//当用户名文本框失去输入焦点时响应
function angry()
{
// 检查文本框是否有输入
var txtUserName = document.getElementById('txt_LoginName');
var txtUserPass = document.getElementById('txt_LoginPass');
xmlHttp = GetXMLHttpRequest();
// 构造将XMLHttpRequest对象将请求的服务器端的URL字符串
var url = "../ashx/Login.ashx?UserName=" + escape(txtUserName.value) + "&UserPass=" + escape(txtUserPass.value)+"×tamp="+ new Date().getTime();
// 建立与服务器端的连接xmlHttp.open("GET","Login.aspx?userName="+MyUN+"&random="+new Date().getTime(),true); --> xmlHttp.open("GET","Login.aspx?userName="+MyUN+"×tamp="+ new Date().getTime(),true);
xmlHttp.open("POST", url, false);
// 设置回调函数
xmlHttp.onreadystatechange = callBack_angry;
// 发送请求
xmlHttp.send(null);
}
function callBack_angry() {
// 4代表服务器端执行完毕并已经成功返回
if (4 == xmlHttp.readyState) {
if (200 == xmlHttp.status) {
//通过responseText属性得到服务器端实际返回的文本
try {
var sign = xmlHttp.responseText;
if (sign == "登录成功") {
location.href = "../index.aspx";
} else {
alert(sign);
}
}
catch (exception) {
//根据isValid的值决定lblNameMessage的显示内容
if (sign.length==4) {
location.href = "../index.aspx";
} else {
alert(sign);
}
}
}
}
else {
}
}
1.当我在VS2008运行的时候,JS没有问题,win7系统,用的是IE9,只是在服务端返回登录成功四个字的时候。我在JS里判断如果 变量sign是 “登录成功”四个字的时候,就location.href一下,可是这里的判断一直失败,虽然sign是等于“登录成功”,其实退出登录的JS代码也和登录的代码类似,但是退出登录那里就可以。
2.发布IIS以后。IE6下测试,点击按钮根本没反应,IE9下测试也是没反应。就像是没写代码一样。JS就是提示缺少对象,具体又不知道是哪里。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- if (sign.indexOf("登录成功")>-1) {
可能返回的内容有其他字符 --------------------编程问答-------------------- 我alert了,就是登录成功四个字,也没空格,你这样判断也不行的,因为返回可能有密码错误等信息。
--------------------编程问答-------------------- 来人呀。看看这个问题到底如何解决。 --------------------编程问答-------------------- 问题解决:
当a标签的href属性为"javascript:void(0);"时,IE6认为应该进行页面跳转,所以中断了异步请求的callback; FireFox3.5在页面真正跳转时才中断异步请求,不存在callback不执行的问题。
所以要在
angry()
方法最后加上 renturn false; 就是这样具体为啥,不懂。 --------------------编程问答-------------------- 因为返回可能有密码错误等信息。?不明白你这是什么意思啊。
因为返回可能有密码错误等信息。 那就是没有登录成功啊, --------------------编程问答--------------------
意思就是,sign只是个变量,接受服务端返回的信息,比如密码错误了。我会返回密码错误,登录成功了。我会返回登陆成功。if (sign.indexOf("登录成功")>-1) {
你这个判断 是非常有效以及非常OK的。 呵呵 --------------------编程问答-------------------- 另外,你发布的服务器是否安装了 。.net 3.5 sp1
--------------------编程问答--------------------
现在IIS发布,IE9测试可以,IE6就不可以。不知道为什么 我安装了 3.5 sp1 --------------------编程问答--------------------
还有。我用你那个indexof 方法,测试,返回的居然是-1,不管我if (sign.indexOf("成功")>-1) {
if (sign.indexOf("登录")>-1) { if (sign.indexOf("功")>-1) {
居然都是-1,我很奇怪,sign 变量 alert 出来就是 登录成功四个字,退出登录用的是 if (sign==“退出成功”) { 这个居然可以。郁闷了。
--------------------编程问答-------------------- if (sign.indexOf("登录成功")>-1) {}
else if(sign.indexOf("密码错误")>-1){}
不就可以吗? --------------------编程问答-------------------- --------------------编程问答-------------------- context.Response.Charset = "UTF-8";
加上试试 --------------------编程问答--------------------
就是不行,真是见了鬼了。而且现在IE9 和360浏览器样式也发生了扭曲,360用的不就是IE内核吗,真是…… --------------------编程问答-------------------- - - 各种兼容性 各种蛋疼。。。 --------------------编程问答-------------------- 你这段JS还要针对FF浏览器做特别的发送请求,所以最好还是jq的ajax方法提交吧。。。 --------------------编程问答-------------------- 同时最好不要中文返回,还是用数字吧,用中文的时候最好设置一下前端返回的数据类型,类似于jq中的datatype属性为xml,html,text等。
补充:.NET技术 , ASP.NET