前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ASP.NET Web API自身对CORS的支持:从实例开始

ASP.NET Web API自身对CORS的支持:从实例开始

作者头像
蒋金楠
发布于 2018-01-15 11:32:22
发布于 2018-01-15 11:32:22
1.7K00
代码可运行
举报
文章被收录于专栏:大内老A大内老A
运行总次数:0
代码可运行

在《通过扩展让ASP.NET Web API支持W3C的CORS规范》中我们通过自定义的HttpMessageHandler为ASP.NET Web API赋予了跨域资源共享的能力,具体来讲,这个自定义的CorsMessageHandler的自由主要体现在如下两个方面:其一,为简单跨域请求的响应和继预检请求后的真实跨域资源请求的响应添加CORS报头;其二,对从浏览器发送的预检请求予以响应。实际上ASP.NET Web API本身就提供了针对CORS的支持,就其实现原理来看,与我们的实现没有本质的区别。接下来我们通过实例演示如何利用ASP.NET Web API自身的支持来实现“跨域资源共享”。

如图右图所示,我们利用Visual Studio在同一个解决方案中创建了两个Web应用。从项目名称可以看出,WebApi和MvcApp分别为ASP.NET Web API和MVC应用,后者是Web API的调用者。我们直接采用默认的IIS Express作为两个应用的宿主,并且固定了端口号:WebApi和MvcApp的端口号分别为“3721”和“9527”,所以指向两个应用的URI肯定不可能是同源的。

ASP.NET Web API对CORS提供的原生支持实现在一个名为“Microsoft ASP.NET Web API 2 Cross-Origin Support”的NuGet包中。我们依然沿用上面这个通过跨域Ajax请求获取联系人列表的这个例子,我们右键选种WebApi项目并在上下文菜单中选择“管理NuGet包(Manage NuGet Package)”,在弹出的如左图所示的对话框中,我们输入“CORS”作为查询条件后会看到这个NuGet包头。

当我们安装这个包之后,现有的packages目录下会添加两个名称分别为“Microsoft.AspNet.Cors.5.0.0”和“Microsoft.AspNet.WebApi.Cors.5.0.0”,针对保存其中的两个程序集(System.Web.Cors.dll和System.Web.Http.Cors.dll)的引用被自动添加到WebApi项目中。

