Asp .Net Core 系列: 集成 CORS跨域配置

.NET----WebAPI配置和服务config.EnableCors() 如果.NET服务没有配置跨域请求,则会出现错误,不支持跨域 一、安装Microsoft.Asp.Net.WebApi.Cors包 二、在 WebApiConfig中添加配置文件 // Web API 配置和服务 config.EnableCors(); 三、在控制器中控制跨域请求 using System.Web.Http.Cors; //跨域命名空间 namespace WebA... 阅读详情

什么是CORS?

CORS,全称是“跨源资源共享”(Cross-Origin Resource Sharing),是一种Web应用程序的安全机制,用于控制不同源的资源之间的交互。

在Web应用程序中,CORS定义了一种机制,通过该机制,浏览器能够限制哪些外部网页可以访问来自不同源的资源。源由协议、域名和端口组成。当一个网页请求另一个网页上的资源时,浏览器会检查请求是否符合CORS规范,以确定是否允许该请求。

CORS的工作原理是:当浏览器发送一个跨域请求时,它会附加一些额外的头部信息到请求中,这些头部信息包含了关于请求的来源和目的的信息。服务器可以检查这些头部信息并决定是否允许该请求。如果服务器允许请求,它会返回一个响应,其中包含一个名为“Access-Control-Allow-Origin”的头部信息,该信息指定了哪些源可以访问该资源。浏览器会检查返回的“Access-Control-Allow-Origin”头部信息,以确定是否允许该跨域请求。

通过使用CORS,开发人员可以控制哪些外部网页可以访问他们的资源,从而提高应用程序的安全性。

Asp .Net Core 中如何配置CORS?

在ASP.NET Core中,CORS(跨源资源共享)可以通过简单的配置来实现。CORS是一种机制,允许一个网页的许多资源(例如字体,JavaScript等)从不同的源获取。默认情况下,ASP.NET Core不允许跨源请求,为了使其能够允许跨域请求,你需要启用CORS。

以下是如何在ASP.NET Core中配置CORS的步骤:

  1. 首先,确保你的项目中已经安装了Microsoft.AspNetCore.Cors包。如果没有,你可以通过NuGet包管理器来安装它。打开终端或命令提示符,然后键入以下命令:

    dotnet add package Microsoft.AspNetCore.Cors
    
  2. 在Startup.cs文件的ConfigureServices方法中配置CORS服务:

    public void ConfigureServices(IServiceCollection services)  
    {  
        // ... 其他服务配置  
     
        // 添加CORS服务  
        services.AddCors(options =>  
        {  
            // 允许所有源访问(请注意:在生产环境中应更具体地配置源)  
            options.AddPolicy("MyCorsPolicy", builder => builder.WithOrigins("http://example.com"));  
        });  
     
        // ... 其他服务配置  
    }
    

    这里我们添加了一个名为"MyCorsPolicy"的策略,它允许来自http://example.com的跨域请求。你可以根据需要添加更多的源地址或使用通配符*来允许所有源。

  3. 在Configure方法中启用CORS中间件:

    ublic void Configure(IApplicationBuilder app, IWebHostEnvironment env)  
    {  
        // ... 其他中间件配置  
     
        // 使用CORS中间件并应用之前定义的策略  
        app.UseCors("MyCorsPolicy");  
     
        // ... 其他中间件配置  
    }
    

CorsPolicyBuilder类详解

https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.cors.infrastructure.corspolicybuilder?view=aspnetcore-8.0

