.NET人字拖
万丈高楼平地起,我正在努力筑地基...
随笔- 133  文章- 0  评论- 606 
博客园  社区  首页  新随笔  联系  管理  订阅 订阅

通过COM来获取CookieContainer,简单又好用

  最近在做一个通过HttpWebRequest来实现登陆和自动发信息的小软件,虽然还没有实现,但是今天从一个老外的网站上看到了一个获取CookieContainer很好的方法,拿出来共享一下,这是我看到过代码最少而且很不错的了。
 1using System;
 2using System.Runtime.InteropServices;
 3using System.Text;
 4using System.Net;
 5
 6namespace NExplus.NSiter
 7{
 8    /**//// <summary>
 9    /// 获取Cookie的方法类。
10    /// </summary>

11    public class CookieManger
12    {
13        /**//// <summary>
14        /// 通过COM来获取Cookie数据。
15        /// </summary>
16        /// <param name="url">当前网址。</param>
17        /// <param name="cookieName">CookieName.</param>
18        /// <param name="cookieData">用于保存Cookie Data的<see cref="StringBuilder"/>实例。</param>
19        /// <param name="size">Cookie大小。</param>
20        /// <returns>如果成功则返回<c>true</c>,否则返回<c>false</c>。</returns>

21        [DllImport("wininet.dll", SetLastError = true)]
22        public static extern bool InternetGetCookie(
23          string url, string cookieName,
24          StringBuilder cookieData, ref int size);
25        /**//// <summary>
26        /// 获取当前<see cref="Uri"/>的<see cref="CookieContainer"/>实例。
27        /// </summary>
28        /// <param name="uri">当前<see cref="Uri"/>地址。</param>
29        /// <returns>当前<see cref="Uri"/>的<see cref="CookieContainer"/>实例。</returns>

30        public static CookieContainer GetUriCookieContainer(Uri uri) {
31            CookieContainer cookies = null;
32
33            // 定义Cookie数据的大小。
34            int datasize = 256;
35            StringBuilder cookieData = new StringBuilder(datasize);
36
37            if (!InternetGetCookie(uri.ToString(), null, cookieData,
38              ref datasize)) {
39                if (datasize < 0)
40                    return null;
41
42                // 确信有足够大的空间来容纳Cookie数据。
43                cookieData = new StringBuilder(datasize);
44                if (!InternetGetCookie(uri.ToString(), null, cookieData,
45                  ref datasize))
46                    return null;
47            }

48
49
50            if (cookieData.Length > 0) {
51                cookies = new CookieContainer();
52                cookies.SetCookies(uri, cookieData.ToString().Replace(';', ','));
53            }

54            return cookies;
55        }

56
57    }

58}
  是不是相当简单阿,希望对大家有一点用处。

关于作者:网魂小兵

文章出处:http://xdotnet.cnblogs.com

本文可以随意转载,摘抄等非商业用途。

为了尊重作者成果,在转载和摘抄的时候请留下作者名称和出处。

绿色通道:好文要顶关注我收藏该文与我联系
posted @ 2007-01-08 18:38 网魂小兵 阅读(4376) 评论(19) 编辑 收藏
1360113
#1楼[楼主]网魂小兵       在2007-01-08 18:42说:
            string url = "http://localhost/index.php";
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
                req.Method = "Post";
                req.Accept=@"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
                req.ContentType = "application/x-www-form-urlencoded";
                req.Referer = @"http://localhost/index.php?module=user&action=login";
                req.ProtocolVersion = new Version("1.1");
                req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 2.0.50727)";
                req.KeepAlive = true;
                string data = this.PostString();
                byte[] buffer = Encoding.UTF8.GetBytes(data);
                req.ContentLength = buffer.Length;
                using (Stream reqst = req.GetRequestStream()) {
                    reqst.Write(buffer, 0, buffer.Length);
                }
                using (HttpWebResponse res = (HttpWebResponse)req.GetResponse()) {
                    string result;
                    using (Stream resst = res.GetResponseStream()) {
                        result = new StreamReader(resst).ReadToEnd();
                    }
                    webBrowser1.DocumentText = result;
                }
