跨域学习笔记2--WebApi 跨域问题解决方案:CORS

自己并不懂,在此先记录下来,留待以后学习...

 

正文

前言:上篇总结了下WebApi的接口测试工具的使用,这篇接着来看看WebAPI的另一个常见问题:跨域问题。本篇主要从实例的角度分享下CORS解决跨域问题一些细节。

WebApi系列文章

  • C#进阶系列——WebApi接口测试工具:WebApiTestClient
  • C#进阶系列——WebApi 跨域问题解决方案:CORS
  • C#进阶系列——WebApi身份认证解决方案:Basic基础认证
  • C#进阶系列——WebApi接口传参不再困惑:传参详解
  • C#进阶系列——WebApi接口返回值不困惑:返回值类型详解
  • C#进阶系列——WebApi异常处理解决方案
  • C#进阶系列——WebApi区域Area使用小结
回到顶部

一、跨域问题的由来

同源策略:出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容。

正是由于这个原因,我们不同项目之间的调用就会被浏览器阻止。比如我们最常见的场景:WebApi作为数据服务层,它是一个单独的项目,我们的MVC项目作为Web的显示层,这个时候我们的MVC里面就需要调用WebApi里面的接口取数据展现在页面上。因为我们的WebApi和MVC是两个不同的项目,所以运行起来之后就存在上面说的跨域的问题。

回到顶部

二、跨域问题解决原理

CORS全称Cross-Origin Resource Sharing,中文全称跨域资源共享。它解决跨域问题的原理是通过向http的请求报文和响应报文里面加入相应的标识告诉浏览器它能访问哪些域名的请求。比如我们向响应报文里面增加这个Access-Control-Allow-Origin:http://localhost:8081,就表示支持http://localhost:8081里面的所有请求访问系统资源。其他更多的应用我们就不一一列举,可以去网上找找。

回到顶部

三、跨域问题解决细节

 下面我就结合一个简单的实例来说明下如何使用CORS解决WebApi的跨域问题。

回到顶部

1、场景描述

我们新建两个项目,一个WebApi项目(下图中WebApiCORS),一个MVC项目(下图中Web)。WebApi项目负责提供接口服务,MVC项目负责页面呈现。如下:

其中,Web与WebApiCORS端口号分别为“27239”和“27221”。Web项目需要从WebApiCORSS项目里面取数据,很显然,两个项目端口不同,所以并不同源,如果使用常规的调用方法肯定存在一个跨域的问题。

简单介绍下测试代码,Web里面有一个HomeController