方法
AllowAnyHeader()允许所有请求头。等同于WithHeaders("*")
AllowAnyMethod()允许所有HTTP方法的请求。等同于WithMethods("*")
AllowAnyOrigin()允许来自任何源的请求。等同于WithOrigins("*")。但需要注意,如果使用了这个方法,可能会带来安全风险,因为它允许来自任何源的请求,包括潜在的恶意源。通常建议明确指定允许的源
AllowCredentials()允许带有凭据(如cookies、HTTP认证等)的请求
Build()使用添加的条目生成新的 CorsPolicy 。
DisallowCredentials()将策略设置为不允许凭据。
SetIsOriginAllowed(Func<String,Boolean>)设置为基础策略指定的 isOriginAllowed 。
SetIsOriginAllowedToAllowWildcardSubdomains()将 IsOriginAllowed 策略的 属性设置为一个函数,该函数允许源在评估是否允许源时匹配配置的通配符域。
SetPreflightMaxAge(TimeSpan)设置基础策略的预检MaxAge。
WithExposedHeaders(String[])将指定的 exposedHeaders 添加到策略。
WithHeaders(String[])允许带有指定请求头的请求。可以传入一个或多个请求头名称
WithMethods(String[])允许指定HTTP方法(如GET、POST等)的请求。可以传入一个或多个HTTP方法,可以传入一个HttpMethods枚举的实例
WithOrigins(String[])允许来自指定源的请求。可以传入一个或多个源地址
  1. WithOrigins(string origin): 允许来自指定源的请求。可以传入一个或多个源地址。
builder.WithOrigins("http://example.com");
  1. WithOrigins(string[] origins): 允许来自指定源的请求。可以传入一个或多个源地址数组。
builder.WithOrigins("http://example.com", "http://www.example.com");
  1. WithMethods(string method): 允许指定HTTP方法(如GET、POST等)的请求。可以传入一个或多个HTTP方法。
csharp复制代码

builder.WithMethods("GET", "POST");
  1. WithMethods(HttpMethods methods): 允许指定HTTP方法(如GET、POST等)的请求。可以传入一个HttpMethods枚举的实例。
builder.WithMethods(HttpMethods.Get | HttpMethods.Post);
  1. WithHeaders(string headerName): 允许带有指定请求头的请求。可以传入一个或多个请求头名称。
builder.WithHeaders("X-Custom-Header");
  1. WithHeaders(IEnumerable<string> headerNames): 允许带有指定请求头的请求。可以传入一个或多个请求头名称的集合。
builder.WithHeaders(new string[] { "X-Custom-Header1", "X-Custom-Header2" });

WithAnyMethod(): 允许所有HTTP方法的请求。等同于WithMethods("*")。

WithAnyHeader(): 允许所有请求头。等同于WithHeaders("*")。

WithAnyOrigin(): 允许来自任何源的请求。等同于WithOrigins("*")。但需要注意,如果使用了这个方法,可能会带来安全风险,因为它允许来自任何源的请求,包括潜在的恶意源。通常建议明确指定允许的源。

WithCredentials(): 允许带有凭据(如cookies、HTTP认证等)的请求。这通常用于支持跨站点请求伪造(CSRF)保护。如果设置了此选项,客户端必须包含凭据来证明其身份,并且不允许使用预检请求来预先授权带有凭据的请求。

Build(): 构建CORS策略。在调用此方法后,可以通过将策略添加到CORS配置中来使用它。例如:options.AddPolicy(“MyCorsPolicy”, policy);

注册以及使用策略三种方式

在ConfigureService先注册策略(默认策略或命名策略),然后可以在Configure管道中进行全局拦截 或者 以特性的形式作用于Controller或action。

直接在Configure中配置相应的策略进行全局拦截,不需要在ConfigureService中注册任何代码。

  • 默认策略:AddDefaultPolicy

                //注册
                builder.Services.AddCors(options => {
                    options.AddDefaultPolicy(policy =>
                    {
                        policy.SetIsOriginAllowed(_ => true).AllowAnyMethod().AllowAnyHeader().AllowCredentials();
                    });
                });
    
                // 使用
                app.UseCors();
    
  • 命名策略:AddPolicy

                //注册
                builder.Services.AddCors(options => {
                    options.AddPolicy("MCodeCors",policy =>
                    {
                        policy.SetIsOriginAllowed(_ => true).AllowAnyMethod().AllowAnyHeader().AllowCredentials();
                    });
                });
    
                // 使用
                app.UseCors("MCodeCors");
    
  • 全局拦截

                app.UseCors(build =>
                {
                    build.SetIsOriginAllowed(_ => true).AllowAnyHeader().AllowAnyMethod().AllowCredentials();
                });
    

