2007年3月6日,21:44:11
利用.NET的 WebClient类 和 WebRequest类,我们可以很容易地得到给定URL地址的源代码。主要代码如下:
GetPage.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="GetPage.aspx.cs" Inherits="GetPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=" http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>获取任意网页HTML代码</title>
</head>
<body>
<form id="form1" runat="server">
<div style="text-align:center;">
<asp:TextBox ID="UrlText" runat="server" Width="400" Text=" http://www.gsdesign.cn"></asp:TextBox>
<asp:Button ID="WebClientButton" runat="server" Text="用WebClient得到" OnClick="WebClientButton_Click" />
<asp:Button ID="WebRequestButton" runat="server" Text="用WebRequest得到" OnClick="WebRequestButton_Click" />
<br />
<asp:TextBox ID="ContentHtml" runat="server" Width="100%" Height="360" TextMode="MultiLine"></asp:TextBox>
</div>
</form>
</body>
</html>
GetPage.aspx.cs:
using System;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Text;
using System.Net;
public partial class GetPage : System.Web.UI.Page
{
private string pageUrl = "";
protected void Page_Load(object sender, EventArgs e)
{
}
/// <summary>
/// 使用WebClient方法
/// </summary>
protected void WebClientButton_Click(object sender, EventArgs e)
{
pageUrl = UrlText.Text;
WebClient wc = new WebClient();
wc.Credentials = CredentialCache.DefaultCredentials;
//方法一
byte[] pageData = wc.DownloadData(pageUrl);
ContentHtml.Text = Encoding.Default.GetString(pageData);
/*
//方法二
Stream resStream = wc.OpenRead(pageurl);
StreamReader sr = new StreamReader(resStream, Encoding.Default);
ContentHtml.Text = sr.ReadToEnd();
resStream.Close();
*/
wc.Dispose();
}
/// <summary>
/// 使用WebRequest方法
/// </summary>
protected void WebRequestButton_Click(object sender, EventArgs e)
{
pageUrl = UrlText.Text;
WebRequest wrequest = WebRequest.Create(pageUrl);
WebResponse wresponse = wrequest.GetResponse();
Stream resStream = wresponse.GetResponseStream();
StreamReader sr = new StreamReader(resStream, Encoding.Default);
ContentHtml.Text = sr.ReadToEnd();
resStream.Close();
sr.Close();
}
}
GetPage.aspx:
程序代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="GetPage.aspx.cs" Inherits="GetPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=" http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>获取任意网页HTML代码</title>
</head>
<body>
<form id="form1" runat="server">
<div style="text-align:center;">
<asp:TextBox ID="UrlText" runat="server" Width="400" Text=" http://www.gsdesign.cn"></asp:TextBox>
<asp:Button ID="WebClientButton" runat="server" Text="用WebClient得到" OnClick="WebClientButton_Click" />
<asp:Button ID="WebRequestButton" runat="server" Text="用WebRequest得到" OnClick="WebRequestButton_Click" />
<br />
<asp:TextBox ID="ContentHtml" runat="server" Width="100%" Height="360" TextMode="MultiLine"></asp:TextBox>
</div>
</form>
</body>
</html>
GetPage.aspx.cs:
程序代码
using System;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Text;
using System.Net;
public partial class GetPage : System.Web.UI.Page
{
private string pageUrl = "";
protected void Page_Load(object sender, EventArgs e)
{
}
/// <summary>
/// 使用WebClient方法
/// </summary>
protected void WebClientButton_Click(object sender, EventArgs e)
{
pageUrl = UrlText.Text;
WebClient wc = new WebClient();
wc.Credentials = CredentialCache.DefaultCredentials;
//方法一
byte[] pageData = wc.DownloadData(pageUrl);
ContentHtml.Text = Encoding.Default.GetString(pageData);
/*
//方法二
Stream resStream = wc.OpenRead(pageurl);
StreamReader sr = new StreamReader(resStream, Encoding.Default);
ContentHtml.Text = sr.ReadToEnd();
resStream.Close();
*/
wc.Dispose();
}
/// <summary>
/// 使用WebRequest方法
/// </summary>
protected void WebRequestButton_Click(object sender, EventArgs e)
{
pageUrl = UrlText.Text;
WebRequest wrequest = WebRequest.Create(pageUrl);
WebResponse wresponse = wrequest.GetResponse();
Stream resStream = wresponse.GetResponseStream();
StreamReader sr = new StreamReader(resStream, Encoding.Default);
ContentHtml.Text = sr.ReadToEnd();
resStream.Close();
sr.Close();
}
}
MultiUpload.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MultiUpload.aspx.cs" Inherits="MultiUpload" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=" http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>多文件上传</title>
<script language="javascript">
function addFile()
{
var str = '<input type="file" size ="50" name="File" />';
document.getElementById('MyFile').insertAdjacentHTML("beforeEnd",str);
}
</script>
</head>
<body>
<form id="form1" runat="server" method="post" enctype="multipart/form-data">
<div>
<p id="MyFile"><input type="file" size="50" name="File" /></p>
<p>
<input type="button" value="增加" οnclick="addFile()" />
<input οnclick="this.form.reset()" type="button" value="重置" />
<asp:Button ID="UploadButton" Text="开始上传" runat="server" OnClick="UploadButton_Click" />
</p>
<p>
<asp:Label ID="lblStatus" runat="server"></asp:Label>
</p>
</div>
</form>
</body>
</html>
MultiUpload.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class MultiUpload : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
private Boolean SaveImages()
{
//遍历File表单元素
HttpFileCollection files = HttpContext.Current.Request.Files;
//状态信息
System.Text.StringBuilder strMsg = new System.Text.StringBuilder();
strMsg.Append("上传的文件分别是:<hr color=#FF0000 />");
try
{
for (int iFile = 0; iFile < files.Count; iFile++)
{
//检查文件扩展名字
HttpPostedFile postedFile = files[iFile];
string fileName, fileExtension;
fileName = System.IO.Path.GetFileName(postedFile.FileName);
if (!string.IsNullOrEmpty(fileName))
{
fileExtension = System.IO.Path.GetExtension(fileName);
strMsg.Append("上传的文件类型:" + postedFile.ContentType.ToString() + "<br />");
strMsg.Append("客户端文件地址:" + postedFile.FileName + "<br />");
strMsg.Append("上传文件的文件名:" + fileName + "<br />");
strMsg.Append("上传文件的扩展名:" + fileExtension + "<br /><hr />");
//可根据扩展名字的不同保存到不同的文件夹
postedFile.SaveAs(System.Web.HttpContext.Current.Request.MapPath("images/") + fileName);
}
}
lblStatus.Text = strMsg.ToString();
return true;
}
catch (Exception ex)
{
lblStatus.Text = ex.Message;
return false;
}
}
protected void UploadButton_Click(object sender, EventArgs e)
{
Boolean uploadsuccess = SaveImages();
if (!uploadsuccess)
lblStatus.Text = "上传失败!";
}
}
程序代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MultiUpload.aspx.cs" Inherits="MultiUpload" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=" http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>多文件上传</title>
<script language="javascript">
function addFile()
{
var str = '<input type="file" size ="50" name="File" />';
document.getElementById('MyFile').insertAdjacentHTML("beforeEnd",str);
}
</script>
</head>
<body>
<form id="form1" runat="server" method="post" enctype="multipart/form-data">
<div>
<p id="MyFile"><input type="file" size="50" name="File" /></p>
<p>
<input type="button" value="增加" οnclick="addFile()" />
<input οnclick="this.form.reset()" type="button" value="重置" />
<asp:Button ID="UploadButton" Text="开始上传" runat="server" OnClick="UploadButton_Click" />
</p>
<p>
<asp:Label ID="lblStatus" runat="server"></asp:Label>
</p>
</div>
</form>
</body>
</html>
MultiUpload.aspx.cs
程序代码
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class MultiUpload : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
private Boolean SaveImages()
{
//遍历File表单元素
HttpFileCollection files = HttpContext.Current.Request.Files;
//状态信息
System.Text.StringBuilder strMsg = new System.Text.StringBuilder();
strMsg.Append("上传的文件分别是:<hr color=#FF0000 />");
try
{
for (int iFile = 0; iFile < files.Count; iFile++)
{
//检查文件扩展名字
HttpPostedFile postedFile = files[iFile];
string fileName, fileExtension;
fileName = System.IO.Path.GetFileName(postedFile.FileName);
if (!string.IsNullOrEmpty(fileName))
{
fileExtension = System.IO.Path.GetExtension(fileName);
strMsg.Append("上传的文件类型:" + postedFile.ContentType.ToString() + "<br />");
strMsg.Append("客户端文件地址:" + postedFile.FileName + "<br />");
strMsg.Append("上传文件的文件名:" + fileName + "<br />");
strMsg.Append("上传文件的扩展名:" + fileExtension + "<br /><hr />");
//可根据扩展名字的不同保存到不同的文件夹
postedFile.SaveAs(System.Web.HttpContext.Current.Request.MapPath("images/") + fileName);
}
}
lblStatus.Text = strMsg.ToString();
return true;
}
catch (Exception ex)
{
lblStatus.Text = ex.Message;
return false;
}
}
protected void UploadButton_Click(object sender, EventArgs e)
{
Boolean uploadsuccess = SaveImages();
if (!uploadsuccess)
lblStatus.Text = "上传失败!";
}
}
方法一:使用JS代码
我们在表单里面的 TextBox (asp.net控件),然后在里面添加 attributes 响应对 JS 函数处理。
Default.cs
//Add the javascript so we know where we want the enter key press to go
if (!IsPostBack)
{
txtboxFirstName.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");
txtboxLastName.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");
txtboxAddress1.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");
txtboxAddress2.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");
txtboxCity.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");
txtboxState.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");
txtboxZipcode.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");
}
然后在default.aspx的页面里面写入下面的js代码:
<SCRIPT type=text/javascript>
function doClick(buttonName,e)
{
//the purpose of this function is to allow the enter key to
//point to the correct button to click.
var key;
if(window.event)
key = window.event.keyCode; //IE
else
key = e.which; //firefox
if (key == 13)
{
//Get the button the user wants to have clicked
var btn = document.getElementById(buttonName);
if (btn != null)
{ //If we find the button click it
btn.click();
event.keyCode = 0
}
}
}
</SCRIPT>
方法二:使用 Panel 来实现
panel 的实现方法实现起来很简单,不用写任何一行代码。把我们的 TextBox 放到 panel 控件里面,然后设置 panel 控件的 defaultbutton 的属性为我们要响应的那个button的id。
<asp:Panel ID="panSearch" runat="server" DefaultButton="btnSearch2" Width="100%" >
我们在表单里面的 TextBox (asp.net控件),然后在里面添加 attributes 响应对 JS 函数处理。
Default.cs
程序代码
//Add the javascript so we know where we want the enter key press to go
if (!IsPostBack)
{
txtboxFirstName.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");
txtboxLastName.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");
txtboxAddress1.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");
txtboxAddress2.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");
txtboxCity.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");
txtboxState.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");
txtboxZipcode.Attributes.Add("onKeyPress", "doClick('" + btnSearch.ClientID + "',event)");
}
然后在default.aspx的页面里面写入下面的js代码:
程序代码
<SCRIPT type=text/javascript>
function doClick(buttonName,e)
{
//the purpose of this function is to allow the enter key to
//point to the correct button to click.
var key;
if(window.event)
key = window.event.keyCode; //IE
else
key = e.which; //firefox
if (key == 13)
{
//Get the button the user wants to have clicked
var btn = document.getElementById(buttonName);
if (btn != null)
{ //If we find the button click it
btn.click();
event.keyCode = 0
}
}
}
</SCRIPT>
方法二:使用 Panel 来实现
panel 的实现方法实现起来很简单,不用写任何一行代码。把我们的 TextBox 放到 panel 控件里面,然后设置 panel 控件的 defaultbutton 的属性为我们要响应的那个button的id。
程序代码
<asp:Panel ID="panSearch" runat="server" DefaultButton="btnSearch2" Width="100%" >
这里的技术规范主要是开发过程的代码规范、数据库设计规范、
Com
和
.Net
互操作规范;实践精华是对技术实践过程中的部分总结。
良好的代码风格来自于同一的代码规范。风格良好的代码不仅具备可读性和可维护性,同时也给人行云流水、赏心悦目之快感。
据
Microsoft
公司统计,基于微软平台的开发中,有
70-80%
的印度工程师在完成同类算法或者模块时,使用的代码基本一致;而相同的调查中只有
20%
的中国工程师们是基本一致的。这说明我们的代码生产过程亟待规范。
类型、变量、常量、方法等标识符一律采用对应的英文实义;如果涉及到两个独立的实义单词,则中间用下划线间隔或者单词首字母大写(两种方式都可以);如果标识符的长度超过了
30
个字母,则基本上以英文单词发音的重读音节取选出三个字母,如
Repeater
用
rpt
,
Management
用
mgt
。
目前一般有两种大小写规则:
Pascal
大小写形式,所有单词第一个字母大写,其他字母小写。
Camel
大小写形式,除了第一个单词,所有单词第一个字母大写,其他字母小写。
n
类名使用
Pascal
大小写形式
public class HelloWorld
(或者
Hello_World
,以下同,不再赘述)
{
...
}
n
方法使用
Pascal
大小写形式
public class HelloWorld
()
{
void SayHello(string name)
{
...
}
}
n
变量和方法参数使用
Camel
大小写形式
public class HelloWorld
()
{
int totalCount = 0;
void SayHello(string name)
{
string fullMessage = "Hello " + name;
...
}
}
n
不要使用匈牙利方法来命名变量
以前,多数程序员喜欢把数据类型作为变量名的前缀而
m_
作为成员变量的前缀。例如:
string m_sName
;
int nAge
;
然而,这种方式在
.NET
编码规范中是不推荐的。所有变量都用
Camel
大小写形式,而不是用数据类型和
m_
来作前缀。
用
name
,
address
,
salary
等代替
nam
,
addr
,
sal
。
别使用单个字母的变量象
i
,
n
,
x
等。使用
index
,
temp
等。用于循环迭代的变量例外:
如果变量只用于迭代计数,没有在循环的其他地方出现,允许用单个字母的变量命名,而不是另外取实义名。
文件名要和类名匹配,例如,对于类
HelloWorld
,相应的文件名应为
helloworld.cs
。
n
缩进用
TAB
,不用
SPACES
。
n
注释需代码对齐。
n
遵循
VS2005
的自动对齐规则,不要人为的调整。
n
用一个空行来分开代码的逻辑分组。
n
在一个类中,各个方法的实现体必须用空行间隔,大括弧“
{}
”需独立一行。
n 在每个运算符和括号的前后都空一格。如:
{
for ( int i = 0; i < 10; i++ )
{
//
}
}
而不是:
if(showResult==true)
{
for(int i= 0;i<10;i++)
{
//
}
}
n
避免使用大文件。如果一个文件里的代码超过
300
~
400
行,必须考虑将代码分开到不同类中。
n
避免写太长的方法。一个典型的方法代码在
1
~
30
行之间。如果一个方法发代码超过
30
行,应该考虑将其分解为不同的方法。
n
方法名需能看出它作什么。别使用会引起误解的名字。如果名字一目了然,就无需用文档来解释方法的功能了。
n
一个方法只完成一个任务。不要把多个任务组合到一个方法中,即使那些任务非常小。
n
使用
C#
的特有类型,而不是
System
命名空间中定义的别名类型。如:
int age;
string name;
object contactInfo;
而不是:
Int16 age;
String name;
Object contactInfo;
这么做是基于如下两点原因:(
1
)规范性和一致性;(
2
)便于跨语言平台的移植。
n
别在程序中使用固定数值,用常量代替。别用字符串常数,尽量用资源文件。
n
避免使用很多成员变量,声明局部变量,并传递给方法。
n
不要在方法间共享成员变量,如果在几个方法间共享一个成员变量,那就很难知道是哪个方法在什么时候修改了它的值。必要时使用
enum
,别用数字或字符串来指示离散值。
n
别把成员变量声明为
public
或
protected
。都声明为
private
而使用
public/protected
的
Properties
。
n
不在代码中使用具体的路径和驱动器名,使用相对路径,并使路径可编程。永远别设想你的代码是在
"C:"
盘运行。你不会知道,一些用户在网络或
"Z:"
盘运行程序。
n
应用程序启动时作些“自检”并确保所需文件和附件在指定的位置。必要时检查数据库连接,出现任何问题给用户一个友好的提示。
n
如果需要的配置文件找不到,应用程序需能自己创建使用默认值。如果在配置文件中发现错误值,应用程序要抛出错误,给出提示消息告诉用户正确值。错误消息需能帮助用户解决问题。
n
别每行代码,每个声明的变量都做注释。在需要的地方注释。
n
可读性强的代码需要很少的注释,如果所有的变量和方法的命名都很有意义,会使代码可读性很强并无需太多注释。行数不多的注释会使代码看起来优雅。
n
如果因为某种原因使用了复杂艰涩的原理,必须为程序配备良好的文档和详细的注释。
n
对注释做拼写检查,保证语法和标点符号的正确使用。
n
数据表的分类
u
系统表
支撑业务模型的数据表,如流程模型、系统管理相关表。
u
业务表
产品提供的针对业务的通用功能模块相关表,如通用业务查询等。
u
用户表
用户二次开发使用的与具体业务相关的数据表。
n
数据表的命名
u
所有表格命名一律以字母“
T
”开头(
Table
),并且用实义单词以下划线“
_
”间隔。
u
系统表
系统表前缀为:
TSYS_
u
业务表前缀为:
TBIZ_
u
用户表由用户自行定义,但是建议不要与系统表和业务表的命名规则重复。
n
字段的命名
字段的命名规则参照代码标识符的命名规则,但是注意避开数据库的保留字。比如不要采用这样的字段名:
index
,
field
,
password
,
id
,
Oracle
,
SQL
等等。
对于涉及到技术核心的系统表,为了防止剖析,建议采用类似“
F1
,
F2
,
F3
……
Fn
”的方式命名。但是不要采用“
F0”,因为这个名称在某些数据库中不被允许,比如Interbase
。
n
索引是一把双刃剑,索引将提高查询的效率,但是却降低了
insert/delete/update
的效率。
n
通常情况下,对数据的编辑频度和时限要求远远低于对数据库的查询要求,因此对于记录很多且频繁查询的数据表,必须建立索引。
n
大多数数据库为主键字段自动创建索引,注意为外键创建索引。
n
不要索引大字段,这样作会让索引占用太多的存储空间。
n
尽量不要索引频繁编辑的小型表。
n
identify
字段不要作为表的主键与其它表关联,这将会影响到该表的数据迁移。如果考虑支持多数据库,建议主键采用程序生成的唯一值。
n
如果一个大型表需要频繁的做
insert/delete/update
操作,同时也需要做高并发量的查询,那么建议根据数据的访问频度对表作拆分,而后建立索引。
数据库厂商为了凸现自身的优势,都提供了丰富且个性化的过程与函数。
为了提升产品的伸缩性和数据无关性,请不要使用与特定数据库相关的过程与函数,也不推荐采用
Store Procedure
,建议使用应用服务器的中间层业务对象。
n
尽量避免使用
Blob
,如果一定要用,请不要索引
blob
,并且不要定义多个
blob
。
n
不要使用日期字段,改用字符串
char(19)
替代,如:
2008-12-09 12:22:08
。
n
对于确定长度的串,请固定字段类型的长度,如
char
(
80
),不要采用
varchar
。
n
对于值类型字段,请使用对应的数据库值类型,而不要用字符串。
Com和.Net互操作规范
.NET
技术已经成为微软平台的主流,但是在
Win32
时代开发了很多
COM
、
DCOM
组件,由于在开发
COM
组件时投入了大量的人力、财力,如何在
.NET
环境下重用这些
COM
组件就显得更有意义。
.NET
支持运行时通过
COM
、
COM
+、本地
WinAPI
调用与未托管代码的双向互操作性,要实现互操作性,必须首先引入
.NET Framework
的
System.Runtime.InteropServices
命名空间。
C#
的语法为:
using System.Runtime.InteropServices;
(
1
)
.NET
访问
API
.NET
允许
C
#访问未托管的
DLL
的函数。如要调用
Windows User32.dll
的
MessageBox
函数
:
int MessageBox(HWND hwnd,LPCTSTR lpText, LPCTSTR lpCaption,UINT uType)
可以声明一个具有
DLLImport
属性的
static extern
方法:
using System.Runtime.InteropServices
;
[DllImport(“user32.dll”)]
static ertern int MessageBox(int hwnd,string text,string caption,int type);
然后在代码里面直接调用就可以了。这里要注意在调用返回字符串的
API
中使用
StringBuilder
对象。
(
2
)
.NET
访问
COM
组件
从
.
NET
调用
COM
组件比较容易,只要使用
tlbimp.exe
产生
COM
的装配形式的
WarpClass
,然后在
.NET
项目中调用即可。
注意
COM
的类型信息通过
Type Library
文件描述,
.NET
装配件是自描述的。
Tlbimp
的作用是从
COM
组件及其类型信息中产生自描述的装配件。
1
.编写
Com
组件
编译生成一个
ComAccount.dll
。
2.
产生
.NET
可访问的包装类(
assembly
),使用
TlbImp.exe
产生
.NET
装配件。
TlbImp /out
:
NetAccount.dll ComAccount.dll
3
.在
.NET
代码中访问
.NET
代码只需引用
NetAccount.dll,
就可以像访问
.NET
的装配件一样访问
COM
组件。
n
在应用程序级(线程级)错误处理器中处理所有的一般异常。遇到“意外的一般性错误”时,此刻错误处理器应该捕捉异常,给用户提示消息,在应用程序关闭或用户选择“忽略并继续”之前记录错误信息。
n
不必每个方法都用
try-catch
,当特定的异常可能发生时才使用。比如,当写文件时,处理异常
FileIOException
。
n
别写太大的
try-catch
模块。如果需要,为每个执行的任务编写单独的
try-catch
模块。这将有助于找出哪一段代码产生异常,并给用户发出特定的错误消息。
n
如果应用程序需要,可以编写自己的异常类。自定义异常不应从基类
SystemException
派生,而要继承于
IApplicationException
。
n
在开发阶段,不必在所有方法中捕捉一般异常。刻意的放纵异常,将帮助在开发周期发现大多数的错误。
n
不要捕捉了异常却什么也不做,看起来系统似乎在正常运行。如果这样隐藏了一个异常,将永远不知道异常到底是否发生,为什么发生。
n
发生异常时,给出友好的消息给用户。但要精确记录错误的所有可能细节,包括发生的时间,和相关方法,类名等。
n
永远别用像“应用程序出错”,“发现一个错误”等错误提示消息,而应给出类似“更新数据库失败,请确保登陆
id
和密码正确。”之类的具体消息。
n
显示错误消息时,还应提示用户如何解决问题。如:“更新数据库失败,请确保登陆
id
和密码正确。”,而不是仅仅说“更新数据库失败”。
n
显示给用户的消息要简短而友好。但要把所有可能的信息都记录下来,以助诊断问题。
推荐如下异常处理模式:
void ReadFromFile ( string fileName )
{
try
{
//
读文件
.
}
catch (FileIOException ex)
{
//
记载异常日志
//
重抛具有针对性的异常信息
throw;
}
}
不推荐如下的异常处理模式:
void ReadFromFile ( string fileName )
{
try
{
//
读文件
}
catch (Exception ex)
{
//
捕捉一般异常将让我们永远不知道到底是文件错误还是其他错误
//
隐藏异常将我们永远不知道有错误发生。
return "";
}
}
.Net
平台的垃圾回收机制,可以自动的
dispose
不再引用的对象实例,所以很多开发人员并不主动释放申请的对象资源。事实上,在对象的生命周期结束之前是不会被释放的。
但是,很多时候当对象处于生命周期之内时,我们不再使用它,以便释放资源提升系统效率。因此,主动释放申请的资源显得很有必要。
永远不要把力所能及的事情交给操作系统,及时释放不再使用的资源是一个好习惯。
数据库访问永远是系统的瓶颈,选择高效、稳健的数据库访问模式是产品性能的基础保证。
n
永远不要假设你的应用系统构建与某个数据库之上,因此必须有统一的、透明的数据库访问机制。
n
采用
ADO.Net
访问数据库
基于效率和稳定性的考量,采用微软平台原生的数据库访问模式
ADO.Net
。使用
ADO.Net
可以通过
OLEDB
和
ODBC
两种模式访问数据库,我们建议使用数据库厂商提供的
OLEDB
模式,这种模式绕过了
ODBC
,使得数据库的游标性能大大提升,效率更佳。
n
不使用第三方的数据持久层
使用类似于
Nhibernate
之类的第三方数据持久层工具虽然可以提高开发的效率,但是却降低了系统的性能。性能对于产品而言,远远比开发效率重要的多。况且基于
VS2005
的开发,效率不是问题。
n
使用自主产权的数据对象
直接采用
ADO.Net
封装最底层的数据访问方法:插入、删除和更新,以及事务管理等;客户端和服务器端采用相同的数据访问机制,并设立连接缓冲池提升数据访问效率。
对于多层分布式应用而言,数据库事务呈现出“远程、分布”的特色,导致事务难以管理。
对于
Ado.Net
而言,事务绑定了数据库连接,因此必须在数据访问对象中对每一个数据库连接管理各自的事务或嵌套事务。如果要访问数据库,服务器上的数据访问对象将自动分配一个特定的连接,根据该连接
ID
执行数据操作;无论该事务分布于多少个远程客户端进程,服务器数据对象只需要锁定连接
ID
即可轻松进行事务管理。
智能客户端是易于部署和管理的客户端应用程序,它综合了瘦客户端和胖客户端的优点,通过统筹使用本地资源和到分布式数据资源的智能连接,提供快速响应的和丰富的交互式体验。
n
利用网络资源
n
支持偶尔连接的用户
n
提供智能安装和更新
n
提供客户端设备灵活性
.NET 框架基类库内嵌了支持智能客户端的丰富程序集,通过使用公共语言运行库 (CLR),可以利用任何受到 .NET 支持的语言来开发智能客户端。
智能客户端是瘦客户段的强大替代品,也是微软推荐的客户端模式。尽量使用智能客户端而不要使用浏览器。如果可以,请把你的客户端系统构建在
Office
平台上,如
Outlook
。
智能客户端分为Windows Form,Office Client,Mobile Client三种类型,具有如下特点:
n
利用本地资源
If ( showResult == true )
程序代码
private void btnUploadPicture_Click(object sender, System.EventArgs e)
{
//检查上传文件的格式是否有效
if(this.UploadFile.PostedFile.ContentType.ToLower().IndexOf("image") < 0)
{
Response.Write("上传图片格式无效!");
return;
}
//生成原图
Byte[] oFileByte = new byte[this.UploadFile.PostedFile.ContentLength];
System.IO.Stream oStream = this.UploadFile.PostedFile.InputStream;
System.Drawing.Image oImage = System.Drawing.Image.FromStream(oStream);
int oWidth = oImage.Width; //原图宽度
int oHeight = oImage.Height; //原图高度
int tWidth = 100; //设置缩略图初始宽度
int tHeight = 100; //设置缩略图初始高度
//按比例计算出缩略图的宽度和高度
if(oWidth >= oHeight)
{
tHeight = (int)Math.Floor(Convert.ToDouble(oHeight) * (Convert.ToDouble(tWidth) / Convert.ToDouble(oWidth)));
}
else
{
tWidth = (int)Math.Floor(Convert.ToDouble(oWidth) * (Convert.ToDouble(tHeight) / Convert.ToDouble(oHeight)));
}
//生成缩略原图
Bitmap tImage = new Bitmap(tWidth,tHeight);
Graphics g = Graphics.FromImage(tImage);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //设置高质量插值法
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置高质量,低速度呈现平滑程度
g.Clear(Color.Transparent); //清空画布并以透明背景色填充
g.DrawImage(oImage,new Rectangle(0,0,tWidth,tHeight),new Rectangle(0,0,oWidth,oHeight),GraphicsUnit.Pixel);
string oFullName = Server.MapPath(".") + "/" + "o" + DateTime.Now.ToShortDateString().Replace("-","") + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString() + ".jpg"; //保存原图的物理路径
string tFullName = Server.MapPath(".") + "/" + "t" + DateTime.Now.ToShortDateString().Replace("-","") + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString() + ".jpg"; //保存缩略图的物理路径
try
{
//以JPG格式保存图片
oImage.Save(oFullName,System.Drawing.Imaging.ImageFormat.Jpeg);
tImage.Save(tFullName,System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch(Exception ex)
{
throw ex;
}
finally
{
//释放资源
oImage.Dispose();
g.Dispose();
tImage.Dispose();
}
}
1.加密
Response.Redirect("DetailInfo.aspx?id=" + Convert.ToBase64String(System.Text.Encoding.Default.GetBytes("sp10006")).Replace("+","%2B"));
2.解密
string ID = System.Text.Encoding.Default.GetString(Convert.FromBase64String(Request.QueryString["id"].ToString().Replace("%2B","+")));
程序代码
Response.Redirect("DetailInfo.aspx?id=" + Convert.ToBase64String(System.Text.Encoding.Default.GetBytes("sp10006")).Replace("+","%2B"));
2.解密
程序代码
string ID = System.Text.Encoding.Default.GetString(Convert.FromBase64String(Request.QueryString["id"].ToString().Replace("%2B","+")));
程序代码
using System.Net.Mail;
......
/// <summary>
/// .NET 2.0 发送邮件方法
/// </summary>
/// <param name="strSmtpServer">邮件服务器地址(如:smtp.163.com)</param>
/// <param name="strFrom">发送地址(如:test@163.com)</param>
/// <param name="strFromPass">发送密码(如:123456)</param>
/// <param name="strto">接收地址(如:test@gmail.com)</param>
/// <param name="strSubject">邮件主题</param>
/// <param name="strBody">邮件内容</param>
public static void SendSMTPEMail(string strSmtpServer, string strFrom, string strFromPass, string strto, string strSubject, string strBody)
{
SmtpClient client = new SmtpClient(strSmtpServer);
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential(strFrom, strFromPass);
client.DeliveryMethod = SmtpDeliveryMethod.Network;
MailMessage message = new MailMessage(strFrom, strto, strSubject, strBody);
message.BodyEncoding = System.Text.Encoding.Default;
message.IsBodyHtml = true;
client.Send(message);
}
通常web应用程序在发布后,为了给用户一个友好界面和使用体验,都会在错误发生时跳转至一个自定义的错误页面,而不是asp.net向用户暴露出来的详细的异常列表。
简单的错误处理页面可以通过web.config来设置
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
如果想通过编程的方式来呈现错误原因,可以通过Page_Error事件来做这件事.
另一种方式则可以通过Global.asax来实现,我觉得这种方式较为方便,另外如果能结合一个单独的更加友好的页面,则看来起更舒服一些
Global.asax(如果需要,可以记录错误日志)
void Application_Error(object sender, EventArgs e)
{
Exception objErr = Server.GetLastError().GetBaseException();
string error = "发生异常页: " + Request.Url.ToString() + "<br>";
error += "异常信息: " + objErr.Message + "<br>";
Server.ClearError();
Application["error"] = error;
Server.Transfer("~/ErrorPage/ErrorPage.aspx");
}
ErrorPage.aspx
protected void Page_Load(object sender, EventArgs e)
{
ErrorMessageLabel.Text = Application["error"].ToString();
}
当最终用户使用应用程序的时候,他们可能不想知道错误的原因,这个时候,我们可以通过复选框来实现,是否呈现错误的原因。可将Label放在一个div中,然后用复选框来决定是否呈现div
<script language="javascript" type="text/javascript">
<!--
function CheckError_onclick() {
var chk = document.getElementById("CheckError");
var divError = document.getElementById("errorMsg");
if(chk.checked)
{
divError.style.display = "inline";
}
else
{
divError.style.display = "none";
}
}
// -->
</script>
我们可以对errorpage这页做一些更亲切的设计,让人看起来更舒服些。
简单的错误处理页面可以通过web.config来设置
程序代码
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
如果想通过编程的方式来呈现错误原因,可以通过Page_Error事件来做这件事.
另一种方式则可以通过Global.asax来实现,我觉得这种方式较为方便,另外如果能结合一个单独的更加友好的页面,则看来起更舒服一些
Global.asax(如果需要,可以记录错误日志)
程序代码
void Application_Error(object sender, EventArgs e)
{
Exception objErr = Server.GetLastError().GetBaseException();
string error = "发生异常页: " + Request.Url.ToString() + "<br>";
error += "异常信息: " + objErr.Message + "<br>";
Server.ClearError();
Application["error"] = error;
Server.Transfer("~/ErrorPage/ErrorPage.aspx");
}
ErrorPage.aspx
程序代码
protected void Page_Load(object sender, EventArgs e)
{
ErrorMessageLabel.Text = Application["error"].ToString();
}
当最终用户使用应用程序的时候,他们可能不想知道错误的原因,这个时候,我们可以通过复选框来实现,是否呈现错误的原因。可将Label放在一个div中,然后用复选框来决定是否呈现div
程序代码
<script language="javascript" type="text/javascript">
<!--
function CheckError_onclick() {
var chk = document.getElementById("CheckError");
var divError = document.getElementById("errorMsg");
if(chk.checked)
{
divError.style.display = "inline";
}
else
{
divError.style.display = "none";
}
}
// -->
</script>
我们可以对errorpage这页做一些更亲切的设计,让人看起来更舒服些。
效果图:
完整文件: 点击下载此文件
下面是GDI+绘图的代码段及显示的调用方法:
一、建立png.aspx文件,cs代码如下:
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.Drawing;
using System.Text;
public partial class png : System.Web.UI.Page
{
private static string checkCode = "";
protected void Page_Load(object sender, EventArgs e)
{
switch (Request.QueryString["aa"])
{
case "1": //汉字
checkCode = stxt();
Session["checkCode"] = stxt();
break;
case "2": //数字
checkCode = GetRandomint();
Session["checkCode"] = GetRandomint();
break;
case "3": //字母、数字和汉字
checkCode = RndNum(4);
Session["checkCode"] = RndNum(4);
break;
default:
checkCode = RndNum(4); //字母、数字和汉字
Session["checkCode"] = RndNum(4);
break;
}
CreateImages(checkCode);
}
/// <summary>
/// 生成验证图片
/// </summary>
/// <param name="checkCode">验证字符</param>
private void CreateImages(string checkCode)
{
int iwidth = (int)(checkCode.Length * 22);
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 25);
Graphics g = Graphics.FromImage(image);
g.Clear(Color.White);
//定义颜色
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
//定义字体
string[] font = { "Arial", "Microsoft Sans Serif", "Verdana", "宋体" };
Random rand = new Random();
//随机输出噪点
for (int i = 0; i < 50; i++)
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height);
g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
}
//输出不同字体和颜色的验证码字符
for (int i = 0; i < checkCode.Length; i++)
{
int cindex = rand.Next(7);
int findex = rand.Next(4);
Font f = new System.Drawing.Font(font[findex], 12, System.Drawing.FontStyle.Bold);
Brush b = new System.Drawing.SolidBrush(c[cindex]);
g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * 19), 2);
}
//画一个边框
g.DrawRectangle(new Pen(Color.Black, 0), 0, 0, image.Width - 1, image.Height - 1);
//输出到浏览器
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
HttpContext.Current.Response.ClearContent();
//Response.ClearContent();
HttpContext.Current.Response.ContentType = "image/Jpeg";
HttpContext.Current.Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}
/// <summary>
/// 生成数字
/// </summary>
private String GetRandomint()
{
Random random = new Random();
return (random.Next(1000, 9999).ToString());
}
/*
此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将
四个字节数组存储在object数组中。
参数:strlength,代表需要产生的汉字个数
*/
public static object[] CreateRegionCode(int strlength)
{
//定义一个字符串数组储存汉字编码的组成元素
string[] rBase = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
Random rnd = new Random();
//定义一个object数组用来
object[] bytes = new object[strlength];
/**/
/*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中
每个汉字有四个区位码组成
区位码第1位和区位码第2位作为字节数组第一个元素
区位码第3位和区位码第4位作为字节数组第二个元素
*/
for (int i = 0; i < strlength; i++)
{
//区位码第1位
int r1 = rnd.Next(11, 14);
string str_r1 = rBase[r1].Trim();
//区位码第2位
rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i);//更换随机数发生器的种子避免产生重复值
int r2;
if (r1 == 13)
{
r2 = rnd.Next(0, 7);
}
else
{
r2 = rnd.Next(0, 16);
}
string str_r2 = rBase[r2].Trim();
//区位码第3位
rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);
int r3 = rnd.Next(10, 16);
string str_r3 = rBase[r3].Trim();
//区位码第4位
rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);
int r4;
if (r3 == 10)
{
r4 = rnd.Next(1, 16);
}
else if (r3 == 15)
{
r4 = rnd.Next(0, 15);
}
else
{
r4 = rnd.Next(0, 16);
}
string str_r4 = rBase[r4].Trim();
//定义两个字节变量存储产生的随机汉字区位码
byte byte1 = Convert.ToByte(str_r1 + str_r2, 16);
byte byte2 = Convert.ToByte(str_r3 + str_r4, 16);
//将两个字节变量存储在字节数组中
byte[] str_r = new byte[] { byte1, byte2 };
//将产生的一个汉字的字节数组放入object数组中
bytes.SetValue(str_r, i);
}
return bytes;
}
/// <summary>
/// 生成汉字
/// </summary>
private string stxt()
{
Encoding gb = Encoding.GetEncoding("gb2312");
//调用函数产生4个随机中文汉字编码
object[] bytes = CreateRegionCode(4);
//根据汉字编码的字节数组解码出中文汉字
string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));
string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));
string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));
string str4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));
string txt = str1 + str2 + str3 + str4;
return txt;
}
/// <summary>
/// 生成文字,字母,数字混合
/// </summary>
public String RndNum(int VcodeNum)
{
String Vchar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z,呵,哈,弹,簧,秤,嬉,戏";
String[] VcArray = Vchar.Split(',');
String VNum = "";
Random random = new Random();
for (int i = 1; i <= VcodeNum; i++)
{
int iNum = 0;
while ((iNum = Convert.ToInt32(VcArray.Length * random.NextDouble())) == VcArray.Length)
{
iNum = Convert.ToInt32(VcArray.Length * random.NextDouble());
}
VNum += VcArray[iNum];
}
return VNum;
}
}
二、我们调用的页页的代码如下:
HTML代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="view.aspx.cs" Inherits="view" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=" http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Image ID="Image1" runat="server" ImageUrl="png.aspx" /><br />
<br />
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Button" />
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
<asp:ListItem Value="3">默认</asp:ListItem>
<asp:ListItem Value="1">文字</asp:ListItem>
<asp:ListItem Value="2">数字</asp:ListItem>
<asp:ListItem Value="3">混合</asp:ListItem>
</asp:DropDownList></div>
</form>
</body>
</html>
cs代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class view : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
switch (DropDownList1.SelectedValue)
{
case "1":
Image1.ImageUrl = "png.aspx?aa=1";
break;
case "2":
Image1.ImageUrl = "png.aspx?aa=2";
break;
case "3":
Image1.ImageUrl = "png.aspx?aa=3";
break;
}
}
protected void Button2_Click(object sender, EventArgs e)
{
if (TextBox1.Text == Session["checkCode"].ToString())
Response.Write("OK,正确");
else
Response.Write("验证码不符合");
}
}
完整文件: 点击下载此文件
下面是GDI+绘图的代码段及显示的调用方法:
一、建立png.aspx文件,cs代码如下:
程序代码
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.Drawing;
using System.Text;
public partial class png : System.Web.UI.Page
{
private static string checkCode = "";
protected void Page_Load(object sender, EventArgs e)
{
switch (Request.QueryString["aa"])
{
case "1": //汉字
checkCode = stxt();
Session["checkCode"] = stxt();
break;
case "2": //数字
checkCode = GetRandomint();
Session["checkCode"] = GetRandomint();
break;
case "3": //字母、数字和汉字
checkCode = RndNum(4);
Session["checkCode"] = RndNum(4);
break;
default:
checkCode = RndNum(4); //字母、数字和汉字
Session["checkCode"] = RndNum(4);
break;
}
CreateImages(checkCode);
}
/// <summary>
/// 生成验证图片
/// </summary>
/// <param name="checkCode">验证字符</param>
private void CreateImages(string checkCode)
{
int iwidth = (int)(checkCode.Length * 22);
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 25);
Graphics g = Graphics.FromImage(image);
g.Clear(Color.White);
//定义颜色
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
//定义字体
string[] font = { "Arial", "Microsoft Sans Serif", "Verdana", "宋体" };
Random rand = new Random();
//随机输出噪点
for (int i = 0; i < 50; i++)
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height);
g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
}
//输出不同字体和颜色的验证码字符
for (int i = 0; i < checkCode.Length; i++)
{
int cindex = rand.Next(7);
int findex = rand.Next(4);
Font f = new System.Drawing.Font(font[findex], 12, System.Drawing.FontStyle.Bold);
Brush b = new System.Drawing.SolidBrush(c[cindex]);
g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * 19), 2);
}
//画一个边框
g.DrawRectangle(new Pen(Color.Black, 0), 0, 0, image.Width - 1, image.Height - 1);
//输出到浏览器
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
HttpContext.Current.Response.ClearContent();
//Response.ClearContent();
HttpContext.Current.Response.ContentType = "image/Jpeg";
HttpContext.Current.Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}
/// <summary>
/// 生成数字
/// </summary>
private String GetRandomint()
{
Random random = new Random();
return (random.Next(1000, 9999).ToString());
}
/*
此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将
四个字节数组存储在object数组中。
参数:strlength,代表需要产生的汉字个数
*/
public static object[] CreateRegionCode(int strlength)
{
//定义一个字符串数组储存汉字编码的组成元素
string[] rBase = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
Random rnd = new Random();
//定义一个object数组用来
object[] bytes = new object[strlength];
/**/
/*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中
每个汉字有四个区位码组成
区位码第1位和区位码第2位作为字节数组第一个元素
区位码第3位和区位码第4位作为字节数组第二个元素
*/
for (int i = 0; i < strlength; i++)
{
//区位码第1位
int r1 = rnd.Next(11, 14);
string str_r1 = rBase[r1].Trim();
//区位码第2位
rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i);//更换随机数发生器的种子避免产生重复值
int r2;
if (r1 == 13)
{
r2 = rnd.Next(0, 7);
}
else
{
r2 = rnd.Next(0, 16);
}
string str_r2 = rBase[r2].Trim();
//区位码第3位
rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);
int r3 = rnd.Next(10, 16);
string str_r3 = rBase[r3].Trim();
//区位码第4位
rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);
int r4;
if (r3 == 10)
{
r4 = rnd.Next(1, 16);
}
else if (r3 == 15)
{
r4 = rnd.Next(0, 15);
}
else
{
r4 = rnd.Next(0, 16);
}
string str_r4 = rBase[r4].Trim();
//定义两个字节变量存储产生的随机汉字区位码
byte byte1 = Convert.ToByte(str_r1 + str_r2, 16);
byte byte2 = Convert.ToByte(str_r3 + str_r4, 16);
//将两个字节变量存储在字节数组中
byte[] str_r = new byte[] { byte1, byte2 };
//将产生的一个汉字的字节数组放入object数组中
bytes.SetValue(str_r, i);
}
return bytes;
}
/// <summary>
/// 生成汉字
/// </summary>
private string stxt()
{
Encoding gb = Encoding.GetEncoding("gb2312");
//调用函数产生4个随机中文汉字编码
object[] bytes = CreateRegionCode(4);
//根据汉字编码的字节数组解码出中文汉字
string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));
string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));
string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));
string str4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));
string txt = str1 + str2 + str3 + str4;
return txt;
}
/// <summary>
/// 生成文字,字母,数字混合
/// </summary>
public String RndNum(int VcodeNum)
{
String Vchar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z,呵,哈,弹,簧,秤,嬉,戏";
String[] VcArray = Vchar.Split(',');
String VNum = "";
Random random = new Random();
for (int i = 1; i <= VcodeNum; i++)
{
int iNum = 0;
while ((iNum = Convert.ToInt32(VcArray.Length * random.NextDouble())) == VcArray.Length)
{
iNum = Convert.ToInt32(VcArray.Length * random.NextDouble());
}
VNum += VcArray[iNum];
}
return VNum;
}
}
二、我们调用的页页的代码如下:
HTML代码
程序代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="view.aspx.cs" Inherits="view" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=" http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Image ID="Image1" runat="server" ImageUrl="png.aspx" /><br />
<br />
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Button" />
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
<asp:ListItem Value="3">默认</asp:ListItem>
<asp:ListItem Value="1">文字</asp:ListItem>
<asp:ListItem Value="2">数字</asp:ListItem>
<asp:ListItem Value="3">混合</asp:ListItem>
</asp:DropDownList></div>
</form>
</body>
</html>
cs代码:
程序代码
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class view : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
switch (DropDownList1.SelectedValue)
{
case "1":
Image1.ImageUrl = "png.aspx?aa=1";
break;
case "2":
Image1.ImageUrl = "png.aspx?aa=2";
break;
case "3":
Image1.ImageUrl = "png.aspx?aa=3";
break;
}
}
protected void Button2_Click(object sender, EventArgs e)
{
if (TextBox1.Text == Session["checkCode"].ToString())
Response.Write("OK,正确");
else
Response.Write("验证码不符合");
}
}
HTML页面:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Tree.aspx.cs" Inherits="Tree" %>
<html>
<head runat="server">
<title>Asp.net 2.0 Treeview 无限级无刷新示例</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:treeview ID="Treeview1" runat="server" ImageSet="XPFileExplorer" AutoGenerateDataBindings="false" ExpandDepth="0" OnTreeNodePopulate="Treeview1_TreeNodePopulate">
<SelectedNodeStyle BackColor="#B5B5B5"></SelectedNodeStyle>
<Nodes>
<asp:TreeNode Value="C:" Text="C:" PopulateOnDemand="true" SelectAction="Select" NavigateUrl="#" >
</asp:TreeNode>
</Nodes>
<NodeStyle VerticalPadding="2" Font-Names="Tahoma" Font-Size="8pt" HorizontalPadding="2"
ForeColor="Black"></NodeStyle>
<HoverNodeStyle Font-Underline="True" ForeColor="#6666AA"></HoverNodeStyle>
</asp:treeview>
</div>
</form>
</body>
</html>
.cs页面
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
public partial class Tree : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Treeview1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
{
if (IsCallback)
{
if (e.Node.ChildNodes.Count == 0)
{
LoadChildNode(e.Node);
}
}
}
private void LoadChildNode(TreeNode node)
{
DirectoryInfo directory;
directory = new DirectoryInfo(node.Value);
foreach (DirectoryInfo sub in directory.GetDirectories())
{
TreeNode subNode = new TreeNode(sub.Name);
subNode.Value = sub.FullName;
try
{
if (sub.GetDirectories().Length > 0 || sub.GetFiles().Length > 0)
{
subNode.SelectAction = TreeNodeSelectAction.SelectExpand;
subNode.PopulateOnDemand = true;
subNode.NavigateUrl = "#";
}
}
catch { subNode.ImageUrl = "WebResource.axd?a=s&r=TreeView_XP_Explorer_ParentNode.gif&t=632242003305625000"; }
node.ChildNodes.Add(subNode);
}
foreach (FileInfo fi in directory.GetFiles())
{
TreeNode subNode = new TreeNode(fi.Name);
node.ChildNodes.Add(subNode);
}
}
}
程序代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Tree.aspx.cs" Inherits="Tree" %>
<html>
<head runat="server">
<title>Asp.net 2.0 Treeview 无限级无刷新示例</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:treeview ID="Treeview1" runat="server" ImageSet="XPFileExplorer" AutoGenerateDataBindings="false" ExpandDepth="0" OnTreeNodePopulate="Treeview1_TreeNodePopulate">
<SelectedNodeStyle BackColor="#B5B5B5"></SelectedNodeStyle>
<Nodes>
<asp:TreeNode Value="C:" Text="C:" PopulateOnDemand="true" SelectAction="Select" NavigateUrl="#" >
</asp:TreeNode>
</Nodes>
<NodeStyle VerticalPadding="2" Font-Names="Tahoma" Font-Size="8pt" HorizontalPadding="2"
ForeColor="Black"></NodeStyle>
<HoverNodeStyle Font-Underline="True" ForeColor="#6666AA"></HoverNodeStyle>
</asp:treeview>
</div>
</form>
</body>
</html>
.cs页面
程序代码
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
public partial class Tree : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Treeview1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
{
if (IsCallback)
{
if (e.Node.ChildNodes.Count == 0)
{
LoadChildNode(e.Node);
}
}
}
private void LoadChildNode(TreeNode node)
{
DirectoryInfo directory;
directory = new DirectoryInfo(node.Value);
foreach (DirectoryInfo sub in directory.GetDirectories())
{
TreeNode subNode = new TreeNode(sub.Name);
subNode.Value = sub.FullName;
try
{
if (sub.GetDirectories().Length > 0 || sub.GetFiles().Length > 0)
{
subNode.SelectAction = TreeNodeSelectAction.SelectExpand;
subNode.PopulateOnDemand = true;
subNode.NavigateUrl = "#";
}
}
catch { subNode.ImageUrl = "WebResource.axd?a=s&r=TreeView_XP_Explorer_ParentNode.gif&t=632242003305625000"; }
node.ChildNodes.Add(subNode);
}
foreach (FileInfo fi in directory.GetFiles())
{
TreeNode subNode = new TreeNode(fi.Name);
node.ChildNodes.Add(subNode);
}
}
}