ASP.NET开发web应用遇到的javascript跨域请求问题

简介:

解决方案

不提倡跨域的post请求。

0.jquery中ajax的跨域方案jsonp

.ashx代码

 


  
  
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Web; 
  5.  
  6. namespace KB.DSN.Web.API.Tokens 
  7.     /// <summary> 
  8.     /// Summary description for Get 
  9.     /// </summary> 
  10.     public class Get : IHttpHandler 
  11.     { 
  12.  
  13.  
  14.         public void ProcessRequest(HttpContext context) 
  15.         { 
  16.             setresponsecontext(context); 
  17.             var token = KB.DSN.BusinessAccess.UniqueCommunicationCode.GenerateUniqueCommunicationCode(); 
  18.  
  19.             var outputobject = new 
  20.             { 
  21.                 Head = new Models.KBJsonHeadResponse(), 
  22.                 Body = new { Token = token } 
  23.             }; 
  24.  
  25.             var outputjsonstring = Newtonsoft.Json.JsonConvert.SerializeObject(outputobject); 
  26.  
  27.              
  28.             context.Response.Write(context.Request.QueryString["callback"]+"("+outputjsonstring+")"); 
  29.  
  30.         } 
  31.  
  32.         private void setresponsecontext(HttpContext context) 
  33.         { 
  34.             
  35.             context.Response.ContentEncoding = System.Text.Encoding.UTF8; 
  36.             context.Response.ContentType = "application/json"
  37.         } 
  38.  
  39.         public bool IsReusable 
  40.         { 
  41.             get 
  42.             { 
  43.                 return false
  44.             } 
  45.         } 
  46.     } 




html页面

 


  
  
  1. function getToken_jsonp(){ 
  2.         $.ajax({ 
  3.    
  4.     url: "http://192.168.0.111/api/tokens/get.ashx", 
  5.           type: "get",  
  6.     dataType: "jsonp", 
  7.     jsonp: "callback", 
  8.     async: false, 
  9.      
  10.           contentType: "application/json", 
  11.           success: function(data){ 
  12.       //alert("getToken success"); 
  13.             $("#token").text($.toJSON(data)); 
  14.             //console.log(data); 
  15.        
  16.           }, 
  17.     error:function(){ 
  18.         alert("getToken fail"); 
  19.     } 
  20.         }); 
  21.  
  22.       } 

jsonp只支持GET请求,不支持POST请求,就算你写了POST,它会自动转换为GET请求,把你的data放在querystring中。

 

 

 

1.修改web.config文件

整个应用都支持跨域的请求。

web.config


 
 
  1. <system.webServer> 
  2.  
  3.   <httpProtocol> 
  4.     <customHeaders> 
  5.       <add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/> 
  6.       <add name="Access-Control-Allow-Headers" value="x-requested-with"/> 
  7.       <add name="Access-Control-Allow-Origin" value="*" /> 
  8.     </customHeaders> 
  9.   </httpProtocol> 
  10. </system.webServer> 

 

html page


 
 
  1. function addContact() { 
  2.            var contact = new Object(); 
  3.            contact.FirstName = $("#firstName").attr("value"); 
  4.            contact.LastName = $("#lastName").attr("value"); 
  5.            contact.PhoneNo = $("#phoneNo").attr("value"); 
  6.            contact.EmailAddress = $("#emailAddress").attr("value"); 
  7.            $.ajax({ 
  8.                url: "http://localhost:10401/api/contacts/AddContact.ashx", 
  9.                type: "POST", 
  10.  
  11.                dataType: "json", 
  12.                data: $.toJSON(contact), 
  13.   
  14.                success: function () { loadAllContacts(); } 
  15.            }); 
  16.        } 

 

 


 
 

 这种方式不能设置contentType: "application/json",否则会提示

"Request header field Content-Type is not allowed by Access-Control-Allow-Headers."

去掉ajax中的contentType设置就可以了!

 

 想要设置contentType也可以,需要将web.config文件中的

<add name="Access-Control-Allow-Headers" value="x-requested-with"/> 

修改为

<add name="Access-Control-Allow-Headers" value="x-requested-with,content-type"/> 

 

 在II6中web.config不支持system.webServer配置节,所以需要在IIS中设置httprequestheader。将web.config文件中的自定义头加入IIS的设置中。

 

FindContact.ashx


 
 
  1. /// <summary> 
  2.    /// Summary description for FindContact 
  3.    /// </summary> 
  4.    public class FindContact : IHttpHandler 
  5.    { 
  6.  
  7.        public void ProcessRequest(HttpContext context) 
  8.        { 
  9.            context.Response.ContentEncoding = Encoding.UTF8; 
  10.            context.Response.ContentType = "application/json"
  11.  
  12.            var stream = context.Request.InputStream; 
  13.            var reader = new StreamReader(stream); 
  14.            var input=reader.ReadToEnd(); 
  15.  
  16.            var o = Newtonsoft.Json.JsonConvert.DeserializeObject<Models.Contact>(input); 
  17.            var list = new List<Models.Contact>(); 
  18.            list.Add(o); 
  19.            list.Add(o); 
  20.            context.Response.Write(Newtonsoft.Json.JsonConvert .SerializeObject ( list )); 
  21.        } 
  22.  
  23.        public bool IsReusable 
  24.        { 
  25.            get 
  26.            { 
  27.                return false
  28.            } 
  29.        } 
  30.    } 

 

