Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#HttpClient在两个请求之间保持PHP会话的活动状态_C#_Php_Session_Dotnet Httpclient_Flurl - Fatal编程技术网

使用C#HttpClient在两个请求之间保持PHP会话的活动状态

使用C#HttpClient在两个请求之间保持PHP会话的活动状态,c#,php,session,dotnet-httpclient,flurl,C#,Php,Session,Dotnet Httpclient,Flurl,我想知道是否有可能在两个请求之间保持PHP会话的活动状态 我使用以下方式处理请求: 在PHP部分(API)中: 但出于某种原因,每次我执行下一步(Post)时,api都会返回没有任何会话正在运行的消息 正如你在这里看到的: 我一直在读,所有的答案都是一样的,我必须用饼干,饼干做什么?存储服务器应该保留的秘密?我需要知道如何在同一个会话中处理两个请求,或者至少在可能的情况下,因为我不想使用MySQL(带有ID系统,即),我更喜欢保持它的简单性。HTTP是一个无状态协议,这是“保持会话活动”的唯一

我想知道是否有可能在两个请求之间保持PHP会话的活动状态

我使用以下方式处理请求:

在PHP部分(API)中:

但出于某种原因,每次我执行下一步(Post)时,api都会返回没有任何会话正在运行的消息

正如你在这里看到的:


我一直在读,所有的答案都是一样的,我必须用饼干,饼干做什么?存储服务器应该保留的秘密?我需要知道如何在同一个会话中处理两个请求,或者至少在可能的情况下,因为我不想使用MySQL(带有ID系统,即),我更喜欢保持它的简单性。

HTTP是一个无状态协议,这是“保持会话活动”的唯一方法是在查询字符串中提供会话标识符,或者通过包含作为第一个身份验证请求的一部分返回的cookie来提供会话标识符

这是用户从web浏览器或甚至在cURL中访问web应用程序的典型范例

从SOAP时代到现在,大多数API的设置都不同。他们让你对每个请求进行身份验证。只是在如何使用它们方面更加实用。。。从服务器端代码或使用Xhr客户端

例如,现在使用身份验证是一种常见的方法。您可以向最终用户公开带有签名令牌的URI,并且不必担心可能的重播攻击

我想你应该读这篇优秀的文章,而不是我试图解释: 当涉及到
会话
cookie
时,PHP中有很多秘密,值得查看手册中与这两个会话相关的INI设置部分

好的,那么API是PHP代码,对吗

session_start()创建一个会话,或根据该会话恢复当前会话 通过GET或POST请求传递的会话标识符,或通过 饼干

好的第一步可能是通过web浏览器向API发出请求,然后查看响应,您是否看到服务器发送的cookie

在对API的后续请求中,您是否看到正在使用这些Cookie?我们假定不会要求您重新验证?这就是要点。同样,根据API cookie会话的性质,可能不是最好的方法

所以,看起来您使用的HTTP包装器中添加了对cookies的支持


可能是一种更本土化的方法

当您使用web应用程序进行身份验证时,将创建一个会话。该会话由客户端跨请求维护,包括后续请求中的那些cookie(是的,cookie中可能有会话标识符)。也许看一个卷曲饼干罐的例子?哦,它是相反的,甚至更好。这里有一个例子:呃,不得不把这个问题重读几遍。。。API是如何处理身份验证的?谢谢@ficuscr我读了你在cookie中提到的关于ID的内容,以及它在后续请求中的存在,但我不明白我的可能性是什么,这个ID就像人们回答说,使用这个ID,你可以从上一次会话中获取数据。尝试将其更改为:使用(FlurlClient客户端=新建FlurlClient().EnableCookies())@DavidMoore这只启用cookie,但我真的不知道如何使用它们来保持会话活动或创建标识系统。因此,如果不使用标识符,就无法实现这一点,SQL还有其他选择,因为我仍然不理解cookie中的标识符是如何工作的,如果您提供一个示例,它将我很好。是的,我正在学习如何使用JWT,另外,我发布了一个关于C#的JOSE-JWT实现的问题,你也可以看到项目标题。谢谢!!我认为这是理所当然的,很多年前从VB转向web开发,有一些范式的转变。强烈建议养成检查请求和客户端和服务器之间的响应。Wireshark或至少是“浏览器工具”。我将尝试在我的回答中提供一个更好的示例。
    public const string ApiUrl = "http://localhost/z/api.php";

    public static string MethodName()
    {
        using (FlurlClient client = new FlurlClient())
        {
            string res = client.HttpGet(string.Format("{0}?action={1}", ApiUrl, "captcha"), true);

            //Some actions...

            return client.HttpPost(ApiUrl, new { action = "resolve-captcha", input = r }, false);
        }
    }

    public static string HttpPost(this FlurlClient client, string url, object data, bool keepalive = false)
    {
        return client.Request(url).PostUrlEncodedAsync(data).ReceiveString().GetAwaiter().GetResult();
    }

    public static string HttpGet(this FlurlClient client, string url, bool keepalive = false)
    {
        return client.Request(url).GetStringAsync().GetAwaiter().GetResult();
    }
//if isset $_GET then switch action key...
case "captcha":
    if (session_status() == PHP_SESSION_NONE)
        session_start();

    $_SESSION['phrase'] = "hello";
    break;

//if isset $_POST then switch action key...
case "resolve-captcha":
    $secret = @$_SESSION["phrase"];

    if(session_status() == PHP_SESSION_NONE)
        die("No session!");
    else
        $coreData["secret"] = $secret;

    $input = @$_POST["input"];
    $coreData["valid"] = $input === $secret;
    break;