簡體   English   中英

嘗試使用cURL避免ASP.NET會話

[英]Trying to AVOID an ASP.NET session using cURL

我正在使用來自提供商的網絡服務,該服務提供商在預測我的需求方面有點有幫助。 他們給了我一個HTML代碼片段粘貼在我的網站上,供用戶點擊以觸發他們的服務。 我更喜歡編寫這個過程的腳本,所以我有一個php腳本,它會根據需要將cURL請求發布到同一個url。 但是,此提供程序會密切關注我的會話,並將每個新請求解釋為第一個請求的更新 ,而不是每個請求都是唯一請求。

我已經就我的問題聯系了提供商,他們已經告訴我他們的系統正在按預期工作,並且我不可能避免為每個后續的cURL請求使用相同的ASP.NET會話。 雖然我最喜歡的選擇是切換到不同的供應商,但這似乎不是一個選擇。 是否有可靠的方法來獲取每個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);

如果cURL沒有多大幫助,為什么不嘗試其他方法從腳本調用服務,如php的file()函數或file_get_contents()

如果您看到根本沒有看到任何差異,那么服務提供商可能正在使用您的IP來跟蹤您的請求。 嘗試使用一些代理進行測試。

正常的Asp.net會話由名為ASP.NET_SessionId的cookie跟蹤。 此cookie在對您的第一個請求的響應中發送。 因此,只要您的curl請求不發回這個asp.net cookie,您的每個請求都將沒有相互連接。 使用curl -c選項查看您和他們之間正在飛行的cookie。 如果您確認這是正常使用的asp.net會話,則使用cookie文件覆蓋此cookie應該有效。

服務使用會話是非常糟糕的(http有更清晰的方式來維護ReST利用的狀態)所以我不會完全排除供應商切換選項。

鑒於您正在使用的選項,似乎您已經涵蓋了您的基礎知識。 你能知道他們的會話是如何設置的嗎?

如果你知道他們如何設置一個會話,IE他們使用什么(如果它是IP或什么不是),然后你可以找出一個解決方案。 另一種選擇是嘗試將cookie設置在不同的cookie文件中:

CURLOPT_COOKIEFILE - 包含cookie數據的文件的名稱。 cookie文件可以是Netscape格式,也可以是轉儲到文件中的普通HTTP樣式的標頭。

但如果他們所做的只是檢查cookie,那么您當前的代碼應該可行。 如果你可以弄清楚cookie的名稱是什么,你可以傳遞一個空白的自定義cookie,並查看是否有效。 但是如果你能從他們那里得到關於他們的會話如何工作的信息,那將是最好的。

使用這兩行來處理會話:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM