当前位置:编程学习 > C#/ASP.NET >>

.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了,就是登录成功四个字,也没空格,你这样判断也不行的,因为返回可能有密码错误等信息。
引用 3 楼  的回复:
if (sign.indexOf("登录成功")>-1) {

可能返回的内容有其他字符
--------------------编程问答-------------------- 来人呀。看看这个问题到底如何解决。 --------------------编程问答-------------------- 问题解决:
当a标签的href属性为"javascript:void(0);"时,IE6认为应该进行页面跳转,所以中断了异步请求的callback; FireFox3.5在页面真正跳转时才中断异步请求,不存在callback不执行的问题。

所以要在

angry() 
方法最后加上 renturn false;  就是这样具体为啥,不懂。 --------------------编程问答-------------------- 因为返回可能有密码错误等信息。?不明白你这是什么意思啊。

因为返回可能有密码错误等信息。 那就是没有登录成功啊, --------------------编程问答--------------------
引用 7 楼  的回复:
因为返回可能有密码错误等信息。?不明白你这是什么意思啊。

因为返回可能有密码错误等信息。 那就是没有登录成功啊,


意思就是,sign只是个变量,接受服务端返回的信息,比如密码错误了。我会返回密码错误,登录成功了。我会返回登陆成功。if (sign.indexOf("登录成功")>-1) {

 你这个判断 是非常有效以及非常OK的。  呵呵 --------------------编程问答-------------------- 另外,你发布的服务器是否安装了 。.net 3.5 sp1

--------------------编程问答--------------------
引用 9 楼  的回复:
另外,你发布的服务器是否安装了 。.net 3.5 sp1


现在IIS发布,IE9测试可以,IE6就不可以。不知道为什么 我安装了 3.5 sp1 --------------------编程问答--------------------
引用 10 楼  的回复:
引用 9 楼 的回复:
另外,你发布的服务器是否安装了 。.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";
加上试试 --------------------编程问答--------------------
引用 14 楼  的回复:
context.Response.Charset = "UTF-8";
加上试试


就是不行,真是见了鬼了。而且现在IE9 和360浏览器样式也发生了扭曲,360用的不就是IE内核吗,真是…… --------------------编程问答-------------------- - - 各种兼容性 各种蛋疼。。。   --------------------编程问答-------------------- 你这段JS还要针对FF浏览器做特别的发送请求,所以最好还是jq的ajax方法提交吧。。。 --------------------编程问答-------------------- 同时最好不要中文返回,还是用数字吧,用中文的时候最好设置一下前端返回的数据类型,类似于jq中的datatype属性为xml,html,text等。
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,