ajax跨域调用c# webserver 返回json数据问题

谢馥春 发布于 2012/12/05 14:47
阅读 5K+
收藏 2

站点A  c# webserver 代码

[WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json,XmlSerializeString = false)]
        public void Login(string userName, string userPwd, string macAddress)
        {
            var response = HttpContext.Current.Response;
            response.ContentType = "text/json";  

            var ws = ValitateLogin(userName, userPwd, macAddress);
            var json = new JSONHelper {success = true};
            json.AddItem("UnReadEmailNum", ws.UnReadEmailNum.ToString());
            json.AddItem("IsValid", ws.IsValid.ToString());
            json.AddItem("RetString", ws.RetString);
            json.AddItem("EmailUrl",ws.EmailUrl);
            json.ItemOk();
            response.Write(json.ToString());  

        }

站点B ajax 跨域调用代码

  $(function () {
            $("#jsonp_btn").click(function () {
				
		$.ajax({    
			 async:false,    
			 url: 'http://192.168.1.2:14671/OA/Email.asmx/Login',  // 跨域URL   
			 type: 'GET',    
			 dataType: 'jsonp',   
			contentType: "application/json; charset=utf-8", 
			jsonp: 'jsoncallback', //默认callback  
			data: {"userName":"admin","userPwd":"123456","macAddress":""}, //请求数据   
			timeout: 5000,    
			beforeSend: function(){  
						//jsonp 方式此方法不被触发。原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了   
					},   
					success: function(json) { 
						//客户端jquery预先定义好的callback函数,成功获取跨域服务器上的json数据后,会动态执行这个callback函数
						alert(json.respond);    
						if(json.actionErrors.length!=0)
						{    
							alert(json.actionErrors);    
						}    
					},    
					complete: function(XMLHttpRequest, textStatus){    
							     alert(textStatus);
					},    
					error: function(xhr){    
						   //jsonp 方式此方法不被触发   
						   //请求出错处理    
						alert("请求出错(请检查相关度网络状况.)");    
					}    
				});
		
            });
        });
IE浏览器报:缺少":" 谷歌浏览器报:Uncaught SyntaxError: Unexpected token :

调式查看返回数据为 :

{"UnReadEmailNum":"5","IsValid":"1","RetString":"登录成功",

"EmailUrl":"http://localhost:14671/OA/login.aspx?id=2"}

我想知道为什么会报错。

感谢各大侠百忙中浏览小弟的提问 谢谢了。
加载中
0
Narky
Narky

跨域的jsonp 需要有callback 声明

http://www.cnblogs.com/chopper/archive/2012/03/24/2403945.html

谢馥春
谢馥春
谢谢 这位大侠 加个回调就OK 了 感谢你的提醒 和帮助。谷歌的时候看到有类似的说明,忽视了 真是细节注定成败 谢谢你了
谢馥春
谢馥春
恩,谢谢了 我先看看,忽然在咨询你,
0
s
star2000
这是语法问题,chrome浏览器应该很容易看出来的
谢馥春
谢馥春
提示说返回结果少分号。 我检查了 返回结果是标准的json格式
0
s
star2000
看看哪一行报错就OK了
谢馥春
谢馥春
没有说哪一行,只是说缺少分号
0
谢馥春
谢馥春
修改后正确答案 代码片段       
 [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json, XmlSerializeString = false, UseHttpGet = true)]
        public void Login(string userName, string userPwd, string macAddress)
        {
            var response = HttpContext.Current.Response;
            var context = HttpContext.Current.Request;
          
            response.Clear(); //清空无关信息
            response.Buffer = true; //完成整个响应后再发送
            response.Charset = "GB2312";//设置输出流的字符集-中文
            response.AppendHeader("Content-Disposition", "attachment;filename=Report.doc");//追加头信息
            response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//设置输出流的字符集
            response.ContentType = "text/json";
          
            //获取回调函数名
            string callback = context.QueryString["callback"];
            var jsons = "[{\"taskId\": \"100\",\"projectName\": \"张三\" }]";
            response.Write(callback + "(" + jsons + ")");
            response.End();
   
        }
        $(function () {
            $("#jsonp_btn").click(function () {
				$.ajax({    
					async:false,    
					url: 'http://localhost:82/Email.asmx/Login',  // 跨域URL   
					dataType: 'jsonp',   
					jsonpCallback: 'persons', //默认callback  
					data: {"userName":"admin","userPwd":"etimes2011@","macAddress":""}, //请求数据   
					timeout: 5000,    
					beforeSend: function(){  
						//jsonp 方式此方法不被触发。原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了   
					},   
					success:function(data) { 
						//客户端jquery预先定义好的callback函数,成功获取跨域服务器上的json数据后,会动态执行这个callback函数
							alert("success  "+data[0].projectName);
						   
					},    
					complete: function(XMLHttpRequest, textStatus){    
							    
					},    
					error: function(xhr){    
						   //jsonp 方式此方法不被触发   
						   //请求出错处理    
						alert("请求出错(请检查相关度网络状况.)");    
					}    
				});
		
            });
        });
返回顶部
顶部