[asp.net]利用HttpRequest登录到某个网站,然后获取网站信息

问题:有的网站的相关内容必须要在登录后才可以查看,其登录信息保存在session变量之中。这样,使用asphttp等组件就难以正确得到所要的信息。

解决:使用asp.net中的httprequest和httpresponse来实现。

要点:
1。 通过附加一个cookiecontainer到httprequest对象中,可以得到登录后返回的代表SESSION ID的COOKIE。 见Login方法
2。 将此COOKIE包含在一个cookiecontainer中并附加到另一个HTTPREQUEST请求中,则可以实现SESSION的还原。见getPage方法

源程序如下:
getHttpInfo.aspx:
<%@ Page language="c#" Codebehind="getHttpInfo.aspx.cs" AutoEventWireup="false" Inherits="PdfTest.getHttpInfo" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    
<HEAD>
        
<title>WebForm1</title>
        
<meta content="Microsoft Visual Studio 7.0" name="GENERATOR">
        
<meta content="C#" name="CODE_LANGUAGE">
        
<meta content="JavaScript" name="vs_defaultClientScript">
        
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
    
</HEAD>
    
<body>
        
<form id="Form1" method="post" runat="server">
        
</form>
    
</body>
</HTML>
getHttpInfo.aspx.cs:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
//using System.Data.OleDb;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Net;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.Data.Odbc;

namespace PdfTest
{
    
/// <summary>
    
/// Summary description for WebForm1.
    
/// </summary>

