运维开发网

NET CORE实现跨域

运维开发网 https://www.qedev.com 2022-07-16 22:54 出处:网络
这篇文章介绍了ASP.NET?CORE实现跨域的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

这篇文章介绍了ASP.NET?CORE实现跨域的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下


一、后台API接口

创建一个Web API项目。net核心为前端接口提供数据。


二、前端界面

建立两个MVC项目,模拟不同的IP,在view中添加按钮调用WEB API提供的接口进行跨域测试。查看页面代码如下:

@{ Layout = null;}lt;!DOCTYPE htmlgt;lt;htmlgt;lt;headgt; lt;meta name="viewport" content="width=device-width" /gt; lt;titlegt;跨域测试1lt;/titlegt; lt;script src="~/Scripts/jquery-1.10.2.js"gt;lt;/scriptgt; lt;scriptgt; function btnGet() { $.ajax({ url: 'https://localhost:44355/api/values', type: "Get", dataType: "json", success: function (data) { alert("成功"); }, error: function (data) { alert("失败"); } }); } lt;/scriptgt;lt;/headgt;lt;bodygt; lt;divgt; lt;input type="button" id="btn" value="测试跨域" onclick="btnGet()" /gt; lt;/divgt;lt;/bodygt;lt;/htmlgt;


三、测试


1、不设置允许跨域

首先,不要套。net核心允许跨域,且看调用效果:

单击测试跨域1按钮:


进入F12调试模式,检查故障原因:


从这里可以看出,它会因为跨域问题而失败。

点击跨域2的效果和这个效果一致。


2、设置允许所有来源跨域


2.1、在StartUp类的ConfigureServices方法中添加如下代码:// 配置跨域处理,允许所有来源services.AddCors(options =gt;options.AddPolicy("cors",p =gt; p.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().AllowCredentials()));


2.2、修改Configure方法// 允许所有跨域,cors是在ConfigureServices方法中配置的跨域策略名称app.UseCors("cors");


2.3、测试


从截图可以看出,这次通话成功。


3、设置特定来源可以跨域


3.1、修改ConfigureServices方法代码如下://允许一个或多个来源可以跨域services.AddCors(options =gt;{ options.AddPolicy("CustomCorsPolicy", policy =gt; { // 设定允许跨域的来源,有多个可以用','隔开 policy.WithOrigins("http://localhost:21632") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); });});

这里,只允许ip为http://localhost:21632的源跨域。


3.2、修改Configure代码如下:// 设定特定ip允许跨域 CustomCorsPolicy是在ConfigureServices方法中配置的跨域策略名称app.UseCors("CustomCorsPolicy");


3.3测试

点击跨域测试1按钮,结果如下:


可以看到访问成功,然后点击跨域测试2按钮。结果如下:


发现此访问失败,F12进入调试模式,并检查失败原因:


从截图可以看出,是因为这里生成了跨域请求,但是跨域测试2所在的ip不允许跨域。那么如果你也希望跨域测试2调用成功呢?

将光标放在WithOrigins上,然后按F12查看定义:


从截图中发现,WithOrigins的参数是params类型的字符串数组。如果希望允许多个源跨域,只需传递一个字符串数组,因此代码修改如下:

//允许一个或多个来源可以跨域services.AddCors(options =gt;{ options.AddPolicy("CustomCorsPolicy", policy =gt; { // 设定允许跨域的来源,有多个可以用','隔开 policy.WithOrigins("http://localhost:21632", "http://localhost:24661") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); });});

此时跨域测试2也可以调用成功。



4、优化

在上面的例子中,需要分两步进行设置,以允许跨域。有没有办法只设置一次?在Configure方法中只能设置一次,代码如下:

// 设置允许所有来源跨域app.UseCors(options =gt;{ options.AllowAnyHeader(); options.AllowAnyMethod(); options.AllowAnyOrigin(); options.AllowCredentials();});// 设置只允许特定来源可以跨域app.UseCors(options =gt;{ options.WithOrigins("http://localhost:3000", "http://127.0.0.1"); // 允许特定ip跨域 options.AllowAnyHeader(); options.AllowAnyMethod(); options.AllowCredentials();});


5、利用配置文件实现跨域

在上面的例子中,ip是直接写在程序中的。如果要添加或修改允许跨域的ip,就要修改代码,非常不方便。那么,可以用配置文件来实现吗?看下面这个例子。


5.1、修改appsettings.json文件如下:{ "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": { "url": "http://localhost:21632|http://localhost:24663" }}

AllowedHosts设置了允许跨域的ip,多个IP可以直接用ldquo| rdquo拼接,或与其他符合性拼接。


5.2、增加CorsOptions实体类using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;namespace CorsDomainDemo{ public class CorsOptions { public string url { get; set; } }}


5.3、 新增OptionConfigure方法private void OptionConfigure(IServiceCollection services){ services.Configurelt;CorsOptionsgt;(Configuration.GetSection("AllowedHosts"));}


5.4、在ConfigureServices方法里面调用OptionConfigure方法// 读取配置文件内容OptionConfigure(services);


5.5、修改Configure方法,增加IOptionslt;CorsOptionsgt;类型的参数,最终代码如下using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.AspNetCore.HttpsPolicy;using Microsoft.AspNetCore.Mvc;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Logging;using Microsoft.Extensions.Options;namespace CorsDomainDemo{ public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { // 配置跨域处理,允许所有来源 //services.AddCors(options =gt; //options.AddPolicy("cors", //p =gt; p.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().AllowCredentials())); //允许一个或多个来源可以跨域 //services.AddCors(options =gt; //{ // options.AddPolicy("CustomCorsPolicy", policy =gt; // { // // 设定允许跨域的来源,有多个可以用','隔开 // policy.WithOrigins("http://localhost:21632", "http://localhost:24661") // .AllowAnyHeader() // .AllowAnyMethod() // .AllowCredentials(); // }); //}); // 读取配置文件内容 OptionConfigure(services); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptionslt;CorsOptionsgt; corsOptions) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseHsts(); } // 允许所有跨域,cors是在ConfigureServices方法中配置的跨域策略名称 //app.UseCors("cors"); // 设定特定ip允许跨域 CustomCorsPolicy是在ConfigureServices方法中配置的跨域策略名称 //app.UseCors("CustomCorsPolicy"); // 设置允许所有来源跨域 //app.UseCors(options =gt; //{ // options.AllowAnyHeader(); // options.AllowAnyMethod(); // options.AllowAnyOrigin(); // options.AllowCredentials(); //}); // 设置只允许特定来源可以跨域 //app.UseCors(options =gt; //{ // options.WithOrigins("http://localhost:3000", "http://127.0.0.1"); // 允许特定ip跨域 // options.AllowAnyHeader(); // options.AllowAnyMethod(); // options.AllowCredentials(); //}); // 利用配置文件实现 CorsOptions _corsOption = corsOptions.Value; // 分割成字符串数组 string[] hosts = _corsOption.url.Split('|'); // 设置跨域 app.UseCors(options =gt; { options.WithOrigins(hosts); options.AllowAnyHeader(); options.AllowAnyMethod(); options.AllowCredentials(); }); app.UseHttpsRedirection(); app.UseMvc(); } private void OptionConfigure(IServiceCollection services) { services.Configurelt;CorsOptionsgt;(Configuration.GetSection("AllowedHosts")); } }}

这样就可以利用配置文件实现跨域权限。

0

精彩评论

暂无评论...
验证码 换一张
取 消