热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在ASP.NETCore中实现CORS跨域

注:下载本文的完整代码示例请访问如何在ASP.NETCore中实现CORS跨域CORS(Cross-originresourcesharing)是一个W3C标

注:下载本文的完整代码示例请访问

如何在ASP.NET Core中实现CORS跨域

CORS(Cross-origin resource sharing)是一个W3C标准,翻译过来就是 跨域资源共享 ,它主要是解决Ajax跨域限制的问题。

CORS需要浏览器和服务器支持,现在所有现代浏览器都支持这一特性。注:IE10及以上

只要浏览器支持,其实CORS所有的配置都是在服务端进行的,而前端的操作浏览器会自动完成。

在本例中,将演示如何再ASP.NET Core中实现CORS跨域。

你需要windows系统。
你需要安装IIS。
推荐使用VS2015 Update3或更新的版本来完成本例,下载地址:
需要安装.NET Core的开发环境,这里提供VS版:

在VS中新建项目,项目类型选择ASP.NET Core Web Application(.NET Core),输入项目名称为:CSASPNETCoreCORS,Template选择Empty.

配置服务端

注:添加下面的代码时IDE会提示代码错误,这是因为还没有引用对应的包,进入报错的这一行,点击灯泡,加载对应的包就可以了。

(图文无关)

打开Startup.cs

在ConfigureServices中添加如下代码:

services.AddCors();

在Configure方法中添加如下代码:

app.UseCors(builder = builder.WithOrigins( http://localhost ));

完整的代码应该是这样:

public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseCors(builder = builder.WithOrigins( http://localhost ));
app.Run(async (context) =
{
await context.Response.WriteAsync( Hello World!
});
}

来让我们运行一下:

输出结果很简单,你会在浏览器上看到一个Hello World!

既然是跨域,那我们就需要用两个域名,上面我们已经有了一个,类似于这样的:

接下来我们来用过IIS来搭建另外一个。

为了文章的简洁,这里假设你已知道如何在IIS上搭建一个网站,如有疑问,网上一堆答案。

首先我们新建一个文件夹,并将IIS默认的localhost网站的根目录指向该文件夹。

在该文件夹中添加一个文件index.html。

内容应该是这个样子:

html xmlns= http://www.w3.org/1999/xhtml
head
title /title
script src= https://code.jquery.com/jquery-3.1.1.min.js /script
/head
body
script
$.get( http://localhost:1661/ , {}, function (data) {
alert(data);
}, text
/script
/body
/html

注:请求的地址应为你上个项目的调试地址,撰写此文时我项目的调试地址为http://localhost:1661/,具体以自己的情况为准。

浏览localhost这个网站,js会跨域请求另外一个域名的地址,并弹出返回值。

在发起ajax请求时,浏览器一旦发现Ajax请求跨域,会自动添加一些附加的头信息并请求到目标服务器(会带有本域的域名),目标服务器则检测该域名是否在允许跨域的域名之列,如果有则返回请求结果,否则失败。

具体的原理可以看看这篇博客:。

分组策略以及MVC

上例仅仅是一个基本的配置方法,接下来将演示更高级一点的方式,下面将演示在分组策略以及与MVC的整合。

Startup.cs

ConfigureServices中

services.AddCors(optiOns=
{
options.AddPolicy( AllowSpecificOrigin , builder =
{
builder.WithOrigins( http://localhost , https://www.microsoft.com
});
options.AddPolicy( AllowSpecificOrigin1 , builder =
{
builder.WithOrigins( http://localhost:8080 , https://www.stackoverflow.com
});
});
services.AddMvc();

Configure中

app.UseMvc();

完整的代码应该是这样:

public void ConfigureServices(IServiceCollection services)
{
services.AddCors(optiOns=
{
options.AddPolicy( AllowSpecificOrigin , builder =
{
builder.WithOrigins( http://localhost , https://www.microsoft.com
});
services.AddMvc();
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseMvc();
}

接下来我们来添加Controller

在项目中添加一个目录Controllers,并在其中添加一个APIController,命名为HomeAPIController.cs

其中的内容应该是这样:

//[EnableCors( AllowSpecificOrigin )]
[Route( api/[controller] )]
public class HomeAPIController : Controller
{
[EnableCors( AllowSpecificOrigin )]
[HttpGet]
public string Get()
{
return this message is from another origin
[DisableCors]
[HttpPost]
public string Post()
{
return this method can't cross origin
}
}

[EnableCors( AllowSpecificOrigin )] 既为在本 controller 或 action 中应用哪个分组策略。

[DisableCors] 则为本controller或action不允许跨域资源请求

改造浏览器端html

修改localhost网站的index.html,内容应为:

html xmlns= http://www.w3.org/1999/xhtml
head
title /title
script src= https://code.jquery.com/jquery-3.1.1.min.js /script
/head
body
script
$.get( http://localhost:1661/API/HomeAPI , {}, function (data) {
alert(data);
}, text
/script
/body
/html

调试

F5调试服务端项目,你会看到一个404页面,因为默认路径上没有页面,不用管它,

浏览http://localhost, js会Get请求http://localhost:1661/API/HomeAPI,并弹出返回值,

而如果你去Post请求http://localhost:1661/API/HomeAPI, 则请求会被拦截。

注:下载本文的完整代码示例请访问


推荐阅读
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 如何在窗口右下角添加调整大小的手柄
    本文探讨了如何在传统MFC/Win32 API编程中实现类似C# WinForms中的SizeGrip功能,即在窗口的右下角显示一个用于调整窗口大小的手柄。我们将介绍具体的实现方法和相关API。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 在使用 MUI 框架进行应用开发时,开发者常常会遇到 mui.init() 和 mui.plusReady() 这两个方法。本文将详细解释它们的区别及其在不同开发环境下的应用。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
author-avatar
zhanghao320829
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有