标签:
跨域请求是什么就不再解释了。
需要请求的链接:http://192.168.19.22/appsservice/home/jstest(本地的范例链接)
请求链接正常返回json数据格式如下:
{"name":"test","value":"sfsdf"}
使用Jquery Jsonp请求代码
<script src="~/Scripts/jquery-1.7.1.min.js"></script> <script type="text/javascript"> $(function () { $("#test").click(function () { $.ajax({ url: ‘http://192.168.19.22/appsservice/home/jstest‘, dataType: "jsonp", jsonp: "callback", success: function (data) { alert(data.name); } }) }); }); </script> <div id="test">获取</div>
这样当点击获取按钮时,浏览器会直接报错,如下
Jsonp是需要服务器使用callback的参数值:jQquery1710508893103338778_1435633281092输出一个javascript的执行函数来运行的,如
jQquery1710508893103338778_1435633281092({"name":"test","value":"sfsdf"}),如果服务器不输出一个js函数,默认直接把输出的json字符串或者其他输出结果当成一串js执行,这就是出现上述错误的原因。
服务器对于Jsonp的请求要进行一下特殊处理一下,才能让客户端正确处理数据。以下是MVC添加一个ActionFilter对Jsonp请求进行处理,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Newtonsoft.Json; namespace Simple.AppsService { public class JsonpAttribute : ActionFilterAttribute { /// <summary> /// 在执行操作结果后更改返回结果 /// </summary> public override void OnResultExecuted(ResultExecutedContext filterContext) { string callback = filterContext.HttpContext.Request["callback"]; if (!string.IsNullOrEmpty(callback)) { //判断返回的结果为JsonResult if (filterContext.Result is JsonResult) { JsonResult result = (JsonResult)filterContext.Result; //序列化json数据 string json = JsonConvert.SerializeObject(result.Data); //使用callback参数的函数名输出可执行的js函数 string newres = string.Format("{0}({1})", callback, json); //清空已经生成的数据 filterContext.HttpContext.Response.Clear(); //输出新的数据 filterContext.HttpContext.Response.Write(newres); } } } } }
在每个Controller的Action上打上标签
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace Simple.AppsService.Controllers { public class HomeController : Controller { [Jsonp] public JsonResult Jstest() { return Json(new { name = "test", value = "sfsdf" }, JsonRequestBehavior.AllowGet); } } }
当使用Jsonp时,请求参数里面有callback参数,服务器判断请求参数里面有callback参数,对输出结果使用特殊的格式,callback();
这不算是问题解决方案,应该算是Jsonp的用法范例吧,如果有朋友遇上此问题,希望以上能有所启发!
Jsonp跨域请求Uncaught SyntaxError解决方案
标签:
原文地址:http://www.cnblogs.com/stealth7/p/4609957.html