我正在使用来自提供商的网络服务,该提供商有点太有助于预测我的需求。他们给了我一个HTML代码片段粘贴在我的网站上,供用户点击以触发他们的服务。我更喜欢编写这个过程的脚本,所以我有一个php脚本,它会根据需要将cURL请求发布到同一个url。但是,此提供程序会密切关注我的会话,并将每个新请求解释为第一个请求的更新,而不是每个请求都是唯一请求。
我已经就我的问题联系了提供商,他们已经告诉我他们的系统正在按预期工作,并且我不可能避免每个后续使用相同的ASP.NET会话cURL请求。虽然我最喜欢的选择是切换到不同的供应商,但这似乎不是一个选择。是否有可靠的方法来获取每个cURL请求的新ASP.NET会话?
我尝试过以下 CURLOPT 的设置,但无济于事:
//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);
答案 0 :(得分:2)
如果cURL没有多大帮助,为什么不尝试其他方法来调用脚本中的服务,例如php的file()
函数或file_get_contents()
。
如果您发现根本没有看到任何差异,那么服务提供商可能会使用您的IP来跟踪您的请求。尝试使用一些代理进行测试。
答案 1 :(得分:1)
正常的Asp.net会话由名为ASP.NET_SessionId的cookie跟踪。此cookie在对您的第一个请求的响应中发送。因此,只要您的curl请求不发回这个asp.net cookie,您的每个请求都将没有相互连接。使用curl -c选项查看您和他们之间正在飞行的cookie。如果您确认这是正常使用的asp.net会话,那么使用cookie文件覆盖此cookie应该有效。
服务使用会话是非常糟糕的(http有更清晰的方法来维护ReST利用的状态)所以我不会完全排除供应商切换选项。
答案 2 :(得分:0)
考虑到您正在使用的选项,您似乎已经涵盖了基础知识。你能知道他们的会话是如何设置的吗?
如果你知道他们如何设置会话,IE他们使用什么(如果它是IP或什么不是),那么你可以找出解决方法。另一个选择是尝试将cookie设置在不同的cookie文件中:
CURLOPT_COOKIEFILE - 包含cookie数据的文件的名称。 cookie文件可以是Netscape格式,也可以是转储到文件中的普通HTTP样式的标题。
但如果他们所做的只是检查你的当前代码应该有效。如果你可以弄清楚cookie的名称是什么,你可以传递一个空白的自定义cookie,并查看是否有效。但是如果你能从他们那里得到关于他们的会话如何工作的信息,那将是最好的。
答案 3 :(得分:0)
使用这两行来处理会话:
curl_setopt($ch, CURLOPT_COOKIEJAR, "path/to/cookies.txt"); // cookies.txt should be writable
curl_setopt($ch, CURLOPT_COOKIEFILE, "path/to/cookies.txt");