EnableCors 和 DisableCors 特性

EnableCors和DisableCors特性是ASP.NET Core中的CORS(跨源资源共享)特性,它们主要用于配置CORS策略。

EnableCors特性允许你指定哪些源可以访问你的应用程序资源,以及允许哪些HTTP方法和请求头。它基于Controller与Action,可以在每个Controller或Action上使用。

DisableCors特性则用于禁用CORS功能。通过使用这个特性,你可以禁止跨域请求,以确保应用程序的安全性。

需要注意的是,这两个特性都只适用于ASP.NET Core中的控制器类,并且需要在控制器类中显式添加这些特性。例如:

[EnableCors("PolicyName")]  
public class MyController : Controller  
{  
    // 控制器方法...  
}

或者:

[DisableCors]  
public class MyController : Controller  
{  
    // 控制器方法...  
}

关于带证书与不带证书代码的实现

跨源(cross-origin)不带请求证书(Credentials)

js方法如下

      $("#btn1").click(function () {
            //alert(11);
            $.ajax({
                url: 'http://localhost:8000/Home/Get',
                type: 'Get',
                success: function (res) {
                    alert(res.name);
                }
            });
        })

image

这个*号是AllowAnyOrigin,设置返回的,返回是允许所有源的意思,如下代码

           #region 普通的跨域验证,不带请求中的证书

            app.UseCors(builder =>
            {
                builder.AllowAnyOrigin()
                       .AllowAnyHeader()
                       .AllowAnyMethod()
            });
            #endregion

跨源(cross-origin)带请求证书(Credentials)

  $("#btn2").click(function () {
            //alert(11);
            $.ajax({
                url: 'http://localhost:8000/Home/Get',
                type: 'Get',
                xhrFields: { withCredentials: true },
                crossDomain: true,
                success: function (res) {
                    alert(res.name);
                }
            });
        })

image

我们使用第二种请求方式,而这个时候如果我们开启了,却没有改后端配值,我们发起请求发现。回报如下跨域:

Access to XMLHttpRequest at 'http://localhost:8000/Home/Get' from origin 'http://localhost:5000' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

这个是什么原因导致的呢?我们看看ajax请求,因为我们使用了 withCredentials: true,而恰恰这个使用是不允许AllowAnyOrigin()的,意思就是不允许返回的Access-Control-Allow-Origin:*,那我们的处理方式如下

我们看看的配置,如下代码,我们必须开启AllowCredentials,同时去掉AllowAnyOrigin,这两个

            #region 跨源(cross-origin)请求中的证书(Credentials) 不带自定义参数
            //当在ajax设置了withCredentials: true,就是要带域名的cookie,同时这里是不允许返回Access - Control - Allow - Origin: *这个带星号的,这个时候,我们就要设置允许的参数了

            app.UseCors(builder =>
            {
                builder.SetIsOriginAllowed(_ => true)
               .AllowCredentials();
            });

            #endregion

image

发现我们的请求head多了了Access-Control-Allow-Credentials:true和带了cookie

封装成扩展

    /// <summary>
    /// 跨域服务扩展
    /// </summary>
    public static class CorsServiceExtensions
    {
        private readonly static string PolicyName = "MCodeCors";

        /// <summary>
        /// 添加跨域
        /// </summary>
        /// <param name="services">服务集合</param>
        /// <returns></returns>
        public static IServiceCollection AddMCodeCors(this IServiceCollection services)
        {
            if (services == null) throw new ArgumentNullException(nameof(services));
            //origin microsoft.aspnetcore.cors      
            return services.AddCors(options =>
                {
                    options.AddPolicy(PolicyName, policy =>
                    {
                        policy.SetIsOriginAllowed(_ => true).AllowAnyMethod().AllowAnyHeader().AllowCredentials();
                    });
                });
        }
        /// <summary>
        /// 使用跨域
        /// </summary>
        /// <param name="app">应用程序建造者</param>
        /// <returns></returns>
        public static IApplicationBuilder UseMCodeCors(this IApplicationBuilder app)
        {
            return app.UseCors(PolicyName);
        }
    }
