当前位置:  编程技术>.net/c#/asp.net
本页文章导读:
    ▪ASP.NET实现根据URL获取网站完整的页面内容      今天主要是来说一下ASP.NET实现根据URL获取网站完整的页面内容,这种实现也可以用于实现获取网站的缩略图,获取网站的源码,获取网站的编码和Title等标签纸,本文只写出获得网站完整的内.........
    ▪CLR via C# 之管中窥豹(一)      记得刚毕业那会,看过一阵CLR via C#,由于书中知识对于我来说过于深奥,最终只得放弃。而今重新拾起此书并结合工作中的一些经验,偶有小感就写成随笔分享给大家,便于共同探讨,也能.........
    ▪将不确定变为确定~异常被抛出的顺序      在程序中,为了保正代码的严禁性我们会在需要的地方加个try...cache块,作用是对一个已知或者未知的异常进行捕获,这是正常的,任何一种面向对象的语言都提供了这个基础的功能,C#也不.........

[1]ASP.NET实现根据URL获取网站完整的页面内容
    来源:    发布时间: 2013-10-28

今天主要是来说一下ASP.NET实现根据URL获取网站完整的页面内容,这种实现也可以用于实现获取网站的缩略图,获取网站的源码,获取网站的编码和Title等标签纸,本文只写出获得网站完整的内容,具体的大家可以自己扩展一下,我们可以进行深入交流,呵呵呵。

这个实现主要是用了ASP.NET的文件流形式实现,本文以获取http://www.zzdaohang.cn/ 的网站内容为例,进行说明。

写个测试页面,如下图:

实现的代码如下,有些部分我加上了详细的注释:

//获取相关编码,这里建议使用GB2312
Encoding code = Encoding.GetEncoding("gb2312");
StreamReader sr = null;
StreamWriter sw = null;
string str = null;

//根据URL读取远程路径
WebRequest temp = WebRequest.Create(txtUrl.Text.Trim());
WebResponse myTemp = temp.GetResponse();
sr = new StreamReader(myTemp.GetResponseStream(), code);
try
{
sr = new StreamReader(myTemp.GetResponseStream(), code);
str = sr.ReadToEnd();
}
catch (Exception ex)
{
throw ex;
}
finally
{
sr.Close();
}
//这里是按时间随机生成文件名称,当然也可以自己定义
string fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".htm";
//写入,这里注意要写入的文件可以不存在,但是文件夹一定要存在
try
{
sw = new StreamWriter(Server.MapPath("url/") + fileName, false, code);
sw.Write(str);
sw.Flush();
}
catch (Exception ex)
{
throw ex;
}
finally
{
sw.Close();
Response.Write("测试结果!文件已经生成,并保存在url文件夹下!访问这个链接试试:<a href=/blog_article/url/index.html" + fileName + " target=_blank>" + fileName + "</a>。");
}

实现的结果进行访问测试,我截了图说明一下,大家可以看看,真的很完美,你也可以测试一下百度网址试一下,呵呵呵。站长站的首页被完整的抓去了过来,效果可以吧。
本人还抓取了 http://www.45828.cn/ 这个网址的测试了一下,效果也不错。

在这里,我们也相当于获得了网页的源码,从而就可以获得网页的Title值和Meta标签,这个自己就可以进行写了。

希望对大家有点作用。

 

本文链接


    
[2]CLR via C# 之管中窥豹(一)
    来源:    发布时间: 2013-10-28

记得刚毕业那会,看过一阵CLR via C#,由于书中知识对于我来说过于深奥,最终只得放弃。而今重新拾起此书并结合工作中的一些经验,偶有小感就写成随笔分享给大家,便于共同探讨,也能帮助我成长。

执行程序集的代码

前几天组里有个测试找我帮他们看个自动化测试的用例,该用例从某一天就一直抛出加载程序集失败的异常。在这里我用一个场景去模拟当时的情形 ,有这么一个测试用例:我们测试Visual Studio创建工程(随机创建Silverlight或者WPF),并为新建的工程添加一个按钮。我们需要为WPF和Silverlight创建相应的按钮,但是我们把这两种按钮添加的逻辑放到一个方法里面,并通过一个布尔值去区分不同的工程。添加按钮逻辑的样例代码如下:

1 public void AddButton(bool isSiverlight)
2 {
3 if (isSiverlight)
4 {
5 Silverlight.System.Windows.Controls.Button button = new Silverlight.System.Windows.Controls.Button();
6 }
7 else
8 {
9 System.Windows.Controls.Button button = new System.Windows.Controls.Button();
10 }
11 }

产品以前有个功能,当需要用到一些没有加载的程序集时,产品根据一些逻辑找到该程序集但是并不管该程序集是否运行的工程有关。但是现在改成了只会查找和加载和当前工程相关的程序集。也就是说对于WPF的工程来说,产品不会再去查找或者加载Silverlight的程序集。因此现在在WPF工程中执行AddButton方法时,会因找不到Silverlight程序集抛出“Could not load file or assembly 'System.Windows, Version=5.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' or one of its dependencies”(注:此程序集不在GAC中,也不是Copy Local的)。找到了原因之后,我将AddButton的逻辑稍作改动如下:

