作B/S项目的时候,咱们通常使用jquery+ashx来实现异步的一些操做,好比后台获取一些数据到前台,可是若是ashx文件不在本项目下,引用的是别的域下的文件,这时候就访问不了。关于jsonp实际上是老生常谈的话题,园中也有很多文章介绍,能够把jsonp当作一个协议或模式,这边就很少说,咱们只看示例。javascript
咱们先看下代码:html
1 public void ProcessRequest(HttpContext context) 2 { 3 string type = context.Request.QueryString["type"].ToString(); 4 string result = ""; 5 switch (type) 6 { 7 case "1": 8 result = "one"; 9 break; 10 case "2": 11 result = "two"; 12 break; 13 case "3": 14 result = "three"; 15 break; 16 default: 17 result = "other"; 18 break; 19 } 20 context.Response.ContentType = "text/plain"; 21 context.Response.Write(result); 22 }
前台js代码:java
<script type="text/javascript"> function getString() { $.ajax({ type: "POST", url: "GetStringDemo.ashx?type=" + $("#txtValue").val(), timeout: 20000, beforeSend: function (XMLHttpRequest) { $("#div_clear").html("正在获取,请稍候..."); }, success: function (data, textStatus) { $("#div_clear").html("获取值:" + data); }, error: function (XMLHttpRequest, textStatus, errorThrown) { $("#div_clear").html("获取出错!"); } }); } </script>
上面的代码不须要解释太多,就是前台经过ajax传过去参数,ashx进行处理并返回处理结果,前台呈现,这是咱们通常正常经过ashx作的异步操做,注意如今是先后台在同一个项目下。jquery
运行结果:ajax
上面的示例ajax代码中url若是改为别的域名下的ashx文件,就会出现访问错误,经过jsonp能够解决跨域问题,上面的代码咱们修改下:json
ashx代码:跨域
1 public void ProcessRequest(HttpContext context) 2 { 3 string type = context.Request.QueryString["type"].ToString(); 4 string callback = HttpContext.Current.Request["jsoncallback"]; 5 string result = ""; 6 switch (type) 7 { 8 case "1": 9 result = "one"; 10 break; 11 case "2": 12 result = "two"; 13 break; 14 case "3": 15 result = "three"; 16 break; 17 default: 18 result = "other"; 19 break; 20 } 21 context.Response.ContentType = "application/json"; 22 context.Response.ContentEncoding = System.Text.Encoding.UTF8; 23 context.Response.Write(callback + "({\"result\":\"" + result + "\"})"); 24 context.Response.End(); 25 }
前台js代码:app
1 <script type="text/javascript"> 2 function getString() { 3 $.ajax({ 4 url: "http://localhost:8975/GetStringDemo.ashx?jsoncallback=?", 5 dataType: "jsonp", 6 data: { "type": $("#txtValue").val() }, 7 beforeSend: function (XMLHttpRequest) { 8 $("#div_clear").html("正在获取,请稍候..."); 9 }, 10 success: function (data, textStatus) { 11 $("#div_clear").html("获取值:" + data.result); 12 }, 13 error: function (XMLHttpRequest, textStatus, errorThrown) { 14 $("#div_clear").html("获取出错!"); 15 } 16 }); 17 } 18 </script>
注意上面的url,ashx和前台页面并非在一个项目下。异步
运行结果:jsonp
示例代码下载:jsonp跨域+ashx.rar