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,如需转载请自行联系原作者
目录
相关文章
|
2天前
|
存储 缓存 JavaScript
如何优化Node.js应用的内存使用以提高性能?
通过以上多种方法的综合运用,可以有效地优化 Node.js 应用的内存使用,提高性能,提升用户体验。同时,不断关注内存管理的最新技术和最佳实践,持续改进应用的性能表现。
|
2天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
13 2
|
2天前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
12 1
|
8天前
|
JavaScript 前端开发 测试技术
探索现代JavaScript开发的最佳实践
本文探讨了现代JavaScript开发中的最佳实践,涵盖ES6+特性、现代框架使用、模块化与代码分割、测试驱动开发、代码质量与性能优化、异步编程、SPA与MPA架构选择、服务端渲染和静态站点生成等内容,旨在帮助开发者提升代码质量和开发效率。
|
12天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第36天】本文将引导您探索Node.js的世界,通过实际案例揭示其背后的原理和实践方法。从基础的安装到高级的异步处理,我们将一起构建一个简单的后端服务,并讨论如何优化性能。无论您是新手还是有经验的开发者,这篇文章都将为您提供新的视角和深入的理解。
|
17天前
|
Web App开发 存储 JavaScript
深入浅出Node.js后端开发
【10月更文挑战第31天】本文将引导你进入Node.js的奇妙世界,探索其如何革新后端开发。通过浅显易懂的语言和实际代码示例,我们将一起学习Node.js的核心概念、搭建开发环境,以及实现一个简单但完整的Web应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇通往高效后端开发的大门。
|
13天前
|
运维 监控 JavaScript
鸿蒙next版开发:分析JS Crash(进程崩溃)
在HarmonyOS 5.0中,JS Crash指未处理的JavaScript异常导致应用意外退出。本文详细介绍如何分析JS Crash,包括异常捕获、日志分析和典型案例,帮助开发者定位问题、修复错误,提升应用稳定性。通过DevEco Studio收集日志,结合HiChecker工具,有效解决JS Crash问题。
33 4
|
15天前
|
Web App开发 JavaScript 前端开发
探索后端开发:Node.js与Express的完美结合
【10月更文挑战第33天】本文将带领读者深入了解Node.js和Express的强强联手,通过实际案例揭示它们如何简化后端开发流程,提升应用性能。我们将一起探索这两个技术的核心概念、优势以及它们如何共同作用于现代Web开发中。准备好,让我们一起开启这场技术之旅!
30 0
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
43 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
60 0