asp.net httprequest httpresponse

问题:有的网站的相关内容必须要在登录后才可以查看,其登录信息保存在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, 0, 256 );
  while (count > 0)
  {
  String str = new String(read, 0, count);
  strResult += str;
  count = sr.Read(read, 0, 256);
  }
  }
  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, 0, 256 );
  while (count > 0)
  {
  String str = new String(read, 0, count);
  strResult += str;
  count = sr.Read(read, 0, 256);
  }
  }
  catch(Exception e)
  {
  strResult = e.ToString();
  }
  finally
  {
  if ( res != null )
  {
  res.Close();
  }
  }
  
  return strResult;
  }
  
  
  #region Web Form Designer generated code
  override protected void OnInit(EventArgs e)
  {
  //
  // CODEGEN: This call is required by the ASP.NET Web Form Designer.
  //
  InitializeComponent();
  base.OnInit(e);
  }
  
  /// <summary>
  /// Required method for Designer support - do not modify
  /// the contents of this method with the code editor.
  /// </summary>
  private void InitializeComponent()
  {
  this.Load += new System.EventHandler(this.Page_Load);
  
  }
  #endregion
  
  
  
  }
  }
//通过Post发送的数据
   string payload="chkbook=book&keyword=管理";
   WebRequest req = WebRequest.Create("http://localhost/pceo/Search.aspx");
   req.Method = "POST";
   req.ContentType = "application/x-www-form-urlencoded";
   StringBuilder UrlEncoded = new StringBuilder();
   Char[] reserved = {'?', '=', '&'};
   byte[] SomeBytes = null;
   if (payload != null)
   {
   int i=0, j;
   while(i<payload.Length)
   {
   j=payload.IndexOfAny(reserved, i);
   if (j==-1)
   {
   UrlEncoded.Append(HttpUtility.UrlEncode(payload.Substring(i, payload.Length-i),System.Text .Encoding .GetEncoding ("gb2312")));
   break;
   }
   UrlEncoded.Append(HttpUtility.UrlEncode(payload.Substring(i, j-i),System.Text .Encoding .GetEncoding ("gb2312")));
   UrlEncoded.Append(payload.Substring(j,1));
   i = j+1;
   }
   SomeBytes = Encoding.Default.GetBytes(UrlEncoded.ToString());
   req.ContentLength = SomeBytes.Length;
   Stream newStream = req.GetRequestStream();
   newStream.Write(SomeBytes, 0, SomeBytes.Length);
   newStream.Close();
   }
   else
   {
   req.ContentLength = 0;
   }
   try
   {
   WebResponse result = req.GetResponse();
   Stream ReceiveStream = result.GetResponseStream();
  
   Byte[] read = new Byte[512];
   int bytes = ReceiveStream.Read(read, 0, 512);
  
   txtHTML.InnerHtml = "";
   while (bytes > 0)
   {
  
   // 注意:
   // 下面假定响应使用 UTF-8 作为编码方式。
   // 如果内容以 ANSI 代码页形式(例如,932)发送,则使用类似下面的语句:
   // Encoding encode = System.Text.Encoding.GetEncoding("shift-jis");
   Encoding encode = System.Text.Encoding.GetEncoding("gb2312");
   txtHTML.InnerHtml = txtHTML.InnerHtml + encode.GetString(read, 0, bytes);
   bytes = ReceiveStream.Read(read, 0, 512);
   }
   }
   catch(Exception)
   {
   txtHTML.InnerHtml = "检索页时出错";
   }
最近有个朋友离开IT行业二年的朋友说要实现用程序向某个网站的页面上传数据,他是意思是每天有几十条数据要在网站页面上填写,很烦,最好用程序来写。网站页面是用POST传递的,同时没有验证码之类的东东,只有一点限制就是5分种内不能填写二次记录。这一切都好办。
  
  using System.Web;
  using System.Net;
  using System.Text;
  using System.IO;
  
  //创建对某个网站页面的请求
  
  HttpWebRequest myRequest = (HttpWebRequest )WebRequest.Create("http://www.knowsky.com/a.asp")
  
  //上传的数据,”TextBox1“这些东东是网站页面里的控件ID,如果要上传多个值也是用&来分隔
  
   string postData="TextBox1="+this.textBox1.Text+"&TextBox2="+this.textBox2.Text+"
  &TextBox3="+this.textBox3.Text+"&TextBox4="+this.textBox4.Text;
   ASCIIEncoding encoding=new ASCIIEncoding();
   byte[] byte1=encoding.GetBytes(postData);//最终编码后要上传的数据
   // Set the content type of the data being posted.
   myRequest.ContentType="application/x-www-form-urlencoded";
   myRequest.Method="post";//post上传方式
   // Set the content length of the string being posted.
   myRequest.ContentLength=postData.Length;
   Stream newStream=myRequest.GetRequestStream();
   newStream.Write(byte1,0,byte1.Length);
  
  
  一切就OK了,如果你想上传后看到网站的内容的话,可以在程序里放一个IE控件,使用
  
  axWebBrowser1.Navigate("http://www.knowsky.com/a.asp");
  axWebBrowser1.Refresh2();
posted @ 2007-12-24 13:17  hq5460  阅读(745)  评论(0编辑  收藏  举报