Post 方式

Post方式

//调用示例:
using System.Net;

private void button1_Click(object sender, System.EventArgs e)
{
    HttpRequestResponse xx = new HttpRequestResponse();
    xx.DataArrival += new DataArrivalEventHandler(xx_DataArrival);
    xx.SendRequest("http://www.triaton.com.cn/dotnet/tree/index.asp", "userid=老", "Post");
    xx.SendRequest("http://www.triaton.com.cn/dotnet/tree/index.asp", "userid=老", "get");
}

private void xx_DataArrival(object sender, DataArrivalEventArgs e)
{
    Console.WriteLine(e.RecievedData);
    Console.WriteLine(e.IsComplete);
}

//========================
//Class1.cs
using System;
using System.Net;
using System.Threading;
using System.Text;
using System.IO; 

public class RequestState
{
    const int BUFFER_SIZE = 1024;
    public System.Text.StringBuilder RequestData;
    public byte[] BufferRead;
    public System.Net.HttpWebRequest Request;
    public System.IO.Stream ResponseStream;
    public System.Text.Decoder StreamDecode = System.Text.Encoding.GetEncoding("gb2312").GetDecoder();

    public RequestState()
    {
        BufferRead = new byte[BUFFER_SIZE];
        RequestData = new System.Text.StringBuilder("");
        Request = null;
        ResponseStream = null;
    }
}
public delegate void DataArrivalEventHandler(object sender, DataArrivalEventArgs e);
public class DataArrivalEventArgs : System.EventArgs
{
    private string mRecievedData;
    private bool mIsComplete = false;
    public DataArrivalEventArgs(string Data, bool Complete)
    {
        mRecievedData = Data;
        mIsComplete = Complete;
    }
    public string RecievedData
    {
        get
        {
            return mRecievedData;
        }
    }
    public bool IsComplete
    {
        get
        {
            return mIsComplete;
        }
    }
}


class HttpRequestResponse
{
    public static System.Threading.ManualResetEvent allDone = new System.Threading.ManualResetEvent(false);
    const int BUFFER_SIZE = 1024;
    public event DataArrivalEventHandler DataArrival;

    protected virtual void OnDataArrival(DataArrivalEventArgs e)
    {
        if (DataArrival != null)
        {
            DataArrival(this, e);
        }
    }
    private System.Text.Encoding mRequestEncoding = System.Text.Encoding.GetEncoding("gb2312");
    public void SendRequest(string RequestURL, string RequestData, string RequestMethod)
    {
        HttpWebRequest req;
        RequestState rs = new RequestState();
        if (RequestData != null)
        {
            int i = 0, j;
            Char[] reserved = { '?', '=', '&' };
            while (i < RequestData.Length)
            {
                j = RequestData.IndexOfAny(reserved, i);
                if (j == -1)
                {
                    rs.RequestData.Append(System.Web.HttpUtility.UrlEncode(RequestData.Substring(i, RequestData.Length - i), mRequestEncoding));
                    break;
                }
                rs.RequestData.Append(System.Web.HttpUtility.UrlEncode(RequestData.Substring(i, j - i), mRequestEncoding));
                rs.RequestData.Append(RequestData.Substring(j, 1));
                i = j + 1;
            }
        }
        if (RequestMethod.ToUpper() == "POST")
        {
            byte[] Buffer = null;
            Buffer = mRequestEncoding.GetBytes(rs.RequestData.ToString());
            req = (HttpWebRequest)WebRequest.Create(RequestURL);
            req.ContentLength = Buffer.Length;
            req.Method = RequestMethod;
            req.ContentType = "application/x-www-form-urlencoded";
            Stream newStream = req.GetRequestStream();
            newStream.Write(Buffer, 0, Buffer.Length);
            newStream.Close();
        }
        else
        {
            req = (HttpWebRequest)WebRequest.Create(RequestURL + "?" + rs.RequestData.ToString());
        }

        rs.Request = req;
        System.IAsyncResult r = (System.IAsyncResult)req.BeginGetResponse(new System.AsyncCallback(ResponseCallback), rs);
    }

    private void ResponseCallback(IAsyncResult ar)
    {
        RequestState rs = (RequestState)ar.AsyncState;

        System.Net.HttpWebRequest req = rs.Request;

        System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse)req.EndGetResponse(ar);

        System.IO.Stream ResponseStream = resp.GetResponseStream();

        rs.ResponseStream = ResponseStream;

