【问题标题】:How to use two calls on the same session in flurl如何在flurl中的同一会话中使用两个调用
【发布时间】:2021-11-03 16:43:59
【问题描述】:

我想使用 GetAsync 获取令牌,然后在 POST 函数中使用该令牌。 Get 和 Post 都应该在同一个会话中进行。

这里是 GET 函数:

 var result = await SA_BaseUrl
            .AppendPathSegments("ProdOrderConfSet")
            .WithBasicAuth("UserName", "Password")
            .WithHeader("Accept","application/json")
            .WithHeader("X_CSRF_Token", "fetch")
            .GetAsync();

        IReadOnlyNameValueList<string> headers = result.Headers;
        string X_CSRF_Token = headers.FirstOrDefault(h => h.Name == "x-csrf-token").Value;

和发布功能:

 var result2 = await SA_BaseUrl
                .AppendPathSegments("ProdOrderConfSet")   
                .WithBasicAuth("UserName", "Password")
                .WithHeader("Accept","application/json")
                .WithHeader("Content-Type", "application/json")
                .WithHeader("X_CSRF_Token", X_CSRF_Token)
                .PostJsonAsync(workStep)
                .ReceiveJson<DANTESAP_ProdWorkStep>();

运行上面的代码,我得到:

403 Forbidden, CSRF token validation failed

如何在同一个会话中运行这两个函数?

很遗憾,没有关于我尝试访问的服务的文档。但是当我使用 Postman 时,它可以正常工作。我不知道我的 C# 代码中缺少什么(或错误)。

这里是获取令牌的 Get 函数:

这里是使用从 GET 函数中提取的 csrf 令牌的 POST 函数:

【问题讨论】:

  • 你想在这里与什么服务交互?你能链接到他们的文档吗?没有它,这个问题就无法回答,因为 CSRF 令牌必须如何传输没有标准。

标签: session flurl


【解决方案1】:

获取 cookie 并重新使用它们:

 var result = await SA_BaseUrl
            .AppendPathSegments("ProdOrderConfSet")
            .WithBasicAuth("UserName", "Password")
            .WithHeader("Accept","application/json")
            .WithHeader("X_CSRF_Token", "fetch")
            .WithCookies(out var jar)
            .GetAsync();

...

var result2 = await SA_BaseUrl
                    .AppendPathSegments("ProdOrderConfSet")   
                    .WithBasicAuth("UserName", "Password")
                    .WithHeader("Accept","application/json")
                    .WithHeader("Content-Type", "application/json")
                    .WithHeader("X_CSRF_Token", X_CSRF_Token)
                    .WithCookies(jar)
                    .PostJsonAsync(workStep)
                .ReceiveJson<DANTESAP_ProdWorkStep>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2023-01-26
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多