【问题标题】:How to handle preflight request?如何处理预检请求?
【发布时间】:2021-05-11 19:38:12
【问题描述】:

我正在尝试向支持 cors 策略的不同源服务器发送发布请求。

问题是content-type:application/json.CORS 飞行前请求(OPTIONS 调用)不能是这个 Content-Type。 我还有另一个选项可以使用我的标头发送:
Access-Control-Request-Headers: content-type,deviceid,devicepassword,deviceversion

my network header

有没有办法获取数据?

我正在使用 react.js 和 asp.net core 编写的后端服务

【问题讨论】:

    标签: reactjs asp.net-core cors fetch preflight


    【解决方案1】:

    希望这能解决问题。

    public void ConfigureServices(IServiceCollection services)
    {
    
        services.AddCors(options => options.AddPolicy(Global.CORS_ALLOW_ALL_POLICY_NAME,
                builder =>
                {
                    builder.AllowAnyOrigin()
                        .AllowAnyHeader()
                        .AllowAnyMethod()
                        .AllowCredentials();
                }));
    
        services.AddMvc();
    }
    
    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }
    
        app.UseCors(Global.CORS_ALLOW_ALL_POLICY_NAME);
    
        app.UseHttpsRedirection();
        app.UseMvc();
    }
    

    【讨论】:

    • 谢谢,但我以前做过。我知道与预检有关的问题。
    【解决方案2】:

    如果传递自定义头部,则需要添加指定的请求头部。

         services.AddCors(option=>
            {
                option.AddPolicy("policyname", builder => 
                    builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod();
            });
    

    删除credentials: 'include'

    另一种方法:不要删除credentials: 'include'。在bakend中添加AllowCredentials

        services.AddCors(option=>
            {
                option.AddPolicy("policyname", builder => 
                    builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().AllowCredentials();
            });
    

    【讨论】:

    • 是的,谢谢你的观点,我添加它。 .WithExposedHeaders("Accept","Content-Type","DeviceVersion","DeviceID","DevicePassword") 但仍然 fetch 不起作用! @卡尼
    • @E.Shahri,在客户端怎么弄的,可以分享一些客户端代码吗?
    • `fetch("Url", { mode: 'cors', credentials: 'include', method: 'POST', body: JSON.stringify( { phoneNumber: Number, } ), headers: { "Accept": "application/json", "Content-Type": "application/json", "DeviceVersion": "", "DeviceID": "", "DevicePassword": "", }, })` @卡尼
    • @E.Shahri,您要将这些标头发送到 bakend 吗?
    • 是的。我应该将这些标头发送到后端@Karney
    猜你喜欢
    • 2017-06-25
    • 2016-02-17
    • 2021-09-26
    • 2014-10-31
    • 2016-03-17
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    相关资源
    最近更新 更多