        IAsyncResult iarRead = ResponseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
    }

    private void ReadCallBack(IAsyncResult asyncResult)
    {
        RequestState rs = (RequestState)asyncResult.AsyncState;

        System.IO.Stream responseStream = rs.ResponseStream;

        int read = responseStream.EndRead(asyncResult);

        if (read > 0)
        {
            Char[] charBuffer = new Char[BUFFER_SIZE];

            int len = rs.StreamDecode.GetChars(rs.BufferRead, 0, read, charBuffer, 0);
            System.String str = new System.String(charBuffer, 0, len);

            OnDataArrival(new DataArrivalEventArgs(str, false));

            rs.RequestData.Append(str);

            IAsyncResult ar = responseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
        }
        else
        {
            if (rs.RequestData.Length > 1)
            {
                string strContent;
                strContent = rs.RequestData.ToString();
            }
            responseStream.Close();
            OnDataArrival(new DataArrivalEventArgs("\n", true));
            allDone.Set();
        }
        return;
    }
}

//================================

//调用示例
//再贴一个 Socket 编的
private void button1_Click(object sender, System.EventArgs e)
{
    (new WindowsApplication1.HttpRequestResponse()).SendRequestAndGetResponse();
    (new WindowsApplication1.HttpRequestResponse()).SendRequestAndGetResponse();
    (new WindowsApplication1.HttpRequestResponse()).SendRequestAndGetResponse();
    (new WindowsApplication1.HttpRequestResponse()).SendRequestAndGetResponse();
    (new WindowsApplication1.HttpRequestResponse()).SendRequestAndGetResponse();
    (new WindowsApplication1.HttpRequestResponse()).SendRequestAndGetResponse();
    System.Windows.Forms.MessageBox.Show("send end");
}

//很久(去年)以前写的 Socket 级的 Class1.cs
using System;

/// <summary>
/// Class1 的摘要说明。
/// </summary>
public class HttpRequestResponse
{
    private System.Text.StringBuilder SB = new System.Text.StringBuilder();
    private string sReq;
    private byte[] buffer = new byte[1024];
    private int index = 0;
    private static int Count = 0;
    //public delegate SendRequestAndGetResponse
    public HttpRequestResponse()
    {
        //
        // TODO: 在此处添加构造函数逻辑
        //
    }

    public void SendRequestAndGetResponse()
    {
        string sHost = "triatonweb";
        int iPort = 80;
        string sReqItem = "游客";
        sReqItem = "uid=" + System.Web.HttpUtility.UrlEncode(sReqItem, System.Text.Encoding.GetEncoding("GB2312"));
        sReq = "userid=" + System.Web.HttpUtility.UrlEncode("游客", System.Text.Encoding.GetEncoding("GB2312"))
        + "&dest_tel=13910081138"
        + "&mytel=13910081138"
        + "&mypwd=asdada";
        string CGI = "dotnet/tree/index.asp";
        sReq = "POST /" + CGI + " HTTP/1.1\n"
        + "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\n"
        + "Accept-Language: zh-cn\n"
        + "Content-Type: application/x-www-form-urlencoded\n"
        + "Accept-Encoding: gzip, deflate\n"
        + "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)\n"
        + "Host: " + sHost + ":" + System.Convert.ToString(iPort) + "\n"
        + "Content-Length: " + System.Convert.ToString(sReqItem.Length) + "\n"
        + "Connection: Keep-Alive\n"
        + "Cache-Control: no-cache\n\n"
        + sReq;

        System.Net.Sockets.Socket Skt = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
        index = ++Count;
        Skt.BeginConnect(new System.Net.IPEndPoint(System.Net.Dns.Resolve(sHost).AddressList[0], 80),
        new System.AsyncCallback(this.BeginConnectAsyncCallback), Skt);
        System.Console.WriteLine("Socket[" + index.ToString() + "] 开始连接: {0}", Skt.RemoteEndPoint.ToString());
    }

    private void BeginConnectAsyncCallback(System.IAsyncResult IAR)
    {
        // try 
        // {
        System.Net.Sockets.Socket Skt = (System.Net.Sockets.Socket)IAR.AsyncState;
        Skt.EndConnect(IAR);

        System.Console.WriteLine("Socket[" + index.ToString() + "] 已连接到: {0}", Skt.RemoteEndPoint.ToString());
        buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(sReq);
        Skt.BeginSend(buffer, 0, buffer.Length, System.Net.Sockets.SocketFlags.None, new System.AsyncCallback(this.BeginSendAsyncCallback), Skt);
        System.Console.WriteLine("Socket[" + index.ToString() + "] 开始发送: {1} Bytes 数据,到 IP: {0} ", Skt.RemoteEndPoint.ToString(), buffer.Length.ToString());
        // } 
        // catch (Exception e) 
        // {
        // Console.WriteLine(e.ToString());
        // }
    }