Spring Cloud Gateway:CORS配置 可以在Spring Cloud Gateway上全局或每个路由上配置跨域资源共享(CORS)行为。 阅读详情

相关推荐

ASP.NET WebApi跨域请求配置dll文件

ASP.NET WebApi跨域请求的配置引用dll文件,完美实现了跨域请求问题。

Asp.NetCore WebApi 跨域请求

跨域请求 同源策略:出于对客户访问安全的考虑,浏览器会阻止网页向其他网站发送请求,此限制称为同源策略 跨域请求:需要读取其他网站中的数据,需要其他网站对开发者的应用允许进行跨域请求,如在APP调用第三方API接口。 第1步、注册CORS配置服务。在Startup类ConfigureServices方法中调用AddCors()方法添加跨域策略 public void ConfigureServices(IServiceCollection services) {

Lzysnd的博客 1199

EtherCAT应用层协议选型指南:CoE、SoE、EoE、FoE、AoE到底怎么选?看完这篇就懂了

本文深入解析EtherCAT应用层协议(CoE、SoE、EoE、FoE、AoE)的选型策略,从实时性、数据吞吐量和功能完整性三大核心指标出发,提供工业场景下的实战决策框架。通过技术特性对比、混合协议架构设计和常见故障规避指南,帮助工程师优化自动化设备通信性能。

weixin_28718793的博客 488

.netCore跨域设置

/ 允许特定ip跨域。// 设定特定ip允许跨域 CustomCorsPolicy是在ConfigureServices方法中配置的跨域策略名称。// 允许所有跨域,cors是在ConfigureServices方法中配置的跨域策略名称。这里设置只允许ip为http://localhost:21632的来源允许跨域。// 设定允许跨域的来源,有多个可以用','隔开。

cduoa的专栏 3550

别再乱调栅极电阻了!手把手教你用示波器调试FOC驱动MOS管,避开EMC和震荡坑

本文详细介绍了FOC驱动中MOS管栅极参数的精准调试方法,涵盖示波器配置、波形特征分析及栅极电阻选型策略。通过实战案例和工程经验,帮助工程师有效解决EMC和震荡问题,提升驱动电路稳定性和效率。

weixin_28728495的博客 502

ThunderScope开源示波器

4CH,1GSa/S 开源示波器。前端很简洁,BUF802+LMH6518,ADC是HMCAD1511,用Xilinx A7 FPGA进行控制,数据通过PCIE总线传输到上位机处理。目前这个项目已经被挂到了Xilinx官网,强。设计日志:https://hackaday.io/project/180090-thunderscope开源地址:https://github.com/EEVengers/ThunderScope。

leida_wt的博客 8185

Asp .Net Core实现微服务:集成 CORS跨域配置

CORS,全称是“跨源资源共享”(Cross-Origin Resource Sharing),是一种Web应用程序的安全机制,用于控制不同源的资源之间的交互。在Web应用程序中,CORS定义了一种机制,通过该机制,浏览器能够限制哪些外部网页可以访问来自不同源的资源。源由协议、域名和端口组成。当一个网页请求另一个网页上的资源时,浏览器会检查请求是否符合CORS规范,以确定是否允许该请求。

主宰 1298

基于Xilinx Artix7 的FPGA高级应用 (二):千兆以太网通信(实战篇)第一期

本项目是基于Xlinx Artix7 XC7A35T芯片 以太网芯片选用的是RTL8211EG PHY芯片 MAC 和PHY接口标准是GMII 开发工具是vivado 2018.3 我们先来复习一下以太网的基本通信原理: 当我们的计算机需要与局域网中另外的设备进行通信的时候,需要将数据传输到网卡进行编码,然后传输到线上,经过另一个设备的网卡解码成该设备能读取的数据。 关于以太网协议的知识在原理篇中已经讲过,不再重复,下面直接看接收代码: 首先注意我们的MAC和PHY通信选择的是GMII接口标准,发送数据一

工大技术底层人员的博客 4033

为什么你的CORS在生产环境失效?ASP.NET Core跨域配置避坑指南

解决ASP.NET Core跨域CORS配置在生产环境失效难题,详解常见误区与正确配置方法,涵盖预检请求处理、策略注册时机及HTTPS适配。助你稳定实现前后端分离部署,值得收藏。

FastProceed的博客 869

C# 实现 Modbus 通信全教程(支持 TCP 和 RTU,含完整错误处理)

环境准备:安装 NModbus4 库,明确设备参数(IP/串口、地址、数据类型);连接设备:TCP 用 TcpClient,RTU 用 SerialPort,注意超时和参数匹配;读写数据:根据数据类型调用对应方法(读保持寄存器用 ReadHoldingRegisters);错误处理:捕获连接、超时、协议等异常,针对性排查问题。掌握这些后,即可轻松实现与工业设备的 Modbus 通信,为上位机开发提供稳定的数据交互能力。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2062

(八)DDR_PHY架构及功能——(PUB组成、初始化及Training流程、Clock关系)

文章目录一、DDR_PHY结构组成1.1、DDR Memory子系统1.2、DDR_PHY架构组成1.3、PUB模块功能实现流程1.3.1、DDR系统初始化流程1.3.2、PLL初始化流程 一、DDR_PHY结构组成 1.1、DDR Memory子系统   Memory子系统主要由DDR Controller和DDR_PHY(含DDR_IO)两个部分组成。DDR Controller主要承担其它子系统(如CPU)与Memory子系统进行数据交互时的传输效率及调度,DDR_PHY主要负责数据交互过程中的传输速

Mr.翟的博客 1万+

Asp.net core 跨域配置

CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种由浏览器强制执行的安全机制,用于控制一个源(Origin)的网页是否可以访问另一个源的资源。同源策略(Same-Origin Policy):浏览器默认禁止前端 JavaScript 向不同源的服务器发起请求。CORS 是标准解决方案:后端通过响应头告诉浏览器:“我允许哪些前端域名来访问我”。✅ 举例:→ 这是跨域请求,必须配置 CORS,否则浏览器会拦截响应!关键点说明CORS 保护的是后端 API。

qq_44967213的博客 532

打通ZYNQ的任督二脉:AXI_FIFO数据交互全解析

FIFO(First In First Out,先进先出)是一种经典的数据缓冲结构,就像排队买票一样,先来的人先得到服务。时钟域交叉(CDC):连接不同时钟频率的模块数据缓冲:平衡生产者和消费者的速度差异流量控制:防止数据丢失或溢出input clk,// 输入AXI4-Stream接口(从PS到PL)// 输出AXI4-Stream接口(从PL到PS)// 状态指示信号// 定义状态机状态// 数据缓存// 8个深度的缓存// 流水线处理寄存器。

QQ_778132974的博客 304

ASP.net Core跨域配置

我们在使用API加视图前后端分离时,一般情况WebAPI都是跨域请求,没有设置跨域一般会报以下错误 No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:48057' is therefore not allowed access. 那么接下来我们说一下ASP.net Core的两种跨域:全局和区域 全局跨域: 打开Startup.cs文件,在Config

weixin_45978023的博客 1336

基于RAG(Retrieval Augmented Generation)架构的简单问答系统的Python实现示例

以下是一个基于RAG(Retrieval Augmented Generation)架构的简单问答系统的Python实现示例。这个系统使用langchain库进行文档处理、检索,以及与大语言模型交互。

max500600的博客 741

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【ASP.NET Core高手进阶】:深入剖析CORS策略配置的6种高阶用法

掌握ASP.NET Core跨域CORS配置难题,本文详解6种高阶策略用法,涵盖预检请求处理、动态策略匹配、多域名授权等核心技巧,提升API安全性与灵活性,适用微服务与前后端分离场景,值得收藏。

QuickProceed的博客 996

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Asp.Net Core使用SignalR通信(Cors跨域与Jwt权限验证)

一、前端 <script src="js/jquery-3.3.1.min.js"></script> <script src="lib/SingnlR/signalr.js"></script> <script type="text/javascript"> var url = "https...

qq_26900081的博客 8380

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Asp.net Core 跨域配置

一般情况WebApi都是跨域请求,没有设置跨域一般会报以下错误 No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:48057' is therefore not allowed access. ASP.net Core 跨域有两种,...

qq_21415759的专栏 680

(ASP.NET Core跨域配置终极手册):从入门到上线的完整实战路径

解决ASP.NET Core跨域难题,本文系统讲解CORS配置方法,涵盖前后端分离、微服务等场景,支持策略定制与中间件优化。从开发到上线全程实战,安全高效,值得收藏。

PixelGlow的博客 698

asp.net core 3.1 中配置跨域

// 1.跨域配置 注册策略 services.AddCors(options => { options.AddPolicy("CorsPolicy", builder => { builder.SetIsOriginAllowed((x) => true) .AllowAnyOrigin() ...

andy5520的博客 2668

api netcore 跨域支持_ASP.NET Core WebApi 跨域配置 Cors

使用Cors 要引用Microsoft.AspNetCore.Cors 命名空间Startup.cs customsetting.json{"Address": {"allowUrl":"http://localhost;http://localhost:8080;http://192.168.118.107;http://192.168.118.107:8080"}}WebApi 使用:主...

weixin_27012007的博客 317

ASP.NET Core CORS允许头配置秘籍:从入门到生产环境零失误

掌握ASP.NET Core CORS的允许头配置,解决跨域请求难题。涵盖预检请求处理、多域名支持与生产环境安全策略,提供完整代码示例。适用于前后端分离项目,确保接口安全调用。值得收藏的实战指南,点击了解详细配置方案。

CompiLume的博客 1012

Asp.Net Core跨域配置

在没有设置跨域配置的时候,Ajax请求时会报以下错误 已拦截跨源请求:同源策略禁止读取位于 http://localhost:5000/Home/gettime 的远程资源。(原因:CORS 头缺少 'Access-Control-Allo...

weixin_30439131的博客 161

api netcore 跨域支持_.Net Core Api 跨域配置

.Net Core 需要引用一个包Microsoft.AspNetCore.Cors让接口实现跨域,需要配置两个地方。一、Startup.cs这里需要配置两个地方public void ConfigureServices(IServiceCollection services){//添加cors 服务 配置跨域处理services.AddCors(options =>{options.A...

weixin_42614269的博客 1507

CORS配置不生效?10分钟快速定位并解决ASP.NET Core跨域难题

快速解决ASP.NET Core跨域难题,本文详解CORS配置不生效的常见场景与精准修复方法,涵盖预检请求处理、策略设置及中间件顺序等核心要点,助你10分钟内定位问题根源,值得收藏。

QuickTrans的博客 700

ASP.NET Core WebApi配置跨域

ASP.NET Core WebApi配置跨域引言一、开启跨域访问二、配置跨域规则二、远程跨域访问 引言 当我们在项目的额开发过程中,使用到前后端分离,而不再是传统的MVC进行开发时,我们的WebApi项目默认是没有开启跨域的,因为浏览器安全性可防止网页默认同域策略。 同域策略可防止恶意站点从另一站点读取敏感数据。 有时,你可能想要允许其他站点对你的应用进行跨域请求。 一、开启跨域访问 这里只需要注意一下:必须将对的调用 UseCors 置于 UseAuthorization之前 ,UseRoutin

qq_42799562的博客 4127
上一篇: 前端系列:ES6-ES12新语法
下一篇: Asp .Net Core 系列: 集成 Consul 实现 服务注册与健康检查
Code技术分享
博客等级 码龄7年 3327粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值