代码改变世界

WebClient和HttpWebRequest的简单用法

2012-08-15 17:49  C#与.NET探索者  阅读(494)  评论(0编辑  收藏  举报

下面列出两个类的实现方法,可以实现提交,但要指出的是,这两个方法都没有实现COOKIES的传递,所以只能提交,但是并不能保存cookies记录。下一次发布的时候将来发布日前写的一个小软件AutoClick,它是一个能自实现自动登录,并发布数据的功能,如果再加上一个蜘蛛那就是一个自已灌水机了,呵呵。
WebClient方法:

System.Net.WebClient wc = new WebClient();
wc.Headers.Add(
"Accept-Language""zh-cn");
wc.Headers.Add(
"Content-Type""application/x-www-form-urlencoded");
string cont = System.Web.HttpUtility.UrlEncode(content, System.Text.Encoding.Default);
string postData = string.Format("username=xxx&password=xxx&to={0}&content={1}", tel,cont);
byte[] bReturn = wc.UploadData("http://xxx.com/xx.asp?""POST", System.Text.Encoding.Default.GetBytes(postData));
wc.Dispose();
return System.Text.Encoding.GetEncoding("gb2312").GetString(bReturn);

HttpWebRequest方法:


private void Page_Load(object sender, System.EventArgs e)
 
{
 
  
  
string url="http://localhost/webUserWindowExample/WebForm5.aspx";
   System.Net .CookieContainer cook
=new System.Net .CookieContainer();
  
string gets=getHTMLByUrlCook(url,ref cook,"Get",null,true);
  
string strViewState = System.Text .RegularExpressions .Regex.Replace(gets,"[\\s*\\S*]*<input type=\"hidden\" name=\"__VIEWSTATE\" value=\"([^\"]*)\"[\\s*\\S*]*","$1",System.Text .RegularExpressions.RegexOptions.IgnoreCase);
  
  
string param="__VIEWSTATE="+System.Web.HttpUtility.UrlEncode(strViewState)+"&TextBox1=xxxx&Button1=Button&CheckBox1=on";
  
  
string s=a.getHTMLByUrlCook(url,ref cook,"POST",param,true);
   Response.Write(s);
  }

public  string getHTMLByUrlCook(string url,ref System.Net.CookieContainer cook,string sMethod,string Param,bool bAutoRedirect,System.Text.Encoding ecode)
{
sMethod 
= sMethod.ToUpper();
sMethod 
= sMethod!="POST"?"GET":sMethod;
string res ="";
HttpWebRequest re 
=(HttpWebRequest)HttpWebRequest.Create(url);
re.CookieContainer 
= cook; // attach the cook object 
re.Method = sMethod;
re.AllowAutoRedirect 
= bAutoRedirect;
re.UserAgent
="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; MyIE2; .NET CLR 1.1.4322)";


if(Public.Session.bUsePox) //利用代理
{
int Port = 80;
if(Public.IsInt(this.Session.PoxPort))
{
Port 
= Convert.ToInt32(this.Session.PoxPort);
}

WebProxy pox 
= new WebProxy(this.Session.PoxIp,Port);
pox 
= (WebProxy)re.Proxy;
}



//re.Referer="http://expert.csdn.net/Expert/topic/2839/2839298.xml?temp=.2714197";


//re.ClientCertificates = new System.Security.Cryptography.X509Certificates.X509CertificateCollection();
//re.ClientCertificates = System.Security.Cryptography.X509Certificates.X509Certificate.CreateFromSignedFile();

//re.Timeout = 2000;
re.Referer = url;
if (sMethod =="POST"// Post data to Server
{
re.ContentType
="application/x-www-form-urlencoded";

byte[] b=System.Text.Encoding.UTF8.GetBytes(Param);
re.ContentLength 
= b.Length;
try
{
Stream oSRe 
= re.GetRequestStream();
oSRe.Write(b,
0,b.Length);
oSRe.Close();
oSRe 
= null;
}

catch(Exception )
{
re 
= null;
return "-1";
}

}


HttpWebResponse rep 
= null;
Stream oresponseStream 
= null;
StreamReader oSReader 
= null;
try
{
rep
=(HttpWebResponse)re.GetResponse();

oresponseStream 
= rep.GetResponseStream();
oSReader  
= new StreamReader(oResponseStream,ecode);
res 
=oSReader.ReadToEnd();
}

catch (System.Net.WebException  e)
{
//res ="-1";

res 
= e.ToString();
}


if (rep!=null
{
rep.Close();
rep 
= null;
}

if(oResponseStream!= null)
{
oresponseStream.Close();
oresponseStream 
= null;
}


if(oSReader!=null)
{
oSReader.Close();
oSReader 
= null;
}

re 
= null;

return res;

}

关于协议冲突:在ASP.NET 2.0里使用web.config设置:

<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing = "true"/>
</settings>
</system.net>