    private void BeginSendAsyncCallback(System.IAsyncResult IAR)
    {
        // try 
        // {
        System.Net.Sockets.Socket Skt = (System.Net.Sockets.Socket)IAR.AsyncState;
        Skt.EndSend(IAR);
        System.Console.WriteLine("Socket[" + index.ToString() + "] 发送完毕");
        //byte[] buffer = new byte[1024];
        Skt.BeginReceive(buffer, 0, buffer.Length, System.Net.Sockets.SocketFlags.None, new System.AsyncCallback(this.BeginRecieveAsyncCallback), Skt);
        System.Console.WriteLine("Socket[" + index.ToString() + "] 开始接收数据,从 IP: {0}", Skt.RemoteEndPoint.ToString());

        // } 
        // catch (Exception e) 
        // {
        // Console.WriteLine(e.ToString());
        // }
    }

    private void BeginRecieveAsyncCallback(System.IAsyncResult IAR)
    {
        // try 
        // {
        System.Net.Sockets.Socket Skt = (System.Net.Sockets.Socket)IAR.AsyncState;
        int i = Skt.EndReceive(IAR);

        if (i > 0)
        {
            //buffer.Length = i;
            SB.Append("" + System.Text.Encoding.GetEncoding("GB2312").GetString(buffer, 0, i));
            Skt.BeginReceive(buffer, 0, buffer.Length, System.Net.Sockets.SocketFlags.None, new System.AsyncCallback(this.BeginRecieveAsyncCallback), Skt);
            System.Console.WriteLine("Socket[" + index.ToString() + "] 已接收 {1} 字节数据,从 IP: {0}", Skt.RemoteEndPoint.ToString(), buffer.Length.ToString());
            Console.WriteLine(System.Text.Encoding.GetEncoding("GB2312").GetString(buffer, 0, i));
        }
        else
        {
            Skt.Close();
            Skt = null;
            Console.WriteLine(SB.ToString());
        }
        //Skt.BeginReceive

        // } 
        // catch (Exception e) 
        // {
        // Console.WriteLine(e.ToString());
        // }
    }
}

Post方式2

1、

string url = "ab.asp";
WebRequest req = WebRequest.Create( uri );
req.Method = "POST";

byte[] postData = System.Text.Encoding.UTF8.GetBytes( "a=avalue&b=bvalue");

req.ContentLength = postData.Length;
Stream postStream = req.GetRequestStream();
postStream.Write(postData, 0, postData.Length);
postStream.Close();

WebResponse res = req.GetResponse();

StreamReader reader = new StreamReader( res.GetResponseStream(),System.Text.Encoding.UTF8 );

string html = reader.ReadToEnd();

reader.Close();
res.Close();

你可以将UTF8换成你需要的编码方式

记得加上

using System.Net;
using System.IO;
using System.Text;

2、

private void enableProxy()
{
    WebProxy wp=new WebProxy("10.1.1.9",8080);
    wp.BypassProxyOnLocal=true;
    wp.Credentials=new NetworkCredential("lzh","12345", "DomainName");   
    GlobalProxySelection.Select =wp;
}

下面是发送代码(我用来给bbs发贴的):

this.enableProxy();

System.Text.Encoding  encoder = System.Text.Encoding.GetEncoding("gb2312");
StringBuilder sb = new StringBuilder();
sb.Append ("name=");
sb.Append(HttpUtility.UrlEncode(this.txtName.Text,encoder));
sb.Append("&content1=");
sb.Append(HttpUtility.UrlEncode(this.txtContent.Text,encoder));
sb.Append("&title=");
sb.Append(HttpUtility.UrlEncode(this.txtTitle.Text,encoder));

byte[] buffer = System.Text.ASCIIEncoding.ASCII.GetBytes(sb.ToString());
 
StreamReader reader=null;
try
{
    HttpWebRequest request= (HttpWebRequest)WebRequest.Create(strURL);
    request.Method ="POST";

    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = buffer.Length ;
    Stream s = request.GetRequestStream();
    s.Write(buffer,0,buffer.Length );
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    reader= new StreamReader(response.GetResponseStream(),System.Text.Encoding.Default);
}
catch(Exception ex)
{
    MessageBox.Show(ex.ToString());
    return;
}
this.txtContent.Text = reader.ReadToEnd();

如果你不通过代理服务器

this.enableProxy();不用调用

Contributors: FHL