C# 模拟http请求,半小时后会话过期

手动登录一个网站以后,进入其中的一个平台页面(应该是第三方的),查看后台得知这个平台页面的请求只需要一个sessionID,于是拿到这个sessionid用HttpWebRequest模拟请求,可以正常得到服务器返回的数据,但是半小时以后会返回数据提示会话过期。想做成程序可以24小时不停的请求,怎么解决这种过期呢?现在是不知道这个平台如何登录,只是通过抓包知道它是用如何请求的。

Python我会,没有学过C#不知道怎么处理。你可以去找一个模拟浏览器测试的模块,像Python就是selenium,

# python的
driver = webdriver.Edge()
driver.get(url='https://xxxxx')
driver.find_element(value='username').send_keys('xxxxx')
driver.find_element(value='password').send_keys('xxxxx')
driver.find_element(by=By.CLASS_NAME, value='yz_btn_login').click()
slenum_cookie = driver.get_cookies()
requests_cookie = ""
for item in slenum_cookie:
    requests_cookie += "%s=%s; " % (item['name'], item['value'])
driver.close()

那你需要知道的是如何获取session id

登录的时候也是有地址的 模拟请求就拿得到

这个简单,你可以加个timer定时,隔半小时就重新发post请求,或者判断状态码也可以,会话过期就断开原有连接重新请求

用谷歌的浏览器控件 模拟人工登录,检测到页面没登录就js填充模拟登录一次,只要不是太过分 还不用担心一些常规反爬虫问题

可以试试反爬技术,比如通过代理换ip,还有换请求头,把cookie和user agent和referer等等……还有时间间隔逐渐增加

半个小时请求登录一次 换新的ID
或者每次查询 都进行一次登录

1.将http的request的keepAlive设置为false //如果不是必须的要keepalive的,那么就要设置KeepAlive为false:

2.修改System.Net.ServicePointManager.DefaultConnectionLimit = 50; //这个值默认是2,根据自己的情况修改

3.释放资源(比如HttpWebReques对象和HttpWebResponse对象)

if (resp != null)
{undefined
resp.Close();
}
if (req != null)
{undefined
req.Abort();
}

4.在创建HttpWebReques对象之前,强制回收垃圾

System.GC.Collect();

5.Http的GET请求时,不要手动设置ContentLength的值

POST方法中,的确是要手动填充数据和算出数据大小,然后手动给ContentLength赋值的。

也可以25分钟发一个请求

看session设置的是多久,以及他是如何设置session id的