代码之家  ›  专栏  ›  技术社区  ›  Andrew Rueckert

试图避免ASP。使用cURL的NET会话

  •  4
  • Andrew Rueckert  · 技术社区  · 14 年前

    我正在使用一个服务提供商提供的web服务,该提供商有点 有助于预测我的需求。他们给了我一个HTML片段粘贴到我的网站上,供用户点击触发他们的服务。我更喜欢编写这个过程的脚本,所以我有一个php脚本,可以在适当的情况下将cURL请求发布到同一个url。然而,这个提供者正在监视我的会话,并将每个新请求解释为 使现代化 而不是每一个都是唯一的请求。

    我已经就我的问题联系了提供商,他们甚至告诉我,他们的系统正在按预期工作,我无法避免使用相同的ASP。NET会话,用于后续的每个cURL请求。虽然我最喜欢的选择是换一家不同的供应商,但这似乎不是现在的选择。是否有可靠的方法获得新的ASP。NET会话与每个cURL请求?

    我试过以下几套 冰壶 但是,没有用:

    //initialize curl 
    $ch = curl_init($url); 
    
    //build a string out of the post_vars
    $post_str = http_build_query($post_vars);
    
    //set the necessary curl options 
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FAILONERROR, 1); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_str); 
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_COOKIESESSION, 1);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, "UZ_".uniqid());
    curl_setopt($ch, CURLOPT_REFERER, CURRENT_SITE_URL."index.php?newsession=".uniqid());
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Pragma: no-cache", "Cache-Control: no-cache"));
    
    //execute the call to the backend script, retrieve the results 
    $xmlstr = curl_exec($ch);
    
    4 回复  |  直到 14 年前
        1
  •  2
  •   Jim    11 年前

    如果cURL没有多大帮助,为什么不尝试其他方法从脚本中调用服务,比如php file() 功能,或 file_get_contents() .

    如果你看不到任何区别,那么服务提供商可能正在使用你的ip来跟踪你的请求。尝试使用代理进行测试。

        2
  •  1
  •   llevera    14 年前

    普通Asp。net会话由名为ASP的cookie跟踪。NET_SessionId。此cookie将在对第一个请求的响应中发送。所以只要你的curl请求不发回这个asp。net cookie,您的每个请求都将彼此没有连接。使用curl-c选项来查看哪些cookies在你和他们之间飞来飞去。如果您确认此cookie是正常的,则使用cookie文件覆盖此cookie应该可以工作。net会话正在这里使用。

    服务使用会话是非常糟糕的(http有更干净的方式来维护ReST利用的状态),所以我不会完全排除供应商切换选项。

        3
  •  0
  •   Jim    14 年前

    考虑到你正在使用的选项,你似乎已经涵盖了你的基本知识。你能了解他们的会话是如何设置的吗?

    如果你知道他们如何设置会话,即他们使用什么(如果是IP或不是IP),然后你就可以找到解决方法。另一个选项是尝试在不同的cookie文件中设置cookie:

    CURLOPT_COOKIEFILE——包含cookie数据的文件的名称。cookie文件可以是Netscape格式,也可以只是简单的HTTP样式的头文件。

    但如果他们只是检查cookies,那么你当前的代码应该可以工作。如果你能弄清楚cookie的名字,你可以传递一个空的定制cookie,看看它是否有效。但如果你能从他们那里得到关于他们的课程如何运作的信息,那就最好了。

        4
  •  0
  •   Nurul Ferdous    10 年前

    使用以下两行代码来处理会话:

    curl_setopt($ch, CURLOPT_COOKIEJAR, "path/to/cookies.txt"); // cookies.txt should be writable
    curl_setopt($ch, CURLOPT_COOKIEFILE, "path/to/cookies.txt");