asp.net webapi 跨域及 netcore3.1 跨域处理方式
发布日期:2021-05-09 01:19:07 浏览次数:20 分类:博客文章

本文共 8242 字,大约阅读时间需要 27 分钟。

十年河东,十年河西,莫欺少年穷

学无止境,精益求精

跨域,跨域,之前用的挺稳定的,今天突然出问题了,哎,搞到最后是浏览器把我的站点设为非安全站点造成的,奶奶个腿,换个浏览器就又不存在跨域问题了...

那么这也就是说,代码是没问题的

索性记录下来吧

asp.net 方法1

1、引用NuGet的第三方包:Microsoft.AspNet.WebApi.Cors

 2、在 /App_Start/WebApiConfig.cs 中添加代码:

config.EnableCors();

如下:

public static void Register(HttpConfiguration config)        {            config.EnableCors();            //EnableCrossSiteRequests(config);            config.Routes.MapHttpRoute(                name: "DefaultApi",                routeTemplate: "api/{controller}/{action}/{id}",                defaults: new { id = RouteParameter.Optional }            );        }

然后在我们的控制器上增加如下标识:

[EnableCors(origins: "*", headers: "*", methods: "GET,POST,PUT,DELETE")]

如下:

///     /// 2g电池 NB5311相关    ///     [RoutePrefix("api/Battery2gTcpip")]    [EnableCors(origins: "*", headers: "*", methods: "GET,POST,PUT,DELETE")]    //[ApiActionAuth]    public class Battery2gTcpipController : ApiController

asp.net 方法2

1、只需在 /App_Start/WebApiConfig.cs 中添加代码:

private static void EnableCrossSiteRequests(HttpConfiguration config)        {            //对所有的请求来源没有任何限制            var cors = new EnableCorsAttribute(             origins: "*",             headers: "*",             methods: "*"             );            config.EnableCors(cors);        }

2、引用这个方法即可:

public static void Register(HttpConfiguration config)        {           // config.EnableCors();            EnableCrossSiteRequests(config);            config.Routes.MapHttpRoute(                name: "DefaultApi",                routeTemplate: "api/{controller}/{action}/{id}",                defaults: new { id = RouteParameter.Optional }            );        }        private static void EnableCrossSiteRequests(HttpConfiguration config)        {            //对所有的请求来源没有任何限制            var cors = new EnableCorsAttribute(             origins: "*",             headers: "*",             methods: "*"             );            config.EnableCors(cors);        }

上述两种方式为asp.net的方法

netcore3.1的方法如下

1.安装程序CORS程序包

Install-Package Microsoft.AspNetCore.Mvc.Cors

这个包初始化项目时一般都会自带。

2.配置CORS服务

在 Startup类,ConfigureServices方法里,添加如下代码:

readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";        // This method gets called by the runtime. Use this method to add services to the container.        public void ConfigureServices(IServiceCollection services)        {                       services.AddCors(options =>            {                options.AddPolicy(name: MyAllowSpecificOrigins,                                  builder =>                                  {                                      builder.WithOrigins("http://localhost:8080",                                                          "http://localhost:8081", "http://xx.com", "https://xx.com/5awebsite");                                  });            });            services.AddControllers();

全文如下:

public IConfiguration Configuration { get; }        readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";        // This method gets called by the runtime. Use this method to add services to the container.        public void ConfigureServices(IServiceCollection services)        {                       services.AddCors(options =>            {                options.AddPolicy(name: MyAllowSpecificOrigins,                                  builder =>                                  {                                      builder.WithOrigins("http://localhost:8080",                                                          "http://localhost:8081");                                  });            });            services.AddControllers();            //改变netCOre默认驼峰风格,返回的JOSN和实例类一致            //services.AddControllers().AddNewtonsoftJson(options =>            //{            //    options.SerializerSettings.ContractResolver = new DefaultContractResolver();            //});            //选项模式            services.Configure
(Configuration.GetSection("FileOptions")); services.Configure
(Configuration.GetSection("IsDevelopOptions")); services.Configure
(Configuration.GetSection("PayCenterSetting")); WxPayHelper.Init(Configuration.GetSection("WxPaymentSettings")); #region 注册SQLSERVER services.AddDbContext
(options => options.UseSqlServer(Configuration.GetConnectionString("WuAnDBContext"))); #endregion #region JWT services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(x => { x.RequireHttpsMetadata = false; x.SaveToken = true; x.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(TokenManagementModel.Secret)), ValidIssuer = TokenManagementModel.Issuer, ValidAudience = TokenManagementModel.Audience, ValidateIssuer = false, ValidateAudience = false }; }); #endregion #region Swagger services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Swagger管理平台", Version = "V1" }); c.SwaggerDoc("v2", new OpenApiInfo { Title = "管理平台改造工程", Version = "V2" }); c.DocInclusionPredicate((docName, apiDesc) => apiDesc.GroupName == docName.ToUpper()); var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location); var xmlPath = Path.Combine(basePath, "WuAnApi.xml"); c.IncludeXmlComments(xmlPath); #region Jwt c.OperationFilter
(); c.OperationFilter
(); c.OperationFilter
(); c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme { Description = "JWT授权(数据将在请求头中进行传递)直接在下面框中输入Bearer {token}(注意两者之间是一个空格) \"", Name = "Authorization",//jwt默认的参数名称 In = ParameterLocation.Header,//jwt默认存放Authorization信息的位置(请求头中) Type = SecuritySchemeType.ApiKey }); #endregion }); #endregion #region 注册自定义服务 //services.AddScoped
(); services.AddScoped
(); services.AddScoped
(); services.AddScoped
(); services.AddScoped
(); services.AddScoped
(); services.AddScoped
(); services.AddScoped
(); services.AddScoped
(); //services.AddScoped
(); #region 老平台改造 services.AddScoped
(); services.AddScoped
(); #endregion #endregion }
View Code

最后在 Configure 中注册如下:

//允许跨域            app.UseCors(builder => builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().WithExposedHeaders("Content-Disposition"));

//注册跨域            app.UseCors(MyAllowSpecificOrigins);

全文如下:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }            //允许跨域            app.UseCors(builder => builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().WithExposedHeaders("Content-Disposition"));            //注册异常中间件            app.UseMiddleware
(); #region 启用Swagger中间件 // 启用Swagger中间件 app.UseSwagger(c => c.RouteTemplate = "/swagger/{documentName}/swagger.json"); // 配置SwaggerUI app.UseSwaggerUI(c => { c.SwaggerEndpoint($"/swagger/v1/swagger.json", "V1"); c.SwaggerEndpoint($"/swagger/v2/swagger.json", "V2"); }); #endregion app.UseAuthentication(); app.UseHttpsRedirection(); app.UseRouting(); //注册跨域 app.UseCors(MyAllowSpecificOrigins); app.UseAuthorization(); //启动日志 EFLoggerHelper.Register(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }

主要是 app.UseCors("cors");这句代码,需要注意的是必须放在 UseMvc 之前,且策略名称必须是已经定义的

短短几行代码即可解决跨域问题。奥利给....

@天才卧龙的博客

上一篇:乐观锁悲观锁应用
下一篇:asp.net core 系列 4 项目实战之:NetCore 的 MVC模式(参考自:Microsoft教程)

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年04月26日 03时28分56秒