2.在请求中设置HttpHeader

针对单个请求。

FindContact.ashx


  
  
  1. /// <summary> 
  2.    /// Summary description for FindContact 
  3.    /// </summary> 
  4.    public class FindContact : IHttpHandler 
  5.    { 
  6.  
  7.        public void ProcessRequest(HttpContext context) 
  8.        { 
  9.            context.Response.ContentEncoding = Encoding.UTF8; 
  10.            context.Response.ContentType = "application/json"
  11.  
  12.            var stream = context.Request.InputStream; 
  13.            var reader = new StreamReader(stream); 
  14.            var input=reader.ReadToEnd(); 
  15.  
  16.            var o = Newtonsoft.Json.JsonConvert.DeserializeObject<Models.Contact>(input); 
  17.            var list = new List<Models.Contact>(); 
  18.            list.Add(o); 
  19.            list.Add(o); 
  20.  
  21.            #region 支持跨域请求 
  22.            context.Response.ClearHeaders(); 
  23.            string origin = context.Request.Headers["Origin"]; 
  24.            context.Response.AppendHeader("Access-Control-Allow-Origin"
  25.                string.IsNullOrEmpty(origin) ? "*" : origin); 
  26.            string requestHeaders = context.Request.Headers["Access-Control-Request-Headers"]; 
  27.            context.Response.AppendHeader("Access-Control-Allow-Headers"
  28.                string.IsNullOrEmpty(requestHeaders) ? "*" : requestHeaders); 
  29.            context.Response.AppendHeader("Access-Control-Allow-Methods""POST, OPTIONS"); 
  30.            #endregion 
  31.  
  32.            context.Response.Write(Newtonsoft.Json.JsonConvert .SerializeObject ( list )); 
  33.        } 
  34.  
  35.        public bool IsReusable 
  36.        { 
  37.            get 
  38.            { 
  39.                return false
  40.            } 
  41.        } 
  42.    } 

html page


   
   
  1. function addContact() { 
  2.            var contact = new Object(); 
  3.            contact.FirstName = $("#firstName").attr("value"); 
  4.            contact.LastName = $("#lastName").attr("value"); 
  5.            contact.PhoneNo = $("#phoneNo").attr("value"); 
  6.            contact.EmailAddress = $("#emailAddress").attr("value"); 
  7.            $.ajax({ 
  8.                url: "http://localhost:10401/api/contacts/AddContact.ashx", 
  9.                type: "POST", 
  10.  
  11.                dataType: "json", 
  12.                data: $.toJSON(contact), 
  13.   
  14.                success: function () { loadAllContacts(); } 
  15.            }); 
  16.        } 

3.使用代理

假设你有两个web应用:一个应用放html页面,给用户提供界面;一个应用放服务,使用.ASHX处理请求。

你在html应用中使用ajax请求ashx应用的接口,就是ajax跨域请求。

你可以在html应用中写一些后台代码,在代码中向ashx应用提交数据。

然后你的html应用的页面中将收集到的数据发送到html应用的后台代码中,由后台代码发送数据到ashx应用,这就不是ajax跨域请求了。

在html应用中的后台代码就被叫做“代理”,代理html应用到ashx应用的请求。

 

参考文档

1.implementing-cors-support-in-asp-net-web-apis

2.Implementing CORS support in ASP.NET Web APIs – take 2

3.说说JSON和JSONP,也许你会豁然开朗,含jQuery用例

4.Cross-Origin Resource Sharing

5.cannot POST to IHTTPHandler class, origin not allowed by Access-Control-Allow-Origin

6.Secure Cross-Domain Communication in the Browser

7.HTTP access control (CORS)

8.jQuery File Uploader, Cross Domain Requests, and ASHX Web Services

9.jquery跨域访问解决方案 本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/1128395,如需转载请自行联系原作者
目录
相关文章
|
5月前
|
JavaScript 前端开发
如何减少Node.js应用中的全局变量?
如何减少Node.js应用中的全局变量?
331 133
|
2月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
71 0
|
5月前
|
监控 负载均衡 JavaScript
有哪些有效的方法可以优化Node.js应用的性能?
有哪些有效的方法可以优化Node.js应用的性能?
295 69
|
4天前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
43 3
|
2月前
|
资源调度 负载均衡 JavaScript
使用PM2工具部署Vue.js应用于服务器
以上步骤完成之后,你就成功利⽤ PM⼆工具将 Vuejs 应⽰程序部署至服 务 器,并且配合反向代理实现了高效稳定访问及负载均衡功能。
86 0
|
6月前
|
前端开发 搜索推荐 JavaScript
如何通过DIY.JS快速构建出一个DIY手机壳、T恤的应用?
DIY.JS 是一款基于原生 Canvas 的业务级图形库,专注于商品定制的图形交互功能,帮助开发者轻松实现个性化设计。适用于 T 恤、手机壳等多种商品场景。它自带丰富功能,无需从零构建,快速集成到项目中。通过创建舞台、添加模型、定义 DIY 区域和添加素材四个步骤即可完成基础用法。支持在线演示体验,文档详细,易上手。
203 57
|
6月前
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
219 35
|
5月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
129 3
|
6月前
|
存储 JavaScript 前端开发
|
7月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~