不知道为什么用这个冬冬老是说我的电脑不支持Cookie而登陆失败,有没有人做过这样的例子,给小弟说说,谢谢啦!

 回复 引用 查看   
#2楼工业酒精[匿名][未注册用户] 在2007-01-08 19:21说:
不好用的,有缺点

我用过,最后还是把cookies写成string直接插到http head里面

HWRequest.Headers.Add("Cookie", CookieString);


 回复 引用   
#3楼7ero       在2007-01-08 19:52说:
老大,.net有其他方法能实现的,不用COM吧
 回复 引用 查看   
#4楼[楼主]网魂小兵       在2007-01-08 20:30说:
@工业酒精[匿名]

能否说清楚点,我就是这个Cookie一值没办法!!!

@7ero

呵呵,可以!

 回复 引用 查看   
#5楼abc[匿名][未注册用户] 在2007-01-09 00:19说:
com的东西,呵呵,不懂
 回复 引用   
#6楼S.Sams       在2007-01-09 09:43说:
加上这个就可以直接存Cookies啦
HttpWebRequest myHttpWebRequest = WebRequest.Create(url) as HttpWebRequest;
myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
myHttpWebRequest.Method = "GET";
myHttpWebRequest.Timeout = 60 * 1000;
if (myCookieContainer == null)
{
myCookieContainer = new CookieContainer();
}
myHttpWebRequest.CookieContainer = myCookieContainer;



/// <summary>
/// 设置获取页面Session/Cookies数据
/// </summary>
private CookieContainer MyCookieContainer
{
set { myCookieContainer = value; }
get { return myCookieContainer; }
}

其实也未尝一定要用Com

 回复 引用 查看   
#7楼韦恩卑鄙       在2007-01-09 10:36说:
就是个写http头的问题 用不用com都随便
 回复 引用 查看   
#8楼[楼主]网魂小兵       在2007-01-09 12:37说:
@S.Sams

这个我也用过但是老是出现:

你的浏览器不支持Cookie,所以无法登陆...

从截获的Header中,直接IE登陆就有Cookie,而我也通过HttpWebRequest.Header加入了Cookie字符串,好像发送的Header却没有这个咚咚,这是怎么回事?能否指教一下,谢谢!

 回复 引用 查看   
#9楼[楼主]网魂小兵       在2007-01-09 12:38说:
@韦恩卑鄙

说的也是哦,呵呵!

 回复 引用 查看   
#10楼JoeLee[未注册用户] 在2007-01-09 20:49说:
这个其实不是真正的COM。只是通过COM封送处理而已。
如果真的是COM的话。就不需要DllImport了。
这个WIN32 API我也是看了你的BLOG才知道。WIN32 API都是用C语言写的。传统的DLL。

其实MSDN上有这个API的很详细的说明,Remark里说的很清楚,这个API不访问网络,直接从windows/cookies里取值。其他自己看吧。对保存在内存中的会话也有说明。

 回复 引用   
#11楼[楼主]网魂小兵       在2007-01-09 21:27说:
@JoeLee

多谢指教,.NET开发人员一般也比较少用到这些。

 回复 引用 查看   
#12楼JoeLee[未注册用户] 在2007-01-10 15:20说:
不好意思。其实是Interop封送。我写成COM封送了。
因为COM有coclass等接口声明。所以在.net下可以直接通过添加引用来使用的。不过和COM交互不爽的是。引用COM时。COM里数组对象的索引是从1开始的。而不是0。

我也是做.Net的。可惜公司80%都是做C++的。每天和他们交流的也都是C和C++的东东。哎。

 回复 引用   
#13楼huobazi[未注册用户] 在2007-01-10 16:03说:
有用,谢谢~~
 回复 引用   
#14楼A.Z[匿名][未注册用户] 在2007-01-11 11:14说:
这个东东太原始了吧,我N年前封装的类库可以很自然的处理http post字符编码,根据response document头和raw data猜测编码,自然的重写m$的webclient,cookies的理解可以看看S.Sams的回复,特别的我还实现了multiple头部。
 回复 引用   
#15楼[楼主]网魂小兵       在2007-01-11 18:15说:
@A.Z[匿名]