ASP.NET针对CORS的实现就实现在程序集System.Web.Cors.dll中,另一个程序集System.Web.Http.Cors.dll自然就是针对ASP.NET Web API的。在默认情况下,针对CORS的支持是关闭的,我们需要在Global.asax中按照如下的方式调用当前HttpConfiguration的扩展方法EnableCors显示开启针对CORS的支持。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   1: GET http://localhost:3721/api/contacts?callback=jQuery110205729522893670946_1386232694513 &_=1386232694514 HTTP/1.1
   2: Host: localhost:3721
   3: Connection: keep-alive
   4: Accept: */*
   5: User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
   6: Referer: http://localhost:9527/
   7: Accept-Encoding: gzip,deflate,sdch
   8:  
   9: HTTP/1.1 200 OK
  10: Cache-Control: no-cache
  11: Pragma: no-cache
  12: Content-Type: application/json; charset=utf-8
  13: Expires: -1
  14: Server: Microsoft-IIS/8.0
  15: X-AspNet-Version: 4.0.30319
  16: X-SourceFiles: =?UTF-8?B?RTpc5oiR55qE6JGX5L2cXEFTUC5ORVQgV2ViIEFQSeahhuaetuaPreenmFxOZXcgU2FtcGxlc1xDaGFwdGVyIDE0XFMxNDAzXFdlYkFwaVxhcGlcY29ud?=
  17: X-Powered-By: ASP.NET
  18: Date: Thu, 05 Dec 2013 08:38:15 GMT
  19: Content-Length: 248
  20:  
  21: jQuery110205729522893670946_1386232694513([{"Name":"张三","PhoneNo":"123","EmailAddress":"zhangsan@gmail.com"},{"Name":"李四","PhoneNo":"456","EmailAddress":"lisi@gmail.com"},{"Name":"王五","PhoneNo":"789","EmailAddress":wangwu@gmail.com}])

和在《通过扩展让ASP.NET Web API支持W3C的CORS规范》实现CORS的实例一样,ASP.NET Web API自身也是借助于应用在HttpController类型或者定义其中的Action方法的特性来定义CORS授权策略的,这个特性类型为System.Web.Http.Cors.EnableCorsAttribute,它定义在程序集System.Web.Http.Cors.dll中。我们只需要按照如下的方式将EnableCorsAttribute特性应用到定义在ContactsController中的Action方法GetAllContacts上即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   1: [EnableCors(origins: "http://localhost:9527", headers: "*", methods: "*")]
   2: public class ContactsController : ApiController
   3: {
   4:     public IHttpActionResult GetAllContacts()
   5:     {
   6:         Contact[] contacts = new Contact[]
   7:         {
   8:             new Contact{ Name="张三", PhoneNo="123", EmailAddress="zhangsan@gmail.com"},
   9:             new Contact{ Name="李四", PhoneNo="456", EmailAddress="lisi@gmail.com"},
  10:             new Contact{ Name="王五", PhoneNo="789",EmailAddress="wangwu@gmail.com"},
  11:         };
  12:         return Json<IEnumerable<Contact>>(contacts);
  13:     }
  14: }
  15:  
  16: public class Contact
  17: {
  18:     public string Name { get; set; }
  19:     public string PhoneNo { get; set; }
  20:     public string EmailAddress { get; set; }
  21: }

如上面的代码片断所示,我们为应用的EnableCorsAttribute特性指定了三个参数。根据参数名称和上面我们针对W3C的CORS规范的介绍,我们应该可以猜得到它们分别代表:授权的源站点,和请求所允许的自定义包头和HTTP方法。我们将客户端ASP.NET MVC应用所在的站点“http://localhost:9527”设置为授权的源站点,后两者则直接设置为“*”表示对此不作任何限制。

接下来们在MvcApp应用中定义如下一个HomeController,默认的Action方法Index会将对应的View呈现出来。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   1: public class HomeController : Controller
   2: {
   3:     public ActionResult Index()
   4:     {
   5:         return View();
   6:     }
   7: }

如下所示的是Action方法Index对应View的定义。我们的目的在于:当页面成功加载之后以Ajax请求的形式调用上面定义的Web API获取联系人列表,并将自呈现在页面上。如下面的代码片断所示,Ajax调用和返回数据的呈现是通过调用jQuery的getJSON方法完成的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   1: <html>
   2: <head>
   3:     <title>联系人列表</title>
   4:     <script type="text/javascript" src="@Url.Content("~/scripts/jquery-1.10.2.js")"></script>
   1:  
   2: </head>
   3: <body>
   4:     <ul id="contacts"></ul>
   5:     <script type="text/javascript">
   6:         $(function ()
   7:         {
   8:             var url = "http://localhost:3721/api/contacts";
   9:             $.getJSON(url, null, function (contacts) {
  10:                 $.each(contacts, function (index, contact)
  11:                 {
  12:                     var html = "<li><ul>";
  13:                     html += "<li>Name: " + contact.Name + "</li>";
  14:                     html += "<li>Phone No:" + contact.PhoneNo + "</li>";
  15:                     html += "<li>Email Address: " + contact.EmailAddress + "</li>";
  16:                     html += "</ul>";
  17:                     $("#contacts").append($(html));
  18:                 });
  19:             });
  20:         });
  21:     
          </script>
   5: </body>
   6: </html>

现在运行我们的ASP.NET MVC程序,依然可以得到如右图所示的输出结果。从编程的角度来讲,ASP.NET Web API针对CORS的实现仅仅涉及到两个方面:

  • 其一,HttpConfiguration的扩展方法EnableCors,它用于开启ASP.NET Web API针对CORS的支持;
  • 其二,EnableCorsAttribute特性,它为目标HttpController或者Action方法定义CORS授权策略。

但是整个CORS体系不限于此,在它们背后隐藏着一系列的类型,我们将会利用后续的文章对此作全面讲述。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-12-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
2025 IntelliJ IDEA plus最新激活教程!
于2025年5月15日起,【程序视点】已限量投放”JetBrains全家桶Plus付费版“,支持全插件,支持全主题,并提供Github Copilot激活使用!
程序视点
2025/05/18
2660
2025 IntelliJ IDEA plus最新激活教程!
炸锅了!生产力直接拉满!Eclipse与GitHub Copilot强强联手,代码还能这样写?
如果您是 Eclipse 用户,您现在可以直接在 Eclipse 中利用 AI 支持的建议来更快、更轻松地编写代码。
程序视点
2025/03/17
1350
炸锅了!生产力直接拉满!Eclipse与GitHub Copilot强强联手,代码还能这样写?
IntelliJ IDEA 2025.1.1 最新激活图文教程!个人亲测有效,永久激活!
刚不久,JeBrains 官方更新了 IntelliJ IDEA 2025.1.1这个新版本。
程序视点
2025/05/14
5K0
IntelliJ IDEA 2025.1.1 最新激活图文教程!个人亲测有效,永久激活!
自从用上AI Assistant,下班都更早了!
由于使用AI Assistant是和 OpenAI API在交互,每个人使用工具的水准不一样(小二哥也是才入门)。
架构狂人
2024/03/20
8170
自从用上AI Assistant,下班都更早了!
【官方揭秘】JetBrains AI Assistant 与其他 AI 助手(如 GitHub Copilot)相比如何?
目前 JetBrains 官方发布了IntelliJ IDEA 2024.3.3最新版本!AI Assistant也迎来更新!
程序视点
2025/02/18
8040
【官方揭秘】JetBrains AI Assistant 与其他 AI 助手(如 GitHub Copilot)相比如何?
能抗住风控的GitHub Copilot激活,我们一起见证!
大家好,欢迎来到程序视点!我是小二哥。 前言 最近GitHub Copilot的风控又严格起来啦。好在小二哥这边提供的账号没有受到影响。目前小伙伴们全部安全运行中。
程序视点
2024/07/16
4.1K1
能抗住风控的GitHub Copilot激活,我们一起见证!
15个增强IntelliJ IDEA使用体验的插件!IntelliJ IDEA 2024插件最新推荐!
IntelliJ IDEA 是Java开发人员中最受欢迎的IDE之一。它具有许多便利的功能,如智能代码补全和自动化繁琐重复的开发任务,已成为Java社区中友好的IDE。这种便利和用户友好的特性有助于开发人员专注于更大的项目。
程序视点
2024/07/01
23K0
15个增强IntelliJ IDEA使用体验的插件!IntelliJ IDEA 2024插件最新推荐!
牛逼!让IntelliJ IDEA新手秒变老鸟!JetBrains AI Assistant 竟然还有这样的秘诀!
从 JetBrains IDE 2024.3 版本开始,AI Assistant 不仅可以从您的项目访问上下文,还可以访问 IDE 自己的文档。
程序视点
2025/02/28
2790
牛逼!让IntelliJ IDEA新手秒变老鸟!JetBrains AI Assistant 竟然还有这样的秘诀!
程序员的SK-II神仙水:GitHub Copilot,让你时刻拥有巅峰战力!
我们知道 Github Copliot (https://copilot.github.com/) 是由 GitHub 推出的一款 AI编程助手,基于大量公开源代码训练的深度学习模型,为开发者提供编程辅助!
程序视点
2024/08/29
2080
程序员的SK-II神仙水:GitHub Copilot,让你时刻拥有巅峰战力!
剧透:85%程序员未能驾驭的 GitHub Copilot 进阶技巧
近来,在编程领域比较火热的AI工具,最为实用和高效的,应该就是GitHub Copilot和AI Assistant。
程序视点
2024/04/12
3010
剧透:85%程序员未能驾驭的 GitHub Copilot 进阶技巧
OpenAI GPT-4.1限时免费薅!GitHub Copilot 上悄悄更新!
OpenAI 的最新模型 GPT-4.1 现已在 GitHub Copilot 和 GitHub Model中上线。
程序视点
2025/04/15
2420
OpenAI GPT-4.1限时免费薅!GitHub Copilot 上悄悄更新!
重磅升级!OpenAI o3-mini 空降 GitHub Copilot!好用到停不下来!
OpenAI的最新模型 o3-mini 现已在 GitHub Copilot 和 GitHub 模型中提供。将 OpenAI 的最新推理模型引入您的编码工作流程,现在可以立即使用!
程序视点
2025/02/07
1710
重磅升级!OpenAI o3-mini 空降 GitHub Copilot!好用到停不下来!
无数开发者良心推荐!不容错过的IntelliJ IDEA开发提效工具!
众所周知,IntelliJ IDEA在业界被公认为最好的java开发工具之一,尤其是在智能代码助手、代码自动提取,重构、J2EE支持、ANT,JUINT,CVS整合,代码审查GUI布局等方面非常不错。
程序视点
2024/04/12
3080
无数开发者良心推荐!不容错过的IntelliJ IDEA开发提效工具!
终于脱离困境,它把我从正则中解救出来啦!
正则表达式是我们日常开发中会遇到的一个功能!尽管其使用频率可能不是特别高,但真要使用它的时候,大部分程序员估计都得抓瞎啦~
程序视点
2024/03/29
4850
终于脱离困境,它把我从正则中解救出来啦!
如何开始免费试用 AI Assistant?如果你在寻找稳定的AI编程辅助工具,务必体验!
将程序视点设为星标精品文章第一时间阅读 大家好,欢迎来到程序视点!我是小二哥。 写在最前面 由于近几个月来,GitHub Copilot 受到官方严格风控的影响。大多数开发者无法稳定、安全地使用到GitHub Copilot 工具! 小二哥也接到很多读者小伙伴关于GitHub Copilot的询问:“支持Chat吗?”、“Chat有限流限制吗?”、“功能是否稳定?”等!在之前的文章中,小二哥已经给出过答案了:目前最好的方式是使用AI Assistant进行替换。 由于不了解AI Assistant的功能和特性,大多数小伙伴一直犹豫要不要使用AI Assistant。大家的想法大多是“要是能先试用AI Assistant就好啦!”
程序视点
2024/07/01
6150
如何开始免费试用 AI Assistant?如果你在寻找稳定的AI编程辅助工具,务必体验!
火起来了!OpenAI 最新模型 o3 和 o4-mini上线GitHub Copilot!
OpenAI 的最新推理模型 o3 和 o4-mini 现已在 GitHub 模型中提供。
程序视点
2025/04/29
830
火起来了!OpenAI 最新模型 o3 和 o4-mini上线GitHub Copilot!
告别O1-Preview,OpenAI更新最新O1模型!GitHub Copilot全新升级,迎接O1时代,让你的编程更高效!
我们知道,OpenAI 早在今天 9 月就推出了 o1-preview 和 o1-mini 模型,针对编码、科学和数学等高级任务进行了优化。
程序视点
2025/01/17
2780
告别O1-Preview,OpenAI更新最新O1模型!GitHub Copilot全新升级,迎接O1时代,让你的编程更高效!
JetBrains AI Assistant 强势入驻 Android Studio!开发者的春天来了?
现在可以在 Android Studio 中使用最新的 JetBrains AI Assistant 插件啦!
程序视点
2025/03/12
1860
JetBrains AI Assistant 中100%会用到的功能,免费体验!
JetBrains AI Assistant为数百万使用 JetBrains IDE 和编码工具的开发人员提供了方便、简洁的AI编程辅助功能!
程序视点
2024/07/01
5970
JetBrains AI Assistant 中100%会用到的功能,免费体验!
为什么说GitHub Copilot是程序员的AI竞争力?
在AI工具编程调查中,Stack Overflow公布近9万名有效开发者问卷调查报告。其中,有超过70%的开发者今年已在或即将使用 AI工具编程。
程序视点
2024/03/01
7630
为什么说GitHub Copilot是程序员的AI竞争力?
推荐阅读
2025 IntelliJ IDEA plus最新激活教程!
2660
炸锅了!生产力直接拉满!Eclipse与GitHub Copilot强强联手,代码还能这样写?
1350
IntelliJ IDEA 2025.1.1 最新激活图文教程!个人亲测有效,永久激活!
5K0
自从用上AI Assistant,下班都更早了!
8170
【官方揭秘】JetBrains AI Assistant 与其他 AI 助手(如 GitHub Copilot)相比如何?
8040
能抗住风控的GitHub Copilot激活,我们一起见证!
4.1K1
15个增强IntelliJ IDEA使用体验的插件!IntelliJ IDEA 2024插件最新推荐!
23K0
牛逼!让IntelliJ IDEA新手秒变老鸟!JetBrains AI Assistant 竟然还有这样的秘诀!
2790
程序员的SK-II神仙水:GitHub Copilot,让你时刻拥有巅峰战力!
2080
剧透:85%程序员未能驾驭的 GitHub Copilot 进阶技巧
3010
OpenAI GPT-4.1限时免费薅!GitHub Copilot 上悄悄更新!
2420
重磅升级!OpenAI o3-mini 空降 GitHub Copilot!好用到停不下来!
1710
无数开发者良心推荐!不容错过的IntelliJ IDEA开发提效工具!
3080
终于脱离困境,它把我从正则中解救出来啦!
4850
如何开始免费试用 AI Assistant?如果你在寻找稳定的AI编程辅助工具,务必体验!
6150
火起来了!OpenAI 最新模型 o3 和 o4-mini上线GitHub Copilot!
830
告别O1-Preview,OpenAI更新最新O1模型!GitHub Copilot全新升级,迎接O1时代,让你的编程更高效!
2780
JetBrains AI Assistant 强势入驻 Android Studio!开发者的春天来了?
1860
JetBrains AI Assistant 中100%会用到的功能,免费体验!
5970
为什么说GitHub Copilot是程序员的AI竞争力?
7630
相关推荐
2025 IntelliJ IDEA plus最新激活教程!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档