zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    HDU 2888 Check Corners (模板题)【二维RMQ】
    POJ 3264 Balanced Lineup(模板题)【RMQ】
    poj 3368 Frequent values(经典)【RMQ】
    SPOJ RPLN (模板题)(ST算法)【RMQ】
    UVA 796 Critical Links(模板题)(无向图求桥)
    UVA 315 Network (模板题)(无向图求割点)
    POJ 2029 Get Many Persimmon Trees (模板题)【二维树状数组】
    poj 3067 Japan 【树状数组】
    POJ 2481 Cows 【树状数组】
    POJ 1195 Mobile phones【二维树状数组】
  • 原文地址:https://www.cnblogs.com/hq2008/p/1012504.html
Copyright © 2011-2022 走看看