2010-08-19 78 views
4

我正在使用来自提供者的网络服务,该提供者正在对进行太有助于预测我的需求。他们给了我一个HTML片段来粘贴在我的网站上,供用户点击触发他们的服务。我宁愿编写这个过程的脚本,所以我有一个php脚本,将cURL请求发布到相同的URL,如适用。但是,此提供程序正在查看我的会话,并将每个新请求解释为第一个请求的更新,而不是每个都是唯一的请求。尝试使用cURL避免ASP.NET会话

关于我的问题,我已经联系了提供商,他们竟然告诉我他们的系统按预期工作,并且我不可能避免每个人都使用相同的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

您是否尝试过手动将'CURLOPT_COOKIE'设置为空字符串?或者可能指定'CURLOPT_COOKIEFILE'和'CURLOPT_COOKIEJAR',并在请求之间解除文件链接? – grossvogel 2010-08-29 16:03:09

回答

0

好给您正在使用的选项,看来你已经把你的基础知识。你能找出他们的会话是如何设置的吗?

如果你知道他们如何设置会话,IE使用什么(如果它是IP或什么),然后你可以找出解决办法。另一个选项是尝试将Cookie设置为不同的Cookie文件:

CURLOPT_COOKIEFILE - 包含cookie数据的文件的名称。 cookie文件可以是Netscape格式,也可以是简单的HTTP风格的头文件转储到文件中。

但是,如果他们所做的只是检查Cookie,您当前的代码应该可以工作。如果你能弄清楚cookie的名字是什么,你可以传递一个空白的自定义cookie,看看是否有效。但是,如果你能从他们那里获得关于他们会话工作方式的信息,那最好。

0

使用这两个行处理会话:

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

普通Asp.net会议是由一种叫做ASP.NET_SessionId的cookie跟踪。这个cookie是在对第一个请求的响应中发送的。所以只要你的curl请求不发回这个asp.net cookie,你的每一个请求都不会互相连接。使用curl -c选项可查看您和他们之间正在飞行的饼干。如果您确认这里使用的是正常的asp.net会话,则应使用cookie文件覆盖此cookie。

对于使用会话的服务来说很差(http有更多清洁的方式来维护ReST利用的状态),所以我不会完全排除供应商切换选项。

+0

检查完我的cookies后,似乎我从一开始就正确地做了所有事情。我每次都收到不同的ASP.NET_SessionId。 我正在推销供应商开关。这些人是合作的噩梦。 – 2010-09-01 16:50:02

2

如果cURL帮助不大,为什么不尝试其他方法来调用脚本中的服务,如php的file()函数或file_get_contents()

如果您看不到任何区别,那么服务提供商可能会使用您的IP来跟踪您的请求。尝试使用一些代理进行测试。

+0

经过进一步测试,似乎他们实际上并未使用ASP_NET的会话,这很奇怪,因为我也相当肯定他们没有使用我的IP。如果我将GET参数输入到Chrome浏览器和Chrome(隐私模式)浏览器的地址栏中,它会给我两个不同的会话。如果我在浏览器中输入GET参数,请清除所有Cookie和缓存文件,然后在同一浏览器中再次输入它们,我的会话仍然存在。我不知道他们是如何管理这个技巧的...... – 2010-09-01 16:53:23

+0

我想这看起来是基于get参数和浏览器标识字符串来创建会话。这就是为什么它可能在不同浏览器的相同参数上创建不同的会话。你可以尝试使用命令行curl来模拟这种行为并找出是否是这种情况。 – Samnan 2010-09-09 08:12:23