我在 REST 调用方面遇到了一个奇怪的问题。在服务器端,我有带有 IIS 的 Windwos 机器
我有一个 ID 列表(大约 8000 个 - 我也尝试过使用较少的记录),对于每个 ID,我需要执行 3 个不同的 REST 调用(2 个 GET 和一个 PUT)。
我的身份验证是在开始时进行的,我会获取会话 cookie,然后将其存储起来以供所有进一步的调用进行授权。最后我注销。
现在问题来了。在 Windows 上使用 C#,上述逻辑按预期工作。在 Linux bash 上,我有时会完全随机地收到 401 Unauthorized 错误。因此它与任何特定 ID 或 REST 调用无关。下一次使用相同 cookie 的调用再次成功。您知道什么可能导致该问题吗?客户在 LINUX 上使用 JAVA,他们也有同样的问题。
我尝试在通话之间设置一秒钟的睡眠时间,但没有成功。
我在 IIS 上启用了完整跟踪,在 bash 调用上启用了详细跟踪,在 IIS 上我根本看不到那些 401 请求,而 verbose 清楚地指示 401。如果我不在一开始就进行身份验证,那么所有不成功的尝试都会很明显在 IIS 日志中可见。
#!/bin/bash
#--------------------- LOGIN CALL ---------------------
"" > output.txt
curl -s -c cookie.txt -X POST "https://www.myapi.si/auth/apphost" -H "Content-Type: application/json" -d '{"authString":"Module=DialogUser;User=userTest;Password=Password123."}'
#--------------------- CALL GET ---------------------
objectId=("104569", "105079", "103103", "97267", "106385")
for item in "${objectId[@]}"; do
#--------------------- CALL GET CCCEmployeeDataSlim ---------------------
echo "$item"
echo "$item" >> output.txt
myDate=$(date -u +"%H:%M:%S")
echo "$myDate" >> output.txt
curl -s -b "cookie.txt" -X GET --no-buffer "https://www.myapi.si/api/entities/GetObjectData?where=objectId='$item'&loadType=BulkReadOnly" -H "Accept: application/json" >> output.txt
sleep 1
echo "" >> output.txt
echo "....................." >> output.txt
#--------------------- CALL GET CCC_IsAccountValid ---------------------
curl -s -b "cookie.txt" -X PUT -H "Content-Type: application/json" --no-buffer "https://www.myapi.si/api/script/IsAccountValid" -d '{"parameters": ["'$item'","2024-9-19"]}' >> output.txt
sleep 1
echo "" >> output.txt
echo "....................." >> output.txt
#--------------------- CALL GET CCCSecondaryIdentities ---------------------
curl -s -b "cookie.txt" -X GET --no-buffer "https://www.myapi.si/api/entities/GETSecondaryIdentities?where=objectId='$item'&loadType=BulkReadOnly" -H "Accept: application/json" >> output.txt
sleep 1
echo "" >> output.txt
echo "--------------------- NEXT ---------------------" >> output.txt
done
您可以尝试以下操作来解决问题。