C#利用wininet获取网页Cookie

本文介绍了如何利用C#的WinInet API来获取网页的Cookie,包括为何使用WinInet,Cookie与Session的区别,以及详细实现步骤。通过比较,展示了WinInet能获取HttpOnly Cookie,这是常规方法无法做到的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WinInet

WinInet(“Windows Internet”)API帮助程序员使用三个常见的Internet协议,这三个协议是用于World Wide Web万维网的超文本传输协议(HTTP:Hypertext Transfer Protocol)、文件传输协议(FTP:File Transfer Protocol)和另一个称为Gopher的文件传输协议。
WinInet函数的语法与常用的Win32 API函数的语法类似,这使得使用这些协议就像使用本地硬盘上的文件一样容易。
1、WinInet 是一个网络编程接口,包含了 Internet 底层协议 HTTP,FTP。
2、借助 WinInet 接口,可不必去了解 Winsock、TCP/IP 和特定 Internet 协议
的细节就可以编写出高水平的 Internet 客户端程序。
3、WinInet 为 HTTP、FTP 提供了统一的函数集,也就是 Win32 API 接口。
4、WinInet 简化了 HTTP、FTP 协议的编程,可轻松地将 Internet 集成到应用程序中。

Cookie

cookie的概念与作用请查看该链接:
https://www.cnblogs.com/andy-zhou/p/5360107.html
只记录一下cookie与session的区别
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

实现

一、打开网页

窗体添加webBrowser组件

private void btn_Open_Click(object sender, EventArgs e)
        {
            this.webBrowser1.Navigate(this.txt_url.Text);//打开网页
        }

二、定义flag和调用API

从托管代码中访问非托管DLL函数之前,需要知道该函数的名称以及该DLL的名称,然后为DLL的非托管函数编写托管定义。
它将用到static和extern修饰符,此类型的公共静态成员对于多线程操作是安全的。DllImport属性提供非托管DLL函数的调用信息。

internal sealed class NativeMethods
    {
        #region enums

        publ
WinINet是Windows操作系统中内置的一个网络库函数集,用于处理HTTP协议,包括获取和设置Cookie。在WinINet API中,你可以通过以下几个步骤来获取HTTP响应头中的Cookie: 1. **初始化WinINet**: 首先,你需要创建`INTERNET全局变量`,如`HINTERNET hSession`, `HINTERNET hInternet`, 然后使用` InternetOpenA()` 函数打开一个会话。 2. **建立连接**: 使用`InternetConnect()` 函数连接到服务器,并指定你想从其获取Cookie的URL。 3. **发送请求**: 使用`HttpOpenRequest()` 创建一个HTTP请求,设置相应的选项,如` INTERNET_FLAG_RELOAD` 和 `INTERNET_FLAG_PASSIVE`,以便获取最新的信息。 4. **发送GET请求**: 调用`InternetSendRequest()` 来发送一个GET请求到服务器。 5. **接收响应头**: 使用`InternetReadResponseHeaders()` 获取服务器的响应头,其中包含Cookie信息。注意这个函数返回的是二进制数据,需要解析才能提取文本形式的Cookie。 6. **查找Cookie**: 在响应头中找到"Set-Cookie"字段,它通常包含一个或多个Cookie字符串。可以遍历这些字符串,从中提取出名称和值。 7. **释放资源**: 所有操作完成后,记得关闭连接和清理所有分配的内存,比如`InternetCloseHandle()` 函数。 ```cpp // 示例代码片段 HINTERNET session = InternetOpen(NULL, ...); if (session) { HINTERNET internet = InternetOpenUrl(session, "http://example.com", ..., ...); if (internet) { // 接下来读取响应头并提取Cookie... InternetQueryOption(internet, ...); // 可能需要查询选项来得到Cookie InternetCloseHandle(internet); } InternetCloseHandle(session); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值