    public class getHttpInfo : System.Web.UI.Page
    
{
        
protected static string cookieheader;

    
        
private void Page_Load(object sender, System.EventArgs e)
        
{
            
// Put user code to initialize the page here

            
string strResult;

            
if (HttpContext.Current.Application["cookieheader"!= null)
            
{
                cookieheader 
= (string)HttpContext.Current.Application["cookieheader"];
            }

            
else
            
{
                
//Login into the website and keep the cookie for the session in the application variable
                string strLogin = Login("http://www.thesiteyouwanttovisit/theloginpage.asp""Action=&USERID=&Password=") ;
            }

            

            strResult 
= getPage("http://www.thesiteyouwanttovisit/theloginpage.asp""Action=&data=") ;


            
//Write the result to htm file
            FileStream htmFile = new FileStream("c:save.htm", FileMode.OpenOrCreate);
            StreamWriter sw 
= new StreamWriter(htmFile);
            sw.Write(strResult);
            sw.Close();
            htmFile.Close();

            
// output the result
            Response.Write(strResult);
        }



        
public static string Login(String url, String paramList) 
        
{
            HttpWebResponse res 
= null;
            
string strResult="";

            
try 
            
{

                HttpWebRequest req 
= (HttpWebRequest)WebRequest.Create(url);
                req.Method 
= "POST";
                req.ContentType 
= "application/x-www-form-urlencoded";
                req.AllowAutoRedirect 
= false;
                CookieContainer cookieCon 
= new CookieContainer();
                req.CookieContainer 
= cookieCon;

                StringBuilder UrlEncoded 
= new StringBuilder();
                Char[] reserved 
= {'?''=''&'};
                
byte[] SomeBytes = null;

                
if (paramList != null
                
{
                    
int i=0, j;
                    
while(i<paramList.Length)
                    
{
                        j
=paramList.IndexOfAny(reserved, i);
                        
if (j==-1)
                        
{
                            UrlEncoded.Append(HttpUtility.UrlEncode(paramList.Substring(i, paramList.Length
-i)));
                            
break;
                        }

                        UrlEncoded.Append(HttpUtility.UrlEncode(paramList.Substring(i, j
-i)));
                        UrlEncoded.Append(paramList.Substring(j,
1));
                        i 
= j+1;
                    }

                    SomeBytes 
= Encoding.UTF8.GetBytes(UrlEncoded.ToString());
                    req.ContentLength 
= SomeBytes.Length;
                    Stream newStream 
= req.GetRequestStream();
                    newStream.Write(SomeBytes, 
0, SomeBytes.Length);
                    newStream.Close();
                }
 
                
else 
                
{
                    req.ContentLength 
= 0;
                }



                res 
= (HttpWebResponse)req.GetResponse();
                cookieheader 
= req.CookieContainer.GetCookieHeader(new Uri(url));
                HttpContext.Current.Application.Lock();
                HttpContext.Current.Application[
"cookieheader"= cookieheader;
                HttpContext.Current.Application.UnLock();

                Stream ReceiveStream 
= res.GetResponseStream();
                Encoding encode 
= System.Text.Encoding.GetEncoding("utf-8");
                StreamReader sr 
= new StreamReader( ReceiveStream, encode );
                Char[] read 
= new Char[256];
                
int count = sr.Read( read, 0256 );
                
while (count > 0
                
{
                    String str 
= new String(read, 0, count);
                    strResult 
+= str;
                    count 
= sr.Read(read, 0256);
                }

            }
 
            
catch(Exception e) 
            
{
                strResult 
= e.ToString();
            }
 
            
finally 
            
{
                
if ( res != null ) 
                
{
                    res.Close();
                }

            }


            
return strResult;
        }



        
public static string getPage(String url, String paramList) 
        
{
            HttpWebResponse res 
= null;
            
string strResult = "";

            
try 
            
{

                HttpWebRequest req 
= (HttpWebRequest)WebRequest.Create(url);
                req.Method 
= "POST";
                req.KeepAlive 
= true;
                req.ContentType 
= "application/x-www-form-urlencoded";
                CookieContainer cookieCon 
= new CookieContainer();
                req.CookieContainer 
= cookieCon;
                req.CookieContainer.SetCookies(
new Uri(url),cookieheader);
                StringBuilder UrlEncoded 
= new StringBuilder();
                Char[] reserved 
= {'?''=''&'};
                
byte[] SomeBytes = null;

                
if (paramList != null
                
{
                    
int i=0, j;
                    
while(i<paramList.Length)
                    
{
                        j
=paramList.IndexOfAny(reserved, i);
                        
if (j==-1)
                        
{
                            UrlEncoded.Append(HttpUtility.UrlEncode(paramList.Substring(i, paramList.Length
-i)));
                            
break;
                        }

                        UrlEncoded.Append(HttpUtility.UrlEncode(paramList.Substring(i, j
-i)));
                        UrlEncoded.Append(paramList.Substring(j,
1));
                        i 
= j+1;
                    }

                    SomeBytes 
= Encoding.UTF8.GetBytes(UrlEncoded.ToString());
                    req.ContentLength 
= SomeBytes.Length;
                    Stream newStream 
= req.GetRequestStream();
                    newStream.Write(SomeBytes, 
0, SomeBytes.Length);
                    newStream.Close();
                }
 
                
else 
                
{
                    req.ContentLength 
= 0;
                }



                res 
= (HttpWebResponse)req.GetResponse();
                Stream ReceiveStream 
= res.GetResponseStream();
                Encoding encode 
= System.Text.Encoding.GetEncoding("utf-8");
                StreamReader sr 
= new StreamReader( ReceiveStream, encode );
                Char[] read 
= new Char[256];
                
int count = sr.Read( read, 0256 );
                
while (count > 0
                
{
                    String str 
= new String(read, 0, count);
                    strResult 
+= str;
                    count 
= sr.Read(read, 0256);
                }

            }
 
            
catch(Exception e) 
            
{
                strResult 
= e.ToString();
            }
 
            
finally 
            
{
                
if ( res != null ) 
                
{
                    res.Close();
                }

            }


            
return strResult;
        }



        
Web Form Designer generated code

        


    }

}

posted @ 2006-10-17 10:50    阅读(...)  评论(...编辑  收藏