用WebRequest获取Cookies 请问,怎么获取这个URL的Cookies呢?http://www.gdhzcgs.com/images/again_button.gif 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.gdhzcgs.com/images/again_button.gif?这是嘛意思!http://www.gdhzcgs.com/cookiesname?123传递过去,解析参数 这个是别人网站的一个URL,我想直接通过这个URL获取它的Cookies呀 #region Cookies解析 /// <summary> /// 把服务器返回的Set-Cookie标头信息翻译成 /// <para>能放在Cookie标头上的信息</para> /// </summary> /// <param name="CookieStr">Set-Cookie标头信息</param> /// <returns></returns> public string ParseSetCookie(string CookieStr) { if (CookieStr.Contains("=") && CookieStr.Contains(";"))//合法性验证 { string[] oneCookie = CookieStr.Split(';'); string returnmsg = ""; string onename = ""; foreach (string one in oneCookie) { string ifThereisAComment = one; if (ifThereisAComment.StartsWith(",")) { //修复一个Bug:如果一个标头上只有一个Cookie,则解析出来的相应值之前会多一个逗号。 ifThereisAComment=ifThereisAComment.Substring(1);//截掉开头的逗号 } onename = ParseOneNameAndValue(ifThereisAComment);//判断是否有逗号 returnmsg += onename; } return returnmsg; } else { return ""; } } /// <summary> /// 从数组中查找指定的值,并返回其Index /// </summary> /// <param name="Value">查找什么?</param> /// <param name="Source">在哪个数组中找?</param> /// <returns>Index或-1</returns> public int FindIndex(string Value,string[] Source) { for (int i = 0; i < Source.Length; i++) { if (Value == Source[i]) { return i; } } return -1; } /// <summary> /// 判断一个Name=Value的值是不是一个真正的Cookies /// <para>若是两个Cookies,则把两个Cookies用分号隔开;</para> /// <para>不是,则返回输入的NameAndValue值。</para> /// </summary> /// <param name="NameAndValue">Cookies Name=Value</param> /// <returns></returns> public string ParseOneNameAndValue(string NameAndValue) { if (!NameAndValue.Contains("=")) { return ""; } string returnmsg = ""; if (NameAndValue.Contains(","))//有逗号 { foreach (string one in NameAndValue.Split(',')) { if (one.Contains("=") && (!NameAndValue.StartsWith(one)))//逗号旁有等号且不是第一个,说明逗号是分隔两个Set-Cookie标头的 { string[] indexArr = NameAndValue.Split(','); int index = FindIndex(one, indexArr); string one_s = ""; for (int i = index; i < indexArr.Length; i++) { one_s += indexArr[i]; } returnmsg += ParseOneNameAndValue(one_s);//判断后面那一堆字符是不是一个Cookie } else//不是标头分隔 { returnmsg += isPathDomainOrDate(NameAndValue); } } } else//没有逗号,那就是货真价实的一个Cookie。 { returnmsg += isPathDomainOrDate(NameAndValue); } return returnmsg; } /// <summary> /// 检测Name=Value是不是服务器Set-Cookie标头里的path、domain和过期日期 /// <para></para><para>有则返回空字符串,以去掉那些不能放在Cookie标头上的信息</para> /// </summary> /// <param name="input"></param> /// <returns></returns> public string isPathDomainOrDate(string input) { if (input.Trim().ToLower().StartsWith("path=") || input.Trim().ToLower().StartsWith("domain=") || input.Trim().ToLower().StartsWith("expires=")|| input.Trim().ToLower().StartsWith("max-age=") || input.Trim().ToLower().StartsWith("version=") || input.Trim().ToLower().StartsWith("httponly")) { //把Path、Domain和过期日期去掉 return ""; } else { return input + ";"; } } #endregionHttpWebRequest req=(HttpWebRequset)WebRequest.Create("http://www.baidu.com/");HttpWebResponse resp=(HttpWebResponse)req.GetResponse();string Cooooooooooookies=ParseSetCookie(resp.Headers[HttpWebResponseHeaders.SetCookie]);调用:HttpWebRequest req=(HttpWebRequset)WebRequest.Create("http://www.baidu.com/");req.Headers[HttpWebRequstHeaders.Cookie]=Cooooooooooookies; 我为了防止.Net 4.0以下的CookieContainer的严重Bug,所以写了这几个方法。以后把Cookies经过ParseSetCookie处理后收集到一个字符串当中,发送出去的时候直接放在Cookie标头上就行了。 好像不能应用在我刚才给出那个URL上吧?我就奇怪了,怎么不能得到它的Cookies的呢 你看下最基本的模拟请求就知道了,CookieContainer cookieContainer=null webrequest.CookieContainer=cookieContainer;请求完毕后,如果有cookie下来,cookieContainer中会包含设置的cookie的 不行的,就比如说www.taobao.com这个网站,本身如果是用HttpWebReqest的话,只是有这个Cookies:LBS120819 120003 Fri, 07-Sep-2012 09:43:40 GMT 但是如果是直接用URL的话:cna:Og2yCOGWlDACAUYP DrZt6CYp_d r:1 / .alimama.com Sat, 01-Sep-2012 09:48:08 GMT 这就说明 你有淘宝需要的东西 没提交,一个是cookie一个参数。你用工具 监控 没有了呀,就是我刚打开淘宝的时候,也没什么提交了呀,Cookies也没有,参数也没有的啊 good good study and day day up 你给个网站链接 你要哪个cookie,你上面只写了个图片,我帮你看看 自定义控件遇到问题 求位置不确定时的正则表达式写法 Freetextbox text属性 是什么实现的? 状态信息对话框frmStatus的问题 Vista下的C#编程之困惑 C#实现登陆操作 100分!!难道报表一定要用代码拼吗?就不能图形界面画? 从服务器下载文件到客户端 如何改变datagrid的列宽(winform) 这种报表怎么设计和打印? 读取dll版本号 如何 过滤 这种标签
http://www.gdhzcgs.com/images/again_button.gif?这是嘛意思!
http://www.gdhzcgs.com/cookiesname?123传递过去,解析参数
/// <summary>
/// 把服务器返回的Set-Cookie标头信息翻译成
/// <para>能放在Cookie标头上的信息</para>
/// </summary>
/// <param name="CookieStr">Set-Cookie标头信息</param>
/// <returns></returns>
public string ParseSetCookie(string CookieStr)
{
if (CookieStr.Contains("=") && CookieStr.Contains(";"))//合法性验证
{
string[] oneCookie = CookieStr.Split(';');
string returnmsg = "";
string onename = "";
foreach (string one in oneCookie)
{
string ifThereisAComment = one;
if (ifThereisAComment.StartsWith(","))
{
//修复一个Bug:如果一个标头上只有一个Cookie,则解析出来的相应值之前会多一个逗号。
ifThereisAComment=ifThereisAComment.Substring(1);//截掉开头的逗号
}
onename = ParseOneNameAndValue(ifThereisAComment);//判断是否有逗号
returnmsg += onename;
} return returnmsg;
}
else
{
return "";
}
}
/// <summary>
/// 从数组中查找指定的值,并返回其Index
/// </summary>
/// <param name="Value">查找什么?</param>
/// <param name="Source">在哪个数组中找?</param>
/// <returns>Index或-1</returns>
public int FindIndex(string Value,string[] Source)
{
for (int i = 0; i < Source.Length; i++)
{
if (Value == Source[i])
{
return i;
}
}
return -1;
}
/// <summary>
/// 判断一个Name=Value的值是不是一个真正的Cookies
/// <para>若是两个Cookies,则把两个Cookies用分号隔开;</para>
/// <para>不是,则返回输入的NameAndValue值。</para>
/// </summary>
/// <param name="NameAndValue">Cookies Name=Value</param>
/// <returns></returns>
public string ParseOneNameAndValue(string NameAndValue)
{
if (!NameAndValue.Contains("="))
{
return "";
} string returnmsg = "";
if (NameAndValue.Contains(","))//有逗号
{
foreach (string one in NameAndValue.Split(','))
{
if (one.Contains("=") && (!NameAndValue.StartsWith(one)))//逗号旁有等号且不是第一个,说明逗号是分隔两个Set-Cookie标头的
{
string[] indexArr = NameAndValue.Split(','); int index = FindIndex(one, indexArr);
string one_s = ""; for (int i = index; i < indexArr.Length; i++)
{
one_s += indexArr[i];
}
returnmsg += ParseOneNameAndValue(one_s);//判断后面那一堆字符是不是一个Cookie
}
else//不是标头分隔
{
returnmsg += isPathDomainOrDate(NameAndValue);
}
}
} else//没有逗号,那就是货真价实的一个Cookie。
{
returnmsg += isPathDomainOrDate(NameAndValue);
} return returnmsg;
}
/// <summary>
/// 检测Name=Value是不是服务器Set-Cookie标头里的path、domain和过期日期
/// <para></para><para>有则返回空字符串,以去掉那些不能放在Cookie标头上的信息</para>
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public string isPathDomainOrDate(string input)
{ if (input.Trim().ToLower().StartsWith("path=") || input.Trim().ToLower().StartsWith("domain=")
|| input.Trim().ToLower().StartsWith("expires=")|| input.Trim().ToLower().StartsWith("max-age=")
|| input.Trim().ToLower().StartsWith("version=") || input.Trim().ToLower().StartsWith("httponly"))
{
//把Path、Domain和过期日期去掉
return "";
}
else
{
return input + ";";
}
}
#endregionHttpWebRequest req=(HttpWebRequset)WebRequest.Create("http://www.baidu.com/");
HttpWebResponse resp=(HttpWebResponse)req.GetResponse();
string Cooooooooooookies=ParseSetCookie(resp.Headers[HttpWebResponseHeaders.SetCookie]);调用:
HttpWebRequest req=(HttpWebRequset)WebRequest.Create("http://www.baidu.com/");
req.Headers[HttpWebRequstHeaders.Cookie]=Cooooooooooookies;
我为了防止.Net 4.0以下的CookieContainer的严重Bug,所以写了这几个方法。以后把Cookies经过ParseSetCookie处理后收集到一个字符串当中,发送出去的时候直接放在Cookie标头上就行了。
CookieContainer cookieContainer=null
webrequest.CookieContainer=cookieContainer;请求完毕后,如果有cookie下来,cookieContainer中会包含设置的cookie的
但是如果是直接用URL的话:cna:Og2yCOGWlDACAUYP DrZt6CY
p_d r:1 / .alimama.com Sat, 01-Sep-2012 09:48:08 GMT