我不明白的是为什么在IE里能直接登陆成功,但是我在我的Windows form应用程序中Http编码为OK 200,但是我用WebBrowser控件装载返回的字符串,却老是出现"你的浏览器不支持Cookie,所以不能登陆..."。到现在还是没有解决,相当郁闷阿!

我也检查了我的Cookie都打开了,如果不打开在IE里也差不多了!

 回复 引用 查看   
#16楼状元       在2007-04-17 16:24说:
マ 是不是你的程序目录的权限不够,COOKIE写不进去
 回复 引用 查看   
#17楼小兵[未注册用户] 在2007-04-18 12:47说:
@状元

这个我没有考虑到啊,谢谢你的提醒!

 回复 引用   
#18楼威客部落[未注册用户] 在2007-11-09 16:53说:
不错,学习了!
 回复 引用   
#19楼pc@mye.cn[未注册用户] 在2008-11-03 21:42说:
太棒了,
别人不理解,
我很清楚他的意义.

 回复 引用   
注册用户登录后才能发表评论,请 登录 或 注册,返回博客园首页。
首页博问闪存新闻园子招聘知识库
最新IT新闻:
· 最想要的Entity Framework功能
· 专访Jeffrey Richter:Windows 8是微软的重中之重
· 《福布斯》:谷歌进军硬件产品 难撼动苹果地位
· 美国空军拟最多购买1.8万台iPad 2
· 分析称专利之争让谷歌苹果两败俱伤
» 更多新闻...
最新知识库文章:
· 高级编程语言的发展历程
· 如何学习一门新的编程语言?
· 学习不同编程语言的重要性
· 为什么我喜欢富于表达性的编程语言
· 计算机专业的女生为什么要学编程
» 更多知识库文章...

China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
Copyright ©2012 网魂小兵
Name:
网魂小兵
Addr:
福建厦门
MSN:
myxbing#hotmail.com
昵称:网魂小兵
园龄:5年11个月
粉丝:23
关注:0

搜索

 
 

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论
  • 我的标签
  • 更多链接

我的标签

  • directx11(6)
  • direct3d 11(6)
  • 游戏编程(6)
  • c/c++(6)
  • vs2010(5)
  • wpf(4)
  • openssl(2)
  • direct3d坐标系(2)
  • vs2008(2)
  • xaml(2)
  • 更多

随笔分类(170)

  • AJAX(doc)(8)
  • ASP.NET(46)
  • C#3.0+(13)
  • C/C++(27)
  • CommunityServer(7)
  • Database(11)
  • Enterprise Library (7)
  • JavaScript(10)
  • ServerContols(7)
  • UML(1)
  • VC++/MFC(8)
  • WPF/SilverLight(6)
  • XNA Game(2)
  • 翻译(4)
  • 今天我当家(11)
  • 设计模式(2)

随笔档案(133)

  • 2012年2月 (3)
  • 2011年8月 (3)
  • 2011年7月 (7)
  • 2011年5月 (1)
  • 2011年4月 (2)
  • 2011年2月 (1)
  • 2010年1月 (1)
  • 2009年3月 (3)
  • 2009年1月 (8)
  • 2008年3月 (1)
  • 2008年2月 (3)
  • 2008年1月 (1)
  • 2007年11月 (4)
  • 2007年10月 (3)
  • 2007年9月 (9)
  • 2007年8月 (3)
  • 2007年7月 (2)
  • 2007年6月 (9)
  • 2007年5月 (9)
  • 2007年4月 (14)
  • 2007年3月 (6)
  • 2007年2月 (3)
  • 2007年1月 (15)
  • 2006年12月 (9)
  • 2006年11月 (2)
  • 2006年10月 (4)
  • 2006年9月 (7)

文章分类

  • Asp.Net(.NET)

I Like Links

  • ASP.NET
  • Codeplex
  • XNADevelopment

My Friend's Blog

  • 陆巍杰
  • 孙小雨
  • 探丫头
  • 网络安全&Linux

积分与排名

  • 积分 - 283912
  • 排名 - 248

最新评论

阅读排行榜

评论排行榜