asp.net面试题收集[2006.4.28更新]
第一种:new Class();
第二种:覆盖方法
public new XXXX(){}
第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。
2.如何把一个array复制到arrayList里
foreach( object o in array )arrayList.Add(o);
3.datagrid.datasouse可以连接什么数据源 [dataset,datatable,dataview]
dataset,datatable,dataview , IList
4.概述反射和序列化
反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性
序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
5.概述o/r mapping 的原理
利用反射,配置 将类于数据库表映射
6.类成员有( )种可访问形式
可访问形式?不懂。
可访问性:public ,protected ,private,internal
7.用sealed修饰的类有什么特点
sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。
密封类不能同时为抽象类。
sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。
8.列举ADO.NET中的五个主要对象,并简单描述
connection,command,dataReader,trans,dataset ...
9.执行下面代码后:
String strTemp ="abcdefg 某某某";
Int i System.Text.Encoding.Default.GetBytes(strTemp).Length;
Int j = strTemp.Length;
问:i=(14 ) ;j=(11 )
i=(14 ) ;j=(11 ) 中文两个字节
10.C#中,string str = null 与 string str ="",请尽量用文字说明区别。(要点:说明详细的内存空间分配)
string str ="" 分配空间
11.详述.NET里class和struct的异同!
class:放在 ? struct放在?
struct值传递
类与结构有很多相似之处:结构可以实现接口,并且可以具有与类相同的成员类型。然而,结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承。结构的值存储在“在堆栈上”或“内联”。细心的程序员有时可以通过聪明地使用结构来增强性能。
12.概述.NET里对 remoting 和 webservice 两项技术的理解和实际中的应用。
远程逻辑调用,remoing接口只能用在.net中
13.什么是code-behind技术
aspx and cs
14.概述三层结构体系
web/business/dataaccess
15.asp.net如何实现MVC模式,举例说明!
web/business/dataaccess
----------------------------------------------------------------------------------------------------------
1.面向对象的思想主要包括什么?
答:这个题范围太广,不知道说什么.
2.什么是ASP.net中的用户控件
答:用户控件就是.ascx扩展名的东西喽,可以拖到不同的页面中调用,以节省代码.比如登陆可能在多个页面上有,就可以做成用户控件,但是有一个问题就是用户控件拖到不同级别的目录下后里面的图片等的相对路径会变得不准确,需要自已写方法调整.
3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
答:装箱就是把值类型转成引用类型,从MS IL角度看好像是boxing,没记错的话是把值从堆栈转到堆中.拆箱相反,重载就是指一个方法名同,参数个数不同,返回值可以相同的方法.CLR是通用语言运行时,其它的不清楚.
4.列举一下你所了解的XML技术及其应用
答:XML可是好东西,保存配置,站与站之间的交流,WEB SERVICE都要用它.
5.值类型和引用类型的区别?写出C#的样例代码。
答:结构是值类型,类是引用类型,所以传结构就是值类型的应用啦,传对象或类就是引用类型的,这个不用多写了吧.
6.ADO.net中常用的对象有哪些?分别描述一下。
答:connection command sqladapter dataset datatable dataview等等.写不完了.
7.如何理解委托?
答:据说相当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法.
msdn2005中是这样解释的:
委托具有以下特点:
委托类似于 C++ 函数指针,但它是类型安全的。
委托允许将方法作为参数进行传递。
委托可用于定义回调方法。
委托可以链接在一起;例如,可以对一个事件调用多个方法。
方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。
C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。
8.C#中的接口和类有什么异同。
答:这个异同可多了,要说清楚还真不容易.
9.。net中读写数据库需要用到哪些类?他们的作用
答:这个类自已可以写的啊,你是指基类吗?那configuration,sqlconnection,sqlcommand等都要用到.
10.UDP连接和TCP连接的异同。
答:前者只管传,不管数据到不到,无须建立连接.后者保证传输的数据准确,须要连结.
11.ASP.net的身份验证方式有哪些?分别是什么原理?
答:form认证,windows集成认证等,原理不清楚.
12.进程和线程分别怎么理解?
答:进程是老子,线程是儿子,没有老子就没有儿子,一个老子可以有多个儿子.一个儿子可以成为别人的儿子,一个老子也可以为别的老子生儿子.
13.什么是code-Behind技术。
答:代码分离,这是个明智的东西,像ASP这样混成一堆很不爽.或者可以理解成HTML代码写在前台,C#代码写在后台.当然前台也有脚本,类的调用等,其实写在一起也是可以的.
14.活动目录的作用。
答:这个不明白.请明白的补充一下.
15..net中读写XML的类都归属于哪些命名空间?
答:System.Xml
我自已写的就不一定了,嘿嘿.
16.解释一下UDDI、WSDL的意义及其作用。
答:什么东西?
17.什么是SOAP,有哪些应用。
答:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息,具体请看:http://playist.blogchina.com/2521621.html
18.如何部署一个ASP.net页面。
答:随便啦,想直接上传就直接上传,想打包成EXE就打包,看个人喜好.
19.如何理解.net中的垃圾回收机制。
答:GC?对象创建了总要清除啊,不然内存哪够用?
20.常用的调用webservice方法有哪些?
答:调用就调用,还有很多方法吗?
危险字符过滤最新完善版的类
现在要想要在url中限制输入:
1、SQL注入类的字符串,如:exec、select、……;
2、SQL注入类的特殊字符,如:'、……;
3、限制输入html和script文本,如:<script ……>,<iframe ……>;
4、不友好字符或限制词语,如:他X的、……;
这四种过滤在这个类中都处理了,但就是不知道如何调用哦。请指示一下咯。谢谢。
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
using System.Reflection;
namespace FilterRealProxy
{
/// <summary>
/// FilterRealProxy类:一个真实代理, 拦截它所代理对象中方法的返回值,并对需要过滤的返回值进行过滤。
/// </summary>
public class FilterRealProxy:RealProxy
{
private MarshalByRefObject target;
public FilterRealProxy(MarshalByRefObject target):base(target.GetType())
{
this.target=target;
}
public override IMessage Invoke(IMessage msg)
{
IMethodCallMessage callMsg=msg as IMethodCallMessage;
IMethodReturnMessage returnMsg = RemotingServices.ExecuteMessage(target,callMsg);
//检查返回值是否为String,如果不是String,就没必要进行过滤
if(this.IsMatchType(returnMsg.ReturnValue))
{
string returnValue=this.Filter(returnMsg.ReturnValue.ToString(),returnMsg.MethodName);
return new ReturnMessage(returnValue,null,0,null,callMsg);
}
return returnMsg;
}
protected string Filter(string ReturnValue,string MethodName)
{
MethodInfo methodInfo=target.GetType().GetMethod(MethodName);
object[] attributes=methodInfo.GetCustomAttributes(typeof(StringFilter),true);
foreach (object attrib in attributes)
{
return FilterHandler.Process(((StringFilter)attrib).FilterType,ReturnValue);
}
return ReturnValue;
}
protected bool IsMatchType(object obj)
{
return obj is System.String;
}
}
///<summary>
/// StringFilter类:自定义属性类, 定义目标元素的过滤类型
///</summary>
public class StringFilter:Attribute
{
protected FilterType _filterType;
public StringFilter(FilterType filterType)
{
this._filterType=filterType;
}
public FilterType FilterType
{
get
{
return _filterType;
}
}
}
/// <summary>
/// 枚举类:用于指定过滤类型,例如:对script过滤还是对html进行过滤?
/// </summary>
[Flags()]
public enum FilterType
{
Script = 1,
Html =2,
Object=3,
AHrefScript=4,
Iframe=5,
Frameset=6,
Src=7,
BadWords=8,
//Include=9,
All=16
}
///<summary>
/// 过滤处理类:根据过滤类型,调用相应的过滤处理方法。
///</summary>
public class FilterHandler
{
private FilterHandler()
{
}
public static string Process(FilterType filterType,string filterContent)
{
switch(filterType)
{
case FilterType.Script:
filterContent=FilterScript(filterContent);
break;
case FilterType.Html:
filterContent=FilterHtml(filterContent);
break;
case FilterType.Object:
filterContent=FilterObject(filterContent);
break;
case FilterType.AHrefScript:
filterContent=FilterAHrefScript(filterContent);
break;
case FilterType.Iframe:
filterContent=FilterIframe(filterContent);
break;
case FilterType.Frameset:
filterContent=FilterFrameset(filterContent);
break;
case FilterType.Src:
filterContent=FilterSrc(filterContent);
break;
//case FilterType.Include:
// filterContent=FilterInclude(filterContent);
// break;
case FilterType.BadWords:
filterContent=FilterBadWords(filterContent);
break;
case FilterType.All:
filterContent=FilterAll(filterContent);
break;
default:
//do nothing
break;
}
return filterContent;
}
public static string FilterScript(string content)
{
string commentPattern = @"(?'comment'<!--.*?--[ ]*>)" ;
string embeddedScriptComments = @"(/*.*?*/|//.*?[ ])" ;
string scriptPattern = String.Format(@"(?'script'<[ ]*script[^>]*>(.*?{0}?)*<[ ]*/script[^>]*>)",embeddedScriptComments);
// 包含注释和Script语句
string pattern = String.Format(@"(?s)({0}|{1})", commentPattern, scriptPattern) ;
return StripScriptAttributesFromTags(Regex.Replace(content,pattern,string.Empty,RegexOptions.IgnoreCase));
}
private static string StripScriptAttributesFromTags(string content)
{
string eventAttribs = @"on(blur|c(hange|lick)|dblclick|focus|keypress|(key|mouse)(down|up)|(un)?load
|mouse(move|o(ut|ver))|reset|s(elect|ubmit))" ;
string pattern = String.Format(@"(?inx)
<(w+)s+
(
(?'attribute'
(?'attributeName'{0})s*=s*
(?'delim'['""]?)
(?'attributeValue'[^'"">]+)
(3)
)
|
(?'attribute'
(?'attributeName'href)s*=s*
(?'delim'['""]?)
(?'attributeValue'javascript[^'"">]+)
(3)
)
|
[^>]
)*
>",eventAttribs);
Regex re = new Regex(pattern) ;
// 使用MatchEvaluator的委托
return re.Replace(content, new MatchEvaluator(StripAttributesHandler)) ;
}
private static string StripAttributesHandler(Match m)
{
if(m.Groups["attribute"].Success )
{
return m.Value.Replace(m.Groups["attribute"].Value, "") ;
}
else
{
return m.Value ;
}
}
public static string FilterAHrefScript(string content)
{
string newstr=FilterScript(content);
string regexstr=@" href[ ^=]*= *[sS]*script *:";
return Regex.Replace(newstr,regexstr,string.Empty,RegexOptions.IgnoreCase);
}
public static string FilterSrc(string content)
{
string newstr=FilterScript(content);
string regexstr=@" src *= *['""]?[^.]+.(js|vbs|asp|aspx|php|jsp)['""]";
return Regex.Replace(newstr,regexstr,@"",RegexOptions.IgnoreCase);
}
/*
public static string FilterInclude(string content)
{
string newstr=FilterScript(content);
string regexstr=@"<[sS]*include *(file|virtual) *= *[sS]*.(js|vbs|asp|aspx|php|jsp)[^>]*>";
return Regex.Replace(newstr,regexstr,string.Empty,RegexOptions.IgnoreCase);
}
*/
public static string FilterHtml(string content)
{
string newstr=FilterScript(content);
string regexstr=@"<[^>]*>";
return Regex.Replace(newstr,regexstr,string.Empty,RegexOptions.IgnoreCase);
}
public static string FilterObject(string content)
{
string ])*>(w|W)*regexstr=@"(?i)<Object([^>])*>(w|W)*</Object([^>])*>";
return Regex.Replace(content,regexstr,string.Empty,RegexOptions.IgnoreCase);
}
public static string FilterIframe(string content)
{
string ])*>(w|W)*regexstr=@"(?i)<Iframe([^>])*>(w|W)*</Iframe([^>])*>";
return Regex.Replace(content,regexstr,string.Empty,RegexOptions.IgnoreCase);
}
public static string FilterFrameset(string content)
{
string ])*>(w|W)*regexstr=@"(?i)<Frameset([^>])*>(w|W)*</Frameset([^>])*>";
return Regex.Replace(content,regexstr,string.Empty,RegexOptions.IgnoreCase);
}
//移除非法或不友好字符
/// <summary>
/// 移除非法或不友好字符!
/// </summary>
private static string FilterBadWords(string chkStr)
{
//这里的非法和不友好字符由你任意加,用“|”分隔,支持正则表达式,由于本Blog禁止贴非法和不友好字符,所以这里无法加上。
string BadWords=@"";
if (chkStr == "")
{
return "";
}
string[] bwords = BadWords.Split('#');
int i,j;
string str;
StringBuilder substr = new StringBuilder();
for(i = 0; i< bwords.Length; i++)
{
str=bwords[i].ToString().Trim();
string regStr,toStr;
regStr=str;
Regex r=new Regex(regStr,RegexOptions.IgnoreCase | RegexOptions.Singleline| RegexOptions.Multiline);
Match m=r.Match(chkStr);
if(m.Success)
{
j=m.Value.Length;
substr.Insert(0,"*",j);
toStr=substr.ToString();
chkStr=Regex.Replace(chkStr,regStr,toStr,RegexOptions.IgnoreCase | RegexOptions.Singleline| RegexOptions.Multiline);
}
substr.Remove(0,substr.Length);
}
return chkStr;
}
public static string FilterAll(string content)
{
content = FilterHtml(content);
content = FilterScript(content);
content = FilterAHrefScript(content);
content = FilterObject(content);
content = FilterIframe(content);
content = FilterFrameset(content);
content = FilterSrc(content);
content = FilterBadWords(content);
//content = FilterInclude(content);
return content;
}
}
}
【.NET板很有价值的问答】【实用和经典的javaScript代码】
.NET板块里很有价值的问题及其回答
http://topic.csdn.net/t/20041008/13/3433453.html
收集实用功能和经典的javaScript代码
http://topic.csdn.net/t/20041027/08/3494338.html
--------------------------------
在整理FAQ时整理出来的,因为年久失修,很多FAQ已经无法审核通过了,这两个帖子就是这种情况,又不忍让经典帖子就这样被埋没,来csdn比较早的,可能有收藏这俩贴,后来的可能从来没见过,所以把她分享出来,希望对大家有所帮助。
JavaScript极速狂飙:大容量字符型数组的快速检索_meizz
http://community.csdn.net/Expert/topic/4497/4497092.xml?temp=.2715418
JavaScript极速狂飙:组合拼接字符串的效率(meizz)
http://community.csdn.net/Expert/topic/4459/4459147.xml?temp=.2032282
SQL SERVER中一些常见性能问题的总结
http://community.csdn.net/Expert/topic/4428/4428715.xml?temp=.011944
asp.net 2.0 新特性
http://community.csdn.net/Expert/topic/4433/4433440.xml?temp=5.721682E-02
化解字符串不能超过8000的方法
http://topic.csdn.net/t/20030926/15/2303308.html
.net版本号什么时候加一?
http://community.csdn.net/Expert/topic/4519/4519346.xml?temp=.8146784
sql中的浮点存的时间,转换问题
http://community.csdn.net/Expert/topic/4526/4526261.xml?temp=.8814051
总结一下最近一段时间导出数据到Excel的几种方法
1.首先声明,这些方法也都是本人搜集的资料,然后为已所用,程序中不足之处,还请高手指点.
2.网上有好多关于用SQL语句导入导出的例子,这里不再重复写了。
方法1:调用com组件,导出access数据到Excel,就是直接调用access的导出功能,此方法速度超级快
using Access;
Access.ApplicationClass oAccess = new Access.ApplicationClass();
oAccess.Visible = false;
try
{
//ACCESS9:
oAccess.OpenCurrentDatabase("d:\\wcf.mdb",false,"");
//导出到excel
oAccess.DoCmd.TransferSpreadsheet(Access.AcDataTransferType.acExport,Access.AcSpreadSheetType.acSpreadsheetTypeExcel9,"工作表名","d:\\wcf.xls",true,null,null);
//导入txt
//oAccess.DoCmd.TransferText(Access.AcTextTransferType.acExportDelim,"","Enterprise","d:\\wcf.txt",true,"",0);
oAccess.CloseCurrentDatabase();
oAccess.DoCmd.Quit(Access.AcQuitOption.acQuitSaveNone);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oAccess);
oAccess = null;
MessageBox.Show("导入成功");
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
GC.Collect();
}
方法2:此方法速度也是超级快,只不过导出的格式非标准的Excel格式,默认工作表名与文件名相同
string FileName="d:\\abc.xls";
System.Data.DataTable dt=new System.Data.DataTable();
FileStream objFileStream;
StreamWriter objStreamWriter;
string strLine="";
objFileStream = new FileStream(FileName,FileMode.OpenOrCreate,FileAccess.Write);
objStreamWriter = new StreamWriter(objFileStream,System.Text.Encoding.Unicode);
for(int i=0;i<dt.Columns.Count;i++)
{
strLine=strLine+dt.Columns[i].ColumnName.ToString()+Convert.ToChar(9);
}
objStreamWriter.WriteLine(strLine);
strLine="";
for(int i=0;i<dt.Rows.Count;i++)
{
strLine=strLine+(i+1)+Convert.ToChar(9);
for(int j=1;j<dt.Columns.Count;j++)
{
strLine=strLine+dt.Rows[i][j].ToString()+Convert.ToChar(9);
}
objStreamWriter.WriteLine(strLine);
strLine="";
}
objStreamWriter.Close();
objFileStream.Close();
方法3:用Ado.net 此方法速度较以上两个显得慢了一些,数据量越大越明显
int Id=0;
string Name="测试";
string FileName="d:\\abc.xls";
System.Data.DataTable dt=new System.Data.DataTable();
long totalCount=dt.Rows.Count;
long rowRead=0;
float percent=0;
OleDbParameter[] parm=new OleDbParameter[dt.Columns.Count];
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName +";Extended Properties=Excel 8.0;";
OleDbConnection objConn = new OleDbConnection(connString);
OleDbCommand objCmd = new OleDbCommand();
objCmd.Connection = objConn;
objConn.Open();
//建立表结构
objCmd.CommandText = @"CREATE TABLE Sheet1(序号 Integer,名称 varchar)";
objCmd.ExecuteNonQuery();
//建立插入动作的Command
objCmd.CommandText = "INSERT INTO Sheet1("+Id+","+Name+")";
parm[0]=new OleDbParameter("@Id", OleDbType.Integer);
objCmd.Parameters.Add(parm[0]);
parm[1]=new OleDbParameter("@Company", OleDbType.VarChar);
objCmd.Parameters.Add(parm[1]);
//遍历DataTable将数据插入新建的Excel文件中
for(int i=0;i<dt.Rows.Count;i++)
{
parm[0].Value=i+1;
for(int j=1;j<parm.Length;j++)
{
parm[j].Value =dt.Rows[i][j];
}
objCmd.ExecuteNonQuery();
rowRead++;
percent=((float)(100*rowRead))/totalCount;
//this.FM.CaptionText.Text = "正在导出数据,已导出[" + percent.ToString("0.00") + "%]...";
if(i==dt.Rows.Count-1)
//this.FM.CaptionText.Text = "请稍后......";
System.Windows.Forms .Application.DoEvents();
}
objConn.Close();
//this.FM.CaptionText.Text = "";
方法4:此方法调用com组件,速度都慢于以上3个方法
using Excel;
System.Data.DataTable dt=new System.Data.DataTable();
string FileName="d:\\abc.xls";
long totalCount=dt.Rows.Count;
long rowRead=0;
float percent=0;
Excel.Application xlApp=null;
xlApp=new Excel.Application();
Excel.Workbooks workbooks=xlApp.Workbooks;
Excel.Workbook workbook=workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
Excel.Worksheet worksheet=(Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
Excel.Range range;
//写入字段
for(int i=0;i<dt.Columns.Count;i++)
{
worksheet.Cells[1,i+1]=dt.Columns[i].ColumnName;
range=(Excel.Range)worksheet.Cells[1,i+1];
}
for(int r=0;r<dt.Rows.Count;r++)
{
worksheet.Cells[r+2,1]=r+1;
for(int i=0;i<dt.Columns.Count;i++)
{
//worksheet.Cells[r+2,i+1]=dt.Rows[r][i];
if(i+1!=dt.Columns.Count)
worksheet.Cells[r+2,i+2]=dt.Rows[r][i+1];
}
rowRead++;
percent=((float)(100*rowRead))/totalCount;
//this.FM.CaptionText.Text = "正在导出数据,已导出[" + percent.ToString("0.00") + "%]...";
System.Windows.Forms .Application.DoEvents();
}
range=worksheet.get_Range(worksheet.Cells[2,1],worksheet.Cells[dt.Rows.Count+2,dt.Columns.Count]);
workbook.Saved =true;
workbook.SaveCopyAs(FileName);
//this.FM.CaptionText.Text = "";
方法5:利用剪贴板 ,有人说此方法很快,但是我用时,这种方法最慢,请高手指点.
System.Data.DataTable dt=new System.Data.DataTable();
string filePath=@"d:\abc.xls";
object oMissing = System.Reflection.Missing.Value;
Excel.ApplicationClass xlApp = new Excel.ApplicationClass();
try
{
xlApp.Visible = false;
xlApp.DisplayAlerts = false;
Excel.Workbooks oBooks = xlApp.Workbooks;
Excel._Workbook xlWorkbook = null;
xlWorkbook = oBooks.Open(filePath,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,
oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing);
Excel.Worksheet xlWorksheet;
// 添加入一个新的Sheet页。
xlWorksheet = (Excel.Worksheet)xlWorkbook.Worksheets.Add(oMissing,oMissing,1,oMissing);
// 以TableName作为新加的Sheet页名。
xlWorksheet.Name ="企业名录";
// 取出这个DataTable中的所有值,暂存于stringBuffer中。
string stringBuffer = "";
for( int j=0; j<dt.Rows.Count; j++ )
{
for( int k=0; k<dt.Columns.Count; k++ )
{
stringBuffer += dt.Rows[j][k].ToString();
if( k < dt.Columns.Count - 1 )
stringBuffer += "\t";
}
stringBuffer += "\n";
}
// 利用系统剪切板
System.Windows.Forms.Clipboard.SetDataObject("");
// 将stringBuffer放入剪切板。
System.Windows.Forms.Clipboard.SetDataObject(stringBuffer);
// 选中这个sheet页中的第一个单元格
((Excel.Range)xlWorksheet.Cells[1,1]).Select();
// 粘贴!
xlWorksheet.Paste(oMissing,oMissing);
// 清空系统剪切板。
System.Windows.Forms.Clipboard.SetDataObject("");
// 保存并关闭这个工作簿。
xlWorkbook.Close( Excel.XlSaveAction.xlSaveChanges, oMissing, oMissing );
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook);
xlWorkbook = null;
这些方法都没有关闭Excel进程,这种资料很多,在此不多写了,希望这些能对一些人带来方便.
C#常用类库
方向:.NET打印、EXCEL二次开发
语言:C#,(C#、VB.NET示例)
说明:元旦发布MIS金质打印通V2.5及Excel专版源码
地址:http://blog.csdn.net/flygoldfish
代码文件:
方向:ASP.Net工具栏菜单控件
语言:C#
说明:
地址:http://henryfan.cnblogs.com/archive/2005/12/24/304068.html
方向:ASP.Net分页控件
语言:C#
说明:
地址:http://henryfan.cnblogs.com/archive/2005/09/13/235965.aspx
方向:O/R M的数据组件(版本相对旧些)
语言:C#
说明:
地址:http://henryfan.cnblogs.com/archive/2005/11/11/274333.aspx
以上东西都提供源码的.
方向:阴历和阳历的转换
语言:C#
说明:
地址:http://singlepine.cnblogs.com/articles/264372.html
方向:无刷新三联动
语言:C#
说明:
地址:
JavaScript调用Web Services实现无刷新三联动
http://singlepine.cnblogs.com/articles/301009.html
XmlHttp实现无刷新三联动下拉框
http://singlepine.cnblogs.com/articles/265678.html
Ajax实现无刷新三联动下拉框
http://singlepine.cnblogs.com/articles/257954.html
方向:Web的桌面提醒(Popup,类似msn,outlook等的信息提示)
语言:C#
说明:
地址:http://singlepine.cnblogs.com/articles/264679.html
方向:通用数据访问层 —— ADO.NET的封装
语言:C#
说明:
地址:
http://www.52forum.com/bbs/
http://blog.52forum.com/jyk
请关注52forum.com论坛和我的blog,近期内整理公布。
方向:常用函数
语言:C#
说明:
常常会用到的函数的集合,比如判断是否是数字,输出脚本弹出alert等。
地址:
http://www.52forum.com/bbs/
http://blog.52forum.com/jyk
请关注52forum.com论坛和我的blog,近期内整理公布。
方向:翻页控件 —— 无需存储过程,高效
语言:VB.net webform
说明:
地址:
http://www.52forum.com/bbs/
http://blog.52forum.com/jyk
请关注52forum.com论坛和我的blog,近期内整理公布。
方向:n级联动下拉列表框(控件)
语言:vb.net webform
说明:js脚本。无刷新、只访问一次服务器
地址:
http://www.52forum.com/bbs/
http://blog.52forum.com/jyk
请关注52forum.com论坛和我的blog,近期内整理公布。
方向:锁定表头、左面列的方法
语言:js脚本
说明:可以锁定 n行表头,n列
地址:
演示网址:
http://www.jyklzz.com/scroll.htm
http://www.52forum.com/bbs/
http://blog.52forum.com/jyk
请关注52forum.com论坛和我的blog,近期内整理公布。
方向:大家一起写新闻系统
语言:c# webform
说明:开源、大家一起参与、从基础开始起步、便于初学则入门。逐步深入。
地址:
http://www.52forum.com/bbs/
http://blog.52forum.com/jyk
类似VB的ReDim的C#方法:
1、定义
public static Array Redim(Array origArray,Int32 desiredSize)
{
Type t = origArray.GetType().GetElementType();
Array newArray = Array.CreateInstance(t,desiredSize);
Array.Copy(origArray,0,newArray,0,Math.Min(origArray.Length,desiredSize));
return newArray;
}
2、使用
int[] data = new int[]{};
data = (int[])Redim(data,data.Length + 1);
data[data.Length - 1] = 1;
方向:电子邮件客户端
语言:VB
说明:实现POP3,SMTP协议,以及EMAIL的MIME格式编码和解码
地址:http://www.codeproject.com/vb/net/QMailClient.asp
方向:ASP.Net控件很多.
语言:C#
说明:
地址: htpp://www.rcomponent.com
方向:WinForm.Net控件很多.(还有java版的)
语言:C#
说明:Cell ,OutlookBar, RichTextBox ,shape, RMaskedTextBox.....
地址: htpp://www.rcomponent.com
方向:.Net 网络 ftp nfp, smtp, pop控件(还有java版的)
语言:C#
说明:ftp nfp, smtp, pop控件java版的也不错.
地址: htpp://www.rcomponent.com
方向:数据库、数据校验
语言:C#
说明:
地址:http://ltp.cnblogs.com/archive/2005/12/03/289724.html
搜索引擎优化,通向成功的10步
10个步骤的方法。
1. 站点优化审核
2. 设定目标
3. 工作计划和进度表
4. 关键字的分析和选择
5. 网站的内容设计
6. 网站的结构优化
7. 创建链接
8. 搜索引擎提交
9. 报告 & 分析
10. 维护和不断的更新
第一步 – 站点优化审核
在开始工作之前,你应该衡量一下目前站点的SEO运作的如何。因为如果你更改了某些内容,可能会使情况更为糟糕。一般情况下,应该衡量下列内容:
搜索引擎收录——这将会告诉你你的站点有多少网页被收录在主要搜索引擎的索引之中。请记住:如果你的站点甚至还没有被收录在搜索引擎目录之中,你为提高 排名所作的工作都是在白白浪费时间。
链接流行检查——这会告诉你到你站点的点入链接有多少。请记住:具有来自于“相关”站点的链接是提高搜索引擎位置排名的关键因素。
搜索引擎排名 ——这是一个很明显的因素,尽管你记住了如果你的搜索引擎收录分数为0,你不会因任何的搜索短语而被排名。
流量统计——获得一个能显示你站点独特访客和推荐搜索短语的免费网络分析包。这是很重要的一步,这样你就能够计算出站点的转换率,即:独特访客到转换的比率。你的转换可能是信息要求、免费试用或者产品目录下载。推荐搜索短语也很重要,因为你可能获得很多的较高位置,但没有形成流量。
第二步:设定目标
做什么事情都有计划一些我想会做得更好些的。没有一个工作目标,你将没有什么工作重点,而且也将缺乏可以衡量的反馈。比如给自己设定三个月之内你的销售目标,半年后你要达到的销售额,一年之后你将实现:挑选出的15个搜索短语实现进入前10名。
第三步:工作计划和进度表(这个应该是你为了达到目标而拟的计划书,就是你打算怎么样才能达到那些预定的目标)
这个步骤也很重要,没有这一项,你将对现在从事的工作没有什么框架结构并且对什么时候开展具体工作也一无所知。而且你做了一个优化工作记录起来了,看看有没有效果,如果有你其它的工作就可以继续,如果没有,你就可以寻找其它的出路。
第四步:关键字的分析和选择
我们一般都是通过Overture搜索短语建议工具分析关键字,然后用一些相关的比较流行的关键词包装自己的元标签和标题标签…….尽管它很有用,但其内容还是太基本了。
下面是一些黄金法则:
*不要简单地选择那些能产生最多印象或相关搜索的关键词。
*请记住有成千上万种搜索短语组合。
*要充分考虑每个关键词的竞争力。试图在具有1000万个竞争站点中对搜索短语 排名,不是不可能,也会非常困难。
* 寻找适合小生境、能产生好的印象以及具有较低竞争站点的关键词。
* 为了能创建一个高度相关短语的排名并通过它产生高质量的流量,应该给每个关键词分配百分数的相关分数(%)。
第五步:网站的内容设计
你一旦找出了SEO活动的搜索短语之后,你需要提供为这些搜索短语提供能吸引人们搜索的内容。不要简单地提供你认为能吸引搜索引擎的内容,因为这被界定为spamming,并且可能导致你的站点被搜索引擎抛弃。
第六步:网站的结构优化
这里的目标是确保你的站点是搜索引擎友好的。你在第一步中的收录分析将会告诉你搜索引擎是否已成功地爬行了你的站点。
如果你已经向所有的搜索引擎提交了站点,但是所有的网页仍然没有得到正确的索引,这说明你的站点没有可以被成功索引或者爬行的正确的技术特色和编码结构。
每一个站点都有很多的问题,在这里就不能一一讲述了。典型的问题是网络服务器问题、不正确地使用内容管理系统、较差的站点链接结构、不正确的使用框架和表格以及缺少站点地图。
这涉及到需要对网站网页模板、HTML编码和内部链接结构进行调整。站点优化包括:
* 改进网页的HTML编码结构确保搜索引擎能最有效地对你的站点进行爬行。
* 使用关键词和网站地图改进站点内部链接结构。
* 优化网页元素,比如标题、元关键词和说明以及脚注。
* 通过删除可能妨碍搜索引擎爬行程序的网页因素以及发现正在使用的spam技术确保站点是搜索引擎友好的。
* 优化网页内容使其包含更相关的搜索短语,因此提高互联网搜索的相关性。
第七步:建立链接
一种成功的链接战略包括:
内容策略:在你的站点上充实有价值的内容,吸引别的站点链接到你的站点上。
链出策略:宣传你的浏览者认为有价值的链出链接。
链入策略:你应该对可以申请链接的其他站点进行研究并创建列表。
怎么让别人链接到我们呢?你可以在站点上多创建一些有价值的信息。这不是简单地重复别人正在从事的工作。你应该提供到其他好站点的链接以及提供其他网站所不具有的信息。
注意:
* 不要使用链接工厂,因为它们有害无益。
* 不要链接到没有价值的网站之上。
* 不要从那些不相关的流量较低的网站中申请链接。
创建链接最大的好处就是获得较高的 排名、推动相关的流量、树立品牌并且集成相关的在线社区或目标市场。
第八步: 搜索引擎提交
最好不要使用自动提交工具。
你需要将你的站点提交到基于爬行程序基础上的引擎以及人工编辑的目录中,比如 Yahoo、Dmoz 和business.com。一旦一个站点被基于爬行程序的引擎索引,你就不用再重新提交你的站点了。
第九步:报告和分析
与你起初设定的目标进行比较找出自己的位置这非常重要。至少,任何的SEO活动必须具有下列的报告信息:
搜索引擎位置:对于所有搜索引擎上的所有的相关短语的 排名。
网络分析工具:推荐流量、独特的访客和流量的来源。
第十步:维护和不断的更新
SEO不是一件一蹴而就的工作,它只会越来越复杂,越来越需要耗费时间和精力,它要求不断的更新。搜索引擎算法一直在改变它们相关标准,因此,今天排名第1的网站可能明天排名13。
黄金规则是:
* 创建链接:将创建链接作为一项长期进行的工作。
* 报告:至少每月报告一次所有可以衡量的内容。
* 新内容:要不间断地更新内容并创建新的相关内容。
* 监控排名算法:这需要很多的时间。你可以使用很多可用的论坛。
* 查看优化效果。
* 搜缩短语分析:不断地监控新的短语并且再次访问原始的关键词研究作为一个参考点。
GOOGLE排名技巧经验谈
A、 标题标签:
目前,不光GOOGLE,而且大多搜索引擎都很关注它,所以这个标题标签的设计对你的网站在搜索引引擎的排名中特别重要。所以,标题设计一定要接近全力想到关键词,最好把最重要的关键词融入到标题中。例如:
luao.y365.com 是我花了一个下午做出来的试验的放在免费空间,用免费二级域名的站点,不过他在百度、GOOGLE 中打入“工艺画”、”麦秸画“ “工艺画批发”、“工艺画制作”等关键词,它都排在第一的位置
针对于它的标题,我是这样设计的:
<TITLE>麦秸画 麦秸工艺画制作 工艺品批发 销售 出口</TITLE>
注:标题设计最好不好超过40个字符,也就是20个汉字。
B、内容标签:
在网页标签中,关键词标签已经不被搜索引擎看重,而目前google相对而言还是比较看重内容简介标签的。及:<META content= 标签内容 name=description>
在简介标签中,一定要充分发挥最关键的那个词的出现频率,以及融入有可能出现的组合关键词。请看下面这个内容简介标签:
<META content=麦秸画 麦秸工艺画 民族工艺画 麦秸画制作技术 麦秸画批发 工艺品批发 工艺画销售 工艺画代理 工艺画制作 工艺画图片 工艺画信息name=description>
注:经过试验表明,这个标签放在<META http-equiv=Content-Type content="text/html; charset=gb2312"> 这个标签上面比较好。
C、 页面内容:
标题的设计,标签的设计,最好要与内容想符合,另外在网页中,最好能够合理的提高关键词出现频率。
另外针对与关键词,可以用加粗(及<B> </B>) ,也可以用相对大一点的字体突出关键词。 这样,GOOGLE将会更加关注这个关键词。
D、外部连接:
大家都知道,在GOOGLE中,通过A网站的连接到B战,就等于A站投B站了一票,B站在google中及积分将升高一分,积分高了,当然也有利于排名了。所以,网站的外部连接特别重要。那么就谈友情连接了,对于友情连接,最好多做高攀的、门当户对的、内容互补的友情连接。呵呵!
E、 其他策略:
说道底,对于不同的网站而言,还要采取其他一些不同的策略. 不过还有一点这里要申明一下:想要真正的做好网站,还是把内容做好,把用户粘在你的网站,这样通过网络营销,你的用户将不断的积累,流量那么也是越来越大,流量大了,对GOOGLE排名最有用。
百度排名NO.1是怎样SEO成功的
百度排名NO.1在SEO (Search Engine Optimization)中其实也不算什么,此处笔者仅仅是为了通过百度排名第一位来说明SEO的相对通用的方法。当搜索引擎优化从一个鲜为人知的词语,成为名扬网络推广界的频繁用词的时候,百度排名(此处指的是左侧优化排名,不是付费竞价排名那种)相比Google排名似乎被冷落了,当诸多SEOer热衷于Google排名的时候,笔者对百度搜索却不敢忽略。之所以如此认为,是因为我在实践中发现百度有优于Google 的方面,百度排名也有优于Google排名的方面,通过优化设计,百度搜索能够为我们更快的带来滚滚流量。我站在前人的肩膀上学习前人的经验和技巧,通过探索和实验,逐步也掌握了SEO技术的一些皮毛知识,从而试图通过这些文字的表述与大家共同交流百度排名以及SEO排名的技巧。
笔者注册了一个英文域名 jiqi.net 用于展示实验案例,首先将域名设置为直接跳转(这对Google来说不太认可,因此本文不讨论其相应于Google排名的问题)指向电子商务观察business800.com 的某个子目录下的页面 jiqi.html (文件名优化设计)。接下来说说页面的设计,我选择的关键词是"机器配件",围绕机器配件进行的关键词组合设计有,机器配件制造,机器零配件批发,企业机器配件等。页面的文字安排及其简单,穿插的文字强调了机器配件与机械行业的相关性(淡化SEO的痕迹,增加可信度,控制关键词密度)。页面共有四个引出链接,其中有两个是关键词"机器配件"的百度搜索结果(引出链接的相关性,搜索结果也是对该页的直接证明)。
网页设计完毕后,我做的事情就是采用推广策略。首先,我在电子商务观察 business800.com 和中国好广告网haoAD.com 的首页上加了 jiqi.net 的链接(增加有人气的引入链接),其次,我向百度提交 jiqi.net 网站。我没有再采用其它的推广策略,大概过了3天,百度索引了该网站,在关键词"机器配件"的搜索结果中 jiqi.net 排在第3位。大约一周半之后,关键词"机器配件"的百度搜索结果中 jiqi.net 就排到了NO.1的位置。
现在笔者需要对此次百度排名SEO成功的案例做补充说明,关键词"机器配件"的使用率不是非常高,排名竞争较小,因此容易取得好的排名效果。从某种意义上来说,不是所有的关键词都适合做SEO排名的。当然,另外一方面来说,关键词优化还需要考虑"有效关键词"的问题,无效的关键词对访问者来说却是一种误导,有效的关键词能够给企业带来有效的访问者(达成线上生意订单),因此关键词的使用率高低并不是SEO的最应该重视的,而应该是重视SEO排名与企业的业务、网站的产品结合在一起。
在这里我顺便提一个问题,希望能够有幸得到行家的指点。在百度搜索关键词"电子商务论文 "的结果中,电子商务观察business800.com 排在第一位,而实际上我并没有针对该关键词进行专门的优化,且页面中包含该关键词的次数也不多。我没有仔细研究这个问题,初步的判断是外部链接和旧版内容的影响,希望对这个问题有研究的朋友给我一个准确的分析。
最后要说明的有两点:其一,百度排名NO.1其实也不算什么,因为有很多SEOer做的更好;其二,对于SEO,我的主张就是适度即可,我非常反感那种为了排名而排名的SEO行为,尤其那种超级作弊行为,已经超出了正常的优化范围,完全的自欺欺人,明眼人一看就觉得非常好笑。简而言之,我认为对于电子商务网站建设和网站推广来说,百度排名也好,SEO也好,这些都只能作为推广的辅助手段,其实做好网站的内容和服务才是根本。有一点需要我们大家都记住,SEO可以为你带来流量,但不一定是客户,更进一步来说,SEO也许可以为你带来客户,但不一定是长久的客户。能否留住客户,那是体现和检验我们是否以用户为中心的最好方法。
用WCAT进行IIS压力测试(下)
(作者:青苹果工作室编译 2001年01月12日 09:38)
现在我们更多的为大家介绍一些WCAT的应用。
编写你自己的WCAT测试脚本
你可以定制WCAT 运行的场景,方法是指定不同的命令行开关、修改服务器和客户机的配置、使用你自己的ASP、ISAPI或 CGI 脚本、改变客户和控制器的输入文件。在前面的部分,我谈到了改变性能计数器文件的能力。你还可以根据需要改变配置(.cfg)、脚本(.scr)和分配(.dst)文件。
默认状态下,配置文件位于控制器的\webctrl 目录下。这个文件中的信息包含测试中使用的缓冲器数、要使用的客户机数、要使用的流数以及测试持续的时间。
要确定你运行测试所需要的脚本,你可以修改脚本文件。在这个文件中,你可以指定你想要测试的特定ASP,以及ISAPI 和 CGI 扩展。以下是WCAT 文档中的一个样本脚本文档。
# ######################################################################
#
# Test script file for WCAT
#
# ######################################################################
# Format of Script Specification:
#
# ClassId Operation Files
# Note: Operation Strings are case insensitive
#
# Plaza Welcome page = >
NEW TRANSACTION
classId = 1
NEW REQUEST HTTP
Verb = "GET"
URL = "/scripts/welcome.py"
# Click Repeat Shopper = > Plaza Lobby
NEW TRANSACTION
classId = 2
NEW REQUEST HTTP
Verb = "GET"
URL = "/prd.i/pgen/plaza/JQ04Q9JF66SH2JS700Q79TREBNBGAU1M/plaza1.html"
# Click AG = > AG Lobby
NEW TRANSACTION
classId = 3
NEW REQUEST HTTP
Verb = "GET"
URL = "/prd.i/pgen/ag/JQ04Q9JF66SH2JS700Q79TREBNBGAU1M/lobby.html"
# Click Big Picture
NEW TRANSACTION
classId = 4
NEW REQUEST HTTP
Verb = "GET"
URL = "/prd.i/pgen/ag/JQ04Q9JF66SH2JS700Q79TREBNBGAU1M/ag_bigpicture.html"
分配文件用来设置每个处理所使用的时间百分数。如果你定制你的脚本文件,还需要给测试使用一个定制的分配文件。
使用IIS扩展日志文件发现运行时间错误
除了使用WCAT,你还可以使用IIS的扩展日志功能发现ASP中的错误。你可以打开URI_Query 扩展日志文件中记载ASP的错误。默认状态下,这个文件是没有打开的。打开它的技巧有以下几步:
1、选择一个Web或 FTP 站点,打开它的属性页。
2、激活日志,选择W3C 扩展日志文件格式。
3、点击属性。
4、在扩展属性页上,选择你想要记入日志的域(在本例中,, URI_Query)。默认状态下激活的是时间、
客户IP地址、方法、URI Stem 和HTTP状态。
5、点击应用。
用WCAT维护Session 数据
如果你想用WCAT维护 ASP 的Session 数据,可以利用cookies。在你的脚本(.scr) 测试文件顶部增加这样一行:
Set Cookie=""
你将cookie 设置成什么并不重要;只要你设置了就行。通过设置一个cookie ,WCAT创建的每个虚拟目录就都有了它自己的ASPSESSIONID cookie,这就提供了维护session 状态的能力。就是说WCAT为每个虚拟用户维护一个持久的cookie 集合。要清除某一特定cookie的值,可以使用以下脚本:
NEW REQUEST CLEAR_COOKIE
Set Cookie = ""
在你的脚本中可以发布多个CLEAR_COOKIE和Set Cookie 指示,以控制cookie 的寿命。构成任意的cookie 请求的唯一方法就是在Set RequestHeader 指示中进行编码。这对于测试那些不使用ASP session状态的客户应用程序是有用的。
用WCAT仿真邮递的数据
在一个真正的Web 应用程序中,你会发现有时需要将某些数据邮递到一个URL。Web Publishing 程序员参考资料提供了你可能会用到的Web Publishing API 的详细情况。使用WCAT时,你可以仿真将数据邮递到一个特定的URL。要将数据邮递到一个ASP表单,有以下步骤:
◎Verb = "POST"
◎RequestHeader = "Content-Type: application/x-www-form-urlencoded\r\n"
◎RequestData = "Field1=Value1&Field2=Value2&Field3=Value3\r\n"
新WCAT功能及修复
在WCAT的最新版本中,增加了一些新功能和臭虫修复。包括以下内容:
1、如果测试期间没有进行请求,日志文件字节计数器就不被破坏。
2、如果你有一个不能完成的重定向,现在就将其列为失败的连接。
3、用户名和口令现在可以接收一个文件名,并可以使用这个文件的内容。每个文件只能有一个用户名-口令对。
4、现在可以规定通过一个请求来测试服务器。
5、改进了SSL测试。现在可以用新指示SSL_Protocol来指定用于SSL (https) 请求的端口。如果SSL_Protocol 没有指定,那么WCAT就要与服务器协商使用最好的安全协议。在完全理解如何使用它之前,不要使用 the SSL Provider指示。在脚本样板中也取消了这个指示的使用。
6、现在在输入文件中的任何地方都可以替换URL(而不是只在头部)。由于使用了宏替换,会降低性能。但是性能的降低不会很大,除非你在使用大型文件进行替换。性能的降低只会发生在WCAT第一次通过每个文件时。这就是在准备阶段,所以,如果你选择了使用替换功能,就要确保你的准备阶段足够长以处理这个额外的工作。
在WCAT以前的版本中,不管是否使用了替换,都会由于使用了宏而对性能有所影响。现在当使用了动态的和每个请求都变化的宏时,这样的轻微影响依然会发生。
7、改进了HTTP重定向操作来支持服务器、特定端口号及安全性。通过MaxRedirects脚本指示(它是一个DWORD),你可以设置重定向的最大值。默认状态下,这个最大值是0,它代表无限多的重定向。
总结
WCAT只是监控你的IIS服务器的可用工具之一。INetMonitor 是一个用来进行容量规划、负载监控、硬件配置及仿真的工具。它是Microsoft BackOffice 资源工具箱(第二版)携带的,可以从Microsoft Press得到。有关INetMonitor的简单介绍,可以在灵活易用的容量规划工具INetMonitor一文中看到。
用WCAT进行IIS压力测试(中)
(作者:青苹果工作室编译 2001年01月12日 09:45)
用设置程序在每台计算机上安装了所需要的文件之后,第一次运行WCAT时应该配置客户和控制器机器。你需要知道这些机器的IP地址。通过使用TCP/IP的 ping 命令行功能,可以获取IP地址,这个地址对应于方括号中的4个数字(比如说, [11.1.38.2])。这些数字代表机器在网络上的IP地址。
■配置
有了IP地址以后,你就可以配置客户和控制器了。WCAT控制器是在命令行提示符下配置的。只需要进入包含控制器的目录(在默认状态下,这个目录是 \webctrl, 因此你应该键入 cd \webctrl),然后键入config IP地址或计算机名。如果你要测试多个网络的话,就用计算机名。
配置客户与配置控制器一样。这次还是在命令提示符下,进入客户所在的目录,并键入config 控制器名IP地址(控制器名指的是控制器机器的名字,IP地址指的是客户机)。
■运行
运行WCAT主要有5个步骤:
◎第一步:起动WCAT客户、控制器和服务器。
在客户机上起动WCAT客户,方法是在提示符下,转到客户目录,键入client (这是一个批处理文件,运行的程序是wcclient.exe)。程序试图与控制器进行连接。如果连接不上,那么10秒钟之后程序再进行连接,并继续每10秒钟连接一次,直到你终止wcclient.exe的运行。要终止wcclient.exe,在命令提示符下键入CTRL+C。
然后,在控制器上起动WCAT的控制器程序(wcctl.exe) ,指定你想要运行的测试。在命令提示符下,转到控制器目录,键入run 测试名 [开关] (其中测试名是你所运行的测试的名字,开关是选项)。当你运行控制器程序时,使用-a 服务器IP 和-n 服务器名。-a 开关指定将要测试的服务器,-n 开关指定服务器名。在WCAT文档中可以找到所有可能用到的开关列表及它们的使用方法。
最后在服务器上起动IIS和HTTP 服务。
◎第二步:准备
在准备阶段,控制器向客户机发送指令,客户开始向服务器发送请求。在准备阶段不收集输出,因为这时服务器的反应速度比平时要慢(经常用到的页面、对象及指令还没有被处理器所缓存)。
◎第三步:实验
在实验阶段,控制器指示客户机向服务器发送特别的请求,服务器作出反应。收集统计数字,并将状态信息发送给客户机。控制器监控测试的全过程。这时WCAT正在确定你的服务器基于所仿真的工作量的性能。如果你已经指定,你想要监控性能计数器,那么在实验阶段,控制器就监控这些值。
◎第四步:冷却
所有工作完成后,就到了冷却阶段(你应该不希望你的服务器抽筋吧,是吗?)。在冷却阶段,控制器指示客户机停止发送请求。客户结束他们的操作,虽然客户继续收集统计数据,这些数据不再为输出而保存;因为冷却并不指示一个真正的工作量,因此这些统计数据没用。
◎第五步:报告
在报告阶段,客户将收集的数据发送给控制器。一旦所有的数据都发送之后,控制器就关闭客户连接。要知道WCAT 还在你的客户上运行,因此它们会恢复到初始配置并试图与控制器连接。控制器所收集的数据被写入一个日志文件中。写入的一行文本代表一个客户,其中包括读取页面的总数、每秒读取页面的平均数、每个客户读取页面的实际数。这时,如果你指定你想要监控性能计数器,这个数字将被写入性能结果文件中。
分析结果
写到日志文件中的信息包括一个文件头、结果、性能计数器(如果你指定要将这些包含进去的话)、文件及类统计数据。头包含测试的一般信息,如运行测试的日期和时间、使用的输入和输出文件及持续时间。在WCAT文档中有关于头的域、结构的详细资料,以及一个例子。
向.log 文件中写入的有许多细节,其中最有趣的可能就是“读取页面”表。第一个数字栏是所有客户机所读取的页面的总数。第二栏是第一个客户机每秒中所看到的页面的速率。第三栏是第一个客户机所看到的页面的总数。如果你有多个客户,就会在后面继续看到每个机器的速率和总数。
日志文件的结果区是一个表格,它总结了在测试中所收集到的所有数据。收集到的数据包括请求的页面数、响应时间、连接以及有可能遇到的所有错误。在WCAT文档中有表格的格式及每栏的构造。
如果你指定想要监控性能计数器,那么WCAT日志中有一部分详细记载了这个内容。这个数据还在一个表格中表现,包含每页中每个计数器的平均值。
日志的文件区包含一个表格,其中有测试中请求的文件数及客户接收到的文件数。
日志的最后一部分是类统计数据区,其中包含的数据代表客户上页面恢复的速率。包括成功恢复的页面数、错误率以及某一特定类型的页面(换句话说,就是页面的类)被请求的比率。你可以用这些数据来确定哪一类页面被请求得最多。
使用和记录性能计数器
前面已经提到过,你可以选择在基于Windows NT的服务器上使用WCAT 的性能计数器。用性能计数器,你可以测量处理器、物理内存、硬盘子系统、内存缓冲的使用情况,还可以使用所使用的服务(如IIS)的性能。为了使用性能计数器,在运行控制器时需要使用-p开关,你需要提供一个扩展名为.pfc 的文件,它指定你想要监控的计数器。默认状态下,这个文件在WCAT控制器的\Scripts 目录下。
使用Sample.pfc
有一个性能计数器的样本输入文件--Sample.pfc--被安装在WCAT控制器的\Scripts 目录下。要监控的每个计数器都在单独的一行中列出,向左对齐,无制表符。每一行中可以加入注释,在每行开头加一个#号即可。每一个文件中最多有50个计数器。.pfc 文件中一行的语法是object(instance)\counter。 Object 是你想要监控的项目的名字,如过程。instance是对象的特定例示的名字, counter 是你想要监控的对象的实际属性。要监控IIS过程Inetinfo所使用的处理器时间,可以在.pfc 文件中增加以下条目。在这个例子中,Processor 是对象,inetinfo 是例示,%Processor Time 是计数器。
Processor(inetinfo)\% Processor Time
为了确定你可以监控的对象,运行性能监控功能(在命令提示符下运行perfmon.exe ),从编辑菜单中选择“增加到图表”项。将会出现以下的对话框对你进行提示:
在对话框中,你可以从下拉菜单中选择对象、例示和计数器。点击解释按钮,可以得到每个计数器意义的描述。
下表列出了一些计数器:
对象
计数
注释
Active Server Pages
分配的内存
每秒的请求
ASP满足的请求的速率
请求执行时间
一个请求执行所用的平均时间
请求等候时间
执行前一个请求在队列中等候的时间
失败的请求总数
排队的请求数
拒绝的请求数
当前的会话
Process(inetinfo)
处理器时间
特别时间
用户时间
私用字节
这个过程使用的内存总数。如果这个数字无限增长,就说明某些东西、某些地方(如ISAPI ASP 组件) 功能减弱
工作设置
线程流计数器
Internet Information Services Global
缓存命中
Memory
可用字节
每秒页面错误
Web Service(_Total)
每秒接收字节数
每秒发送字节数
当前匿名用户
当前非匿名用户
当前连接
System
总处理器时间
每秒上下文转换
每秒系统调用
Processor(0) (each processor)
DPC速率
每秒中断数
每秒排队的DPC
性能计数器中的结果要写入一个特殊结果文件, testname.prf (其中 testname是测试的名字)。这是一个用逗号分隔开的文本文件,可以用任何标准文本编辑器来阅读,或用它来作为电子表格或数据库的输入。但是这个文件不能直接用PerfMon读。这个文件包含头信息(计数器数、机器名、命名的起始时间)、栏头、一个包含收集的性能数据的表格。有关完整的语法和这个文件的使用,可以参考WCAT文档
浙公网安备 33010602011771号