1 public void AddButtonUsingSeperateMethod(bool isSiverlight)
2 {
3 if (isSiverlight)
4 {
5 this.AddSiverlightButton();
6 }
7 else
8 {
9 this.AddWpfButton();
10 }
11 }
12
13 private void AddSiverlightButton()
14 {
15 Silverlight.System.Windows.Controls.Button button = new Silverlight.System.Windows.Controls.Button();
16 }
17
18 private void AddWpfButton()
19 {
20 System.Windows.Controls.Button button = new System.Windows.Controls.Button();
21 }

我将AddButton里的方法抽成了两个独立的方法,该用例便正常了。测试觉得很奇怪,问我为什么写成两个独立的方法就可以,而独立的方法便会有异常,逻辑明明是一样的啊。我于是把CLR via C#找出来,找到“执行程序集代码”的章节跟他解释了一番,他便明白了其中的原因。

CLR第一次执行到某个方法时,JIT编译器会将该方法的IL转换成本地CPU指令(步骤参见下图,来自CLR via C#)。因此当执行AddButton方法时,会将里面的IL代码全部解释为CPU指令,当转换"Silverlight.System.Windows.Controls.Button button = new Silverlight.System.Windows.Controls.Button();"时,会需要加载定义该类的程序集查找该类的信息,由于找不到该程序集便有异常发生了。但是AddButtonUsingSeperateMethod就不一样了,由于此时是WPF工程,JIT在转换AddButtonUsingSeperateMethod时并不立即将AddSiverlightButton这个方法的具体实现也一并转换成CPU指令,因而也就不需要加载Silverlight的程序集,从而避免了异常的发生。

 

拆箱

“拆箱的代价比装箱低得多,拆箱其实就是获取一个指针的过程,该指针指向包含在一个对象中的原始值类型(数据字段),拆箱不要求在内存中复制任何字段” 

下面的代码将struct类型p装箱成object并赋值给o,随后又将o拆箱成Point并赋值给p。通常我们所指的拆箱便是(Point)o这个表达式,其实这个表达式包含了拆箱和赋值两个操作。

1 public struct Point
2 {
3 public int X;
4 public int Y;
5 }
6
7 class Program
8 {
9 static void Main(string[] args)
10 {
11 Point p = new Point() { X = 1, Y = 1 };
12 object o = p;
13 p = (Point)o;
14 }
15 }

单纯地就拆箱来讲只是获取一个指针,但随后会紧接着一个赋值的动作。那么这个值是赋到哪里呢?我们来尝

    
[3]将不确定变为确定~异常被抛出的顺序
    来源:    发布时间: 2013-10-28

在程序中,为了保正代码的严禁性我们会在需要的地方加个try...cache块,作用是对一个已知或者未知的异常进行捕获,这是正常的,任何一种面向对象的语言都提供了这个基础的功能,C#也不例外,事实上这篇文章的重要是,对于比较深度的方法调用中,异常被抛出的顺序。

下面代码块中,WEB层调用BLL层方法,而BLL层方法去调用DAL层方法,而在这三个层的三个方法中都加了try...catch块,而在BLL与DAL中我会故意让程序产生一个已知的异常,并进行捕获,最后进行日志的写入。

看代码:

1 static void DAL()
2 {
3 int a = 0;
4 try
5 {
6 int b = 1 / a;
7 }
8 catch (Exception e)
9 {
10
11 ErrMsg.Append(e.Message);
12
13 }
14 }
15
16 static void BLL()
17 {
18 try
19 {
20 DAL();
21 test t = null;
22 Console.WriteLine(t.nam);
23 }
24 catch (Exception e)
25 {
26
27 ErrMsg.Append(e.Message);
28 }
29 }
30
31 static void WEB()
32 {
33 try
34 {
35 BLL();
36 }
37 catch (Exception e)
38 {
39
40 ErrMsg.Append(e.Message);
41 }
42 }

调用代码:

static void Main(string[] args)
{
WEB();
Console.WriteLine(ErrMsg.ToString());
}

结果如下:


    
最新技术文章:
▪C#通过IComparable实现ListT.sort()排序
▪C#实现对Json字符串处理实例
▪Winform实现抓取web页面内容的方法
▪Winform实现将网页生成图片的方法
▪C#控制台程序中处理2个关闭事件的代码实例
▪WinForm实现同时让两个窗体有激活效果的特效...
▪WinForm实现拦截窗体上各个部位的点击特效实...
▪用C#的params关键字实现方法形参个数可变示例
▪C#判断某程序是否运行的方法
▪C#验证码识别基础方法实例分析
▪C#通过WIN32 API实现嵌入程序窗体
▪C#实现获取鼠标句柄的方法
▪C#事件处理和委托event delegate实例简述
▪C#获取程序文件相关信息的方法
▪C#中的除法运算符与VB.NET中的除法运算符
▪ASP.NET MVC 5使用X.PagedList.Mvc进行分页教程(PagedLi...
▪Base64编码解码原理及C#编程实例
▪C#实现的优酷真实视频地址解析功能(2014新算...
▪C#和SQL实现的字符串相似度计算代码分享
▪C#使用Word中的内置对话框实例
▪C#反射之基础应用实例总结
▪C#生成单页静态页简单实例
▪C#实现SMTP邮件发送程序实例
▪C#实现随鼠标移动窗体实例
▪C#使用GDI+创建缩略图实例
▪C#实现通过模板自动创建Word文档的方法
▪C#中Response.Write常见问题汇总
▪C#中多态、重载、重写区别分析
▪WinFrom中label背景透明的实现方法
▪C#中out保留字用法实例分析
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3