复制代码
   public class HomeController : Controller{// GET: Homepublic ActionResult Index(){return View();}}
复制代码

对应的Index.cshtml

复制代码
<html>
<head><meta name="viewport" content="width=device-width" /><title>Index</title><script src="~/Content/jquery-1.9.1.js"></script><link href="~/Content/bootstrap/css/bootstrap.css" rel="stylesheet" /><script src="~/Content/bootstrap/js/bootstrap.js"></script><script src="~/Scripts/Home/Index.js"></script>
</head>
<body>测试结果:<div id="div_test"> </div>
</body>
</html>
复制代码

Index.js文件

复制代码
var ApiUrl = "http://localhost:27221/";
$(function () {$.ajax({type: "get",url: ApiUrl + "api/Charging/GetAllChargingData",data: {},success: function (data, status) {if (status == "success") {$("#div_test").html(data);}},error: function (e) {$("#div_test").html("Error");},complete: function () {}});
});
复制代码

WebApiCORS项目里面有一个测试的WebApi服务ChargingController

复制代码
  public class ChargingController : ApiController{/// <summary>/// 得到所有数据/// </summary>/// <returns>返回数据</returns>[HttpGet]public string GetAllChargingData(){return "Success";}}
复制代码

配置WebApi的路由规则为通过action调用。WebApiConfig.cs文件

复制代码
   public static class WebApiConfig{public static void Register(HttpConfiguration config){// Web API 路由config.MapHttpAttributeRoutes();config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{action}/{id}",defaults: new { id = RouteParameter.Optional });}}
复制代码
回到顶部

2、场景测试

1)我们不做任何的处理,直接将两个项目运行起来。看效果如何

 IE浏览器:

谷歌浏览器:

这个结果另博主也很吃惊,不做任何跨域处理,IE10、IE11竟然可以直接请求数据成功,而同样的代码IE8、IE9、谷歌浏览器却不能跨域访问。此原因有待查找,应该是微软动了什么手脚。

2)使用CORS跨域

首先介绍下CORS如何使用,在WebApiCORS项目上面使用Nuget搜索“microsoft.aspnet.webapi.cors”,安装第一个

然后在App_Start文件夹下面的WebApiConfig.cs文件夹配置跨域

复制代码
    public static class WebApiConfig{public static void Register(HttpConfiguration config){//跨域配置config.EnableCors(new EnableCorsAttribute("*", "*", "*"));// Web API 路由config.MapHttpAttributeRoutes();config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{action}/{id}",defaults: new { id = RouteParameter.Optional });}}
复制代码

我们暂定三个“*”号,当然,在项目中使用的时候一般需要指定对哪个域名可以跨域、跨域的操作有哪些等等。这个在下面介绍。

IE10、IE11

谷歌浏览器

IE8、IE9

这个时候又有新问题了,怎么回事呢?我都已经设置跨域了呀,怎么IE8、9还是不行呢?这个时候就有必要说说CORS的浏览器支持问题了。网上到处都能搜到这张图:

上图描述了CORS的浏览器支持情况,可以看到IE8、9是部分支持的。网上说的解决方案都是Internet Explorer 8 、9使用 XDomainRequest 对象实现CORS。是不是有这么复杂?于是博主各种百度寻找解决方案。最后发现在调用处指定 jQuery.support.cors = true; 这一句就能解决IE8、9的问题了。具体是在Index.js里面

复制代码
jQuery.support.cors = true;
var ApiUrl = "http://localhost:27221/";
$(function () {$.ajax({type: "get",url: ApiUrl + "api/Charging/GetAllChargingData",data: {},success: function (data, status) {if (status == "success") {$("#div_test").html(data);}},error: function (e) {$("#div_test").html("Error");},complete: function () {}});
});
复制代码

这句话的意思就是指定浏览器支持跨域。原来IE9以上版本的浏览器、谷歌、火狐等都默认支持跨域,而IE8、9却默认不支持跨域,需要我们指定一下。你可以在你的浏览器里面打印jQuery.support.cors看看。这样设置之后是否能解决问题呢?我们来看效果:

问题完美解决。至于网上说的CORS对IE8、9的解决方案XDomainRequest是怎么回事,有待实例验证。

3)CORS的具体参数设置。

上文我们使用

config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

这一句解决了跨域问题,上面说了,这种*号是不安全的。因为它表示只要别人知道了你的请求url,任何请求都可以访问到你的资源。这是相当危险的。所以需要我们做一些配置,限制访问权限。比如我们比较常见的做法如下:

 配置方法一、在Web.Config里面(PS:这两张图源自:http://www.cnblogs.com/moretry/p/4154479.html)

然后在WebApiConfig.cs文件的Register方法里面

配置方法二、如果你只想对某一些api做跨域,可以直接在API的类上面使用特性标注即可。

复制代码
  [EnableCors(origins: "http://localhost:8081/", headers: "*", methods: "GET,POST,PUT,DELETE")]public class ChargingController : ApiController{/// <summary>/// 得到所有数据/// </summary>/// <returns>返回数据</returns>[HttpGet]public string GetAllChargingData(){return "Success";}}
复制代码
回到顶部

四、总结

以上就是一个简单的CORS解决WebApi跨域问题的实例,由于博主使用WebApi的时间并不长,所以很多理论观点未必成熟,如果有说的不对的,欢迎指出。博主在此多谢啦。

 

原文地址:http://www.cnblogs.com/landeanfen/p/5177176.html

 

转载于:https://www.cnblogs.com/lxhbky/p/6344801.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑技巧:16个系统优化设置小技巧,大幅度提升你的电脑性能

目录 1. 注册你的Microsoft账户 2. 夜间模式 3. 关闭登录验证&#xff08;办公机慎用&#xff09; 4. 文件内容预览 5. 组件升级 6. 剪贴板增强 7. Caps Lock声音提醒 8. 自启动清理 9. 安装PowerToys 10. 文件历史记录 11. 动态锁 12. 就近共享 13. 搜索范围 14. “勒索”防护…

mongo文档操作

1.插入文档&#xff08;插入一行记录&#xff09; db.集合的名字.insert({}) 2.批量的插入 shell的for循环 3.save操作 save操作和insert操作的区别在于 如果_id相同的情况下&#xff0c;insert操作是会报错的&#xff0c;save则会更新。 4 删除列表中的所有数据 db.集合名字.r…

网络技巧:WiFi越用越慢的原因以及解决方法

WiFi越用越慢&#xff0c;到底是什么原因&#xff0c;今天小编给大家聊聊这个问题&#xff01; 有人认为是WiFi盒子有问题&#xff0c;但其实和路由器的错误摆放也有一定关系。 今天给大家列出了几种路由器正确摆放的小技巧&#xff0c;而且不用花一分钱&#xff0c;就可以测试…

Win11系统各个版本之间的比较,看完你就懂了

目录 1、Win11系统哪个版本最好&#xff1f; 2、Win11有几个版本&#xff1f; 3、Windows11不同版本的比较 Win11系统是微软全新发布的电脑操作系统&#xff0c;当然Win11有着很多的版本&#xff0c;每一个版本功能定位都有一定的差异&#xff0c;那么Win11系统哪个版本最好呢&…

电脑:分享八个实用的电脑技巧

目录 1、会高效使用搜索&#xff0c;不要什么事都问别人。 2、要会正确下载、安装、卸载软件 3、会使用Office办公软件 4、掌握如何设置路由器、设置网络等网络技能 5、熟练使用键盘 6、定期整理自己的电脑桌面 7、定期优化自己的电脑 8、掌握一些常用的快捷键 电脑是目前从事办…

SpringMVC(十七-二十) ModelAttribute 注解

有点难理解。 修饰方法是表示在该控制器的所有目标方法执行前都执行该modelattribute注解的方法。 修饰参数是表示什么&#xff1f;修饰参数时modelattributes(value"xxxx") User user 中的value值需要和modelattribute修改的方法加入的键的值一致。 Controller Cod…

硬件知识:U盘缩水是怎么回事,如何恢复U盘真实容量?

使用缩水的U盘会造成什么后果呢&#xff1f;使用缩水U盘拷贝资料&#xff0c;很有可能造成重要资料文件的丢失&#xff0c;同时“无限制”拷贝资料&#xff0c;造成不可预知的错误。那要怎么办呢&#xff1f;其实最有效方法就是还原缩水U盘真实容量&#xff0c;这样在拷贝资料时…

网络知识:内网、外网、宽带、带宽、流量、网速之间的联系?

相信很多人都不知道内网、外网、宽带、带宽、流量、网速之间的区别与联系&#xff0c;今天小编给大家介绍一下&#xff0c;希望对大家能有所帮助&#xff01; 一.带宽与宽带的区别是什么&#xff1f; 带宽是量词&#xff0c;指的是网速的大小&#xff0c;比如1Mbps的意思是一兆…

Java技术:SpringBoot实现邮件发送功能

目录 1、创建一个基本的SpringBoot项目&#xff0c;pom文件导入发送邮件的依赖 2、application.yml 文件配置配置邮件发送信息 3、创建IEmailService 接口文件&#xff0c;定义邮件发送的接口 4、创建IEmailService接口的实现类EmailService.java 文件 5、新建邮件发送模板 ema…

电脑技巧:Win10无线投屏功能介绍

Win10操作系统可以将电脑中的内容投屏到其他显示设备&#xff0c;比如将电脑屏幕投屏到电视上&#xff0c;这是通过Miracast技术来实现的。其实Win10电脑自身也可以作为被投屏的那一方&#xff01;比如可以将手机屏幕投屏到电脑屏幕上去&#xff0c;方便给客户演示APP功能或者将…

电脑技巧:Win10系统中的这六种模式介绍

目录 1. 夜间模式 2. 游戏模式 3. 飞行模式 4. 卓越模式 5. 专注模式 6. 平板模式 在Win10中&#xff0c;隐藏着很多不为人知的小秘密。有些小功能虽然看起来不起眼&#xff0c;但关键时候却能让我们的Win10跑得更爽&#xff0c;比如win10中六种不同的模式&#xff0c;该什么时…

电脑卡顿,最先升级这个硬件,运行速度可快速提升

电脑用着用着就变慢了&#xff0c;不少人为之苦恼。有钱的人儿早早换上了新电脑&#xff0c;没钱的人儿仍然在苦苦地支撑着~ 但是&#xff0c;电脑卡顿就跟汽车变速箱坏了一样&#xff0c;我们可以为其更换零件&#xff0c;从而“治好了”它&#xff0c;使用寿命不就延长了吗&a…

Java技术:SpringBoot集成FreeMarker生成word文件

今天给大家分享SpringBoot集成FreeMarker模板引擎生成word文件的用法&#xff0c;感兴趣的可以学一下&#xff0c;完整源码地址在文章末尾处&#xff0c;欢迎互相沟通交流&#xff01; 一、什么是FreeMarker&#xff1f; FreeMarker 是一款开源的模板引擎&#xff1a;是一种基于…