DevExtreme ODataStore Remove 方法 withCredentials 在 React 项目中不起作用 [重复]

Posted

技术标签:

【中文标题】DevExtreme ODataStore Remove 方法 withCredentials 在 React 项目中不起作用 [重复]【英文标题】:DevExtreme ODataStore Remove method withCredentials not working in React project [duplicate] 【发布时间】:2020-03-12 15:16:09 【问题描述】:

我遇到了关于从 devextreme odatastore 中删除实体的问题。

我在本地有两个项目,后端项目在 localhost:54602 上运行,前端项目在 localhost:3000 上运行(react app)

我能够在没有 CORS 问题的情况下请求数据。 (CORS 设置在后端进行)

但是当我尝试从 ODataStore 中删除一个实体并在调试模式下查看后端时

context.User.Identity.IsAuthenticated 变量更改为 false。请求失败。

Chrome 控制台输出在这里

从源“http://localhost:3000”访问“http://localhost:54602/units(3)”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:预检请求不允许重定向。

我阅读了有关that link about CORS Preflight的所有信息

我的 CORS 设置在这里。

public void ConfigureServices(IServiceCollection services)
    
        services.AddCors();
        .
        .
        .
    

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    
        .
        app.UseCors(options =>
            
                options.WithOrigins("http://localhost:3000")
                .WithMethods("GET", "POST", "PUT", "PATCH", "POST", "DELETE", "OPTIONS")
                .AllowAnyHeader()
                .AllowCredentials();
            
        );

        .
    

在反应应用程序中,我正在创建这样的 oDataStore

export default class extends React.Component   

.
.
oDataStore = new ODataStore(

  key: 'Oid',
  version: 4,
  url: 'http://localhost:54602/units',
  withCredentials : true
);

.
.

最后像这样删除调用。

this.oDataStore.remove(this.state.selectedUnit.Oid).then(
                (key) =>  
                  alert(`$key will be delete.`);
                ,
                (error) => 
                 
                  alert(`$error occured.`);
                
              );

我们会接受任何帮助。期待您的回复。

祝你有美好的一天。

【问题讨论】:

我跟踪并看到 GET 请求在后端服务器中有 cookie 标头,但 DELETE 请求没有。 GET 请求 Cookie:[Cookie, SLG_G_WPT_TO=tr; SLG_GWPT_Show_Hide_tmp=未定义; SLG_wptGlobTipTmp=未定义; .AspNetCore.Cookies = CfDJ8N0PK5yNbkJIt5AuELltrwvkU0sDD6NlU94MdqxlH3NXTFlMdGQkZKMKZU6ryRP-sRobcpZ_dtahmM1JMhG_lMXbE5iMNEz_l6E8tHYceY5h2HCK7VpTx2DTb2ksPBo4DDiMMqPsS1ZsL9HszNFOyMtJ0LPG50jqLiEQp_eGnMZ2OVJ6OJxCuCXk7SrtCuQqtspC5iPlyGrCo7L8at_cWPXkxHpzanyrQgYOJYglCn4-toqmaylabyKI4ZasNKTbV8hSKELFfzHx3a9KU4hPTC3uyK1Q8Ivg6hYH6M0oSkUfDQW64MYYvR1l-7ThupueBQ] DELETE请求尚未:(跨度> 【参考方案1】:

我在后端服务器项目中跟踪了输出。

面对这种情况,前端的DELETE请求首先发送OPTIONS请求as documented here。

我目前正在使用这样的中间件。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

   .
   .
   app.UseMiddleware<UnauthorizedRedirectMiddleware>();
   .

并像这样配置了 OPTIONS 请求。

public async Task InvokeAsync(HttpContext context)
    
        if (context.Request.Method == "OPTIONS")
        
            context.Response.Headers.Add("Access-Control-Allow-Origin", "http://localhost:3000");
            context.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
            context.Response.Headers.Add("Access-Control-Allow-Methods", "DELETE");
            context.Response.Headers.Add("Access-Control-Allow-Headers", "content-type");
            context.Response.StatusCode = (int)HttpStatusCode.OK;
            return;
        

        .
        .
        .
    

2 天没有人回答。我被搜查了。

我希望这些信息可以节省您的时间。

有一个好的编码。

【讨论】:

注意到我,***.com/questions/42168773/… 上面的链接有类似的问题和有关选项预检请求的信息。谢谢。

以上是关于DevExtreme ODataStore Remove 方法 withCredentials 在 React 项目中不起作用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Ionic2集成DevExtreme

在我的项目中安装 DevExtreme UI 组件的某些部分

如何将 Html.DevExtreme().LookupFor 列表绑定到模型

DevExtreme 图表组件

使用 Angular2 DevExtreme 显示和隐藏表单元素

DevExtreme 搭建Node.js开发环境