爱飞 发表于 2015-1-16 22:26:38

ASP网站制作之> 第八章 用C#写组件(rainbow 翻译...

使用filesystemobject,可以对服务器上的文件进行操作,浏览、复制、移动、删除等。有ado的支持,asp对数据库的操作非常得心应手。你甚至可以像使用本地数据库那样,管理远程主机上的数据库,对表格、记录进行各种操作。第八章用C#写组件

这一章关于用C#写组件。你学到怎样写一个组件,怎样编译它,且怎样在一个客户程序中利用它。更深切一步是使用名字空间来构造你的使用程序。
这章由两个次要小节组成:
。你的第一个组件
。利用名字空间事情

8.1你的第一个组件
到今朝为止,在本书中提到的例子都是在统一个使用程序中间接利用一个类。类和它的利用者被包括在统一个实行文件中。如今我们将把类和利用者分别到组件和客户,它们分离位于分歧的二进制文件中(可实行文件)。
只管你仍旧为组件创立一个DLL,但其步骤与用C++写一个COM组件不同很年夜。你很少触及究竟层布局。以下大节申明了怎样构建一个组件和利用到它的客户:

。构建组件
。编译组件
。创立一个复杂的客户使用程序

8.1.1构建组件
由于我是一个利用典范迷,我决意创立一个相干Web的类,以便利你们利用。它前往一个Web网页并贮存在一个字符串变量中,以供厥后重用。一切这些编写都参考了.NET框架的匡助文档。
类名为RequestWebPage;它有两个机关函数――一个属性和一个办法。属性被定名为URL,且它贮存了网页的Web地点,由办法GetContent前往。这个办法为你做了一切的事情(见清单8.1)。

清单8.1用于从Web服务器前往HTML网页的RequestWebPage类

1:usingSystem;
2:usingSystem.Net;
3:usingSystem.IO;
4:usingSystem.Text;
5:
6:publicclassRequestWebPage
7:{
8:privateconstintBUFFER_SIZE=128;
9:privatestringm_strURL;
10:
11:publicRequestWebPage()
12:{
13:}
14:
15:publicRequestWebPage(stringstrURL)
16:{
17:m_strURL=strURL;
18:}
19:
20:publicstringURL
21:{
22:get{returnm_strURL;}
23:set{m_strURL=value;}
24:}
25:publicvoidGetContent(outstringstrContent)
26:{
27://反省URL
28:if(m_strURL=="")
29:thrownewArgumentException("URLmustbeprovided.");
30:
31:WebRequesttheRequest=(WebRequest)WebRequestFactory.Create(m_strURL);
32:WebResponsetheResponse=theRequest.GetResponse();
33:
34://给回应设置字节缓冲区
35:intBytesRead=0;
36:Byte[]Buffer=newByte;
37:
38:StreamResponseStream=theResponse.GetResponseStream();
39:BytesRead=ResponseStream.Read(Buffer,0,BUFFER_SIZE);
40:
41://利用StringBuilder以减速分派历程
42:StringBuilderstrResponse=newStringBuilder("");
43:while(BytesRead!=0)
44:{
45:strResponse.Append(Encoding.ASCII.GetString(Buffer,0,BytesRead));
46:BytesRead=ResponseStream.Read(Buffer,0,BUFFER_SIZE);
47:}
48:
49://赋给输入参数
50:strContent=strResponse.ToString();
51:}
52:}

本应当使用无参数机关函数完成事情,但我决意在机关函数中初始化URL,这大概会很有效。当厥后决意要改动URL时――为了前往第二个网页,比方,经由过程URL属性的get和set会见标记使它被公然了。
风趣的事始于GetContent办法。起首,代码对URL实施非常复杂的反省,假如它不合适,就会激发一个ArgumentException非常。以后,我哀求WebRequestFactory,以创立一个基于传送给它的URL的WebRequest工具。
由于我不想发送cookies、附加头和扣问串等,以是当即会见WebResponse(第32行)。假如你必要哀求上述任何的功效,必需在这一行之前完成它们。
第35和36行初始化一个字节缓冲区,它用于从前往流中读数据。临时疏忽StringBuilder类,只需前往流中仍旧有要读的数据,while轮回就会复杂地反复。最初的读操纵将前往零,因而停止了该轮回。
如今我想回到StringBuilder类。为何用这个类的实例而不是复杂地把字节缓冲区兼并到一个字符串变量?看上面这个例子:
strMyString=strMyString+"somemoretext";
这里很分明,你正在拷贝值。常量"somemoretext"以一个字符串变量范例被加框,且依据加法操纵创立了一个新的字符串变量。接着被赋给了strMyString。有良多次拷贝,是吗?
但你大概引发争辩
strMyString+="somemoretext";
不要夸耀这类举动。对不起,关于C#这是一个毛病的谜底。其操纵完整与所形貌的赋值操纵不异。
不触及该成绩的别的的路子是利用StringBuilder类。它使用一个缓冲区举行事情,接着,在没有产生我所形貌的拷贝举动的情形下,你举行追加、拔出、删除和交换操纵。这就是为何我在类中利用它来兼并那些读自缓冲区中的内容。
该缓冲区把我带进了这个类中最初主要的代码片断――第45行的编码转换。它只不外触及到我取得哀求的字符集。
最初,当一切的内容被读进且被转换时,我显式地从StringBuilder哀求一个字符串工具并把它赋给了输入变量。一个前往值仍旧会招致别的的拷贝操纵。

8.1.2编译组件
到今朝为止,你所做的事情与在一般使用程序的外部编写一个类没有甚么区分。所分歧的是编译历程。你必需创立一个库而不是一个使用程序:
csc/r:System.Net.dll/t:library/out:wrq.dllwebrequest.cs
编译开关/t:library告知C#编译,要创立一个库而不是征采一个静态Main办法。一样,由于我正在利用System.Net名字空间,以是必需援用(/r:)它的库,这个库就是System.Net.dll。
你的库定名为wrq.dll,如今它筹办用于一个客户使用程序。由于在这章中我仅利用公有组件事情,以是你不用把库拷贝到一个特别的地位,而是拷贝到客户使用程序目次。

8.1.3创立一个复杂的客户使用程序
当一个组件被写成且被乐成地编译时,你所要做的就是在客户使用程序中利用它。我再次创立了一个复杂的命令行使用程序,它前往了我保护的一个开辟站点的首页(见清单8.2)。

清单8.2用RequestWebPage类前往一个复杂的网页

1:usingSystem;
2:
3:classTestWebReq
4:{
5:publicstaticvoidMain()
6:{
7:RequestWebPagewrq=newRequestWebPage();
8:wrq.URL="http://www.alphasierrapapa.com/iisdev/";
9:
10:stringstrResult;
11:try
12:{
13:wrq.GetContent(outstrResult);
14:}
15:catch(Exceptione)
16:{
17:Console.WriteLine(e);
18:return;
19:}
20:
21:Console.WriteLine(strResult);
22:}
成员

注重,我已在一个trycatch语句中包括了对GetContent的挪用。个中的一个缘故原由是GetContent大概激发一个ArgumentException非常。别的,我在组件外部挪用的.NET框架类也能够激发非常。由于我不克不及在类的外部处置这些非常,以是我必需在这里处置它们。
其他的代码只不外是复杂的组件利用――挪用尺度的机关函数,存取一个属性,并实行一个办法。但等一下:你必要注重什么时候编译使用程序。必定要告知编译器,让它援用你的新组件库DLL:
csc/r:wrq.dllwrclient.cs
如今万事俱备,你能够测试程序了。输入了局会滚屏,但你能够看到使用程序事情。利用了惯例的表达式,你也能够增添代码,以剖析前往的HTML,并根据你团体的喜欢,提失信息。我料想会利用到这个类新版本的SSL(平安套接字层),用于ASP+网页中的在线信誉卡考证。
你大概会注重到,没有特别的using语句用于你所创立的库。缘故原由是你在组件的源文件中没有界说名字空间。

8.2利用名字空间事情
你常常利用到名字空间,比方System和System.Net。C#使用名字空间来构造程序,并且分层的构造使一个程序的成员传到另外一个程序变得更简单。
只管不强迫,但你总要创立名字空间,以分明地辨认使用程序的条理。.NET框架会给出构建这类分层的优秀头脑。
以下的代码片断显现了在C#原文件中复杂的名字空间My.Test(点号暗示一个分层品级)的声明:

namespaceMy.Test
{
//这里的任何器材属于名字空间
}

当你会见名字空间中的一个成员时,也有需要利用名字空间标识符完整地考证它,大概使用using标记把一切的成员引进到你以后的名字空间。本书后面的例子演示了怎样使用这些手艺。
在入手下手利用名字空间之前,只要多数有关存取平安的词。假如你不增添一个特定的存取润色符,一切的范例将被默许为internal。当你想从内部会见该范例时,利用public。不同意别的的润色符。
这是关于名字空间充实的实际。让我们持续完成该实际――以下大节申明了当构建组件使用程序时,怎样利用名字空间
。在名字空间中包装类
。在客户使用程序中利用名字空间
。为名字空间增添多个类

8.2.1在名字空间中包装类
既然你晓得了名字空间的实际寄义,那末让我们在实际生存中完成它吧。在这个和行将会商到的例子中,天然选择到的名字空间是Presenting.CSharp。为了不使你腻烦,仅仅是把RequestWebPage包装到Presenting.CSharp中,我决意写一个类,用于Whois查找(见清单8.3)。

清单8.3在名字空间中完成WhoisLookup类

1:usingSystem;
2:usingSystem.Net.Sockets;
3:usingSystem.IO;
4:usingSystem.Text;
5:
6:namespacePresenting.CSharp
7:{
8:publicclassWhoisLookup
9:{
10:publicstaticboolQuery(stringstrDomain,outstringstrWhoisInfo)
11:{
12:constintBUFFER_SIZE=128;
13:
14:if(""==strDomain)
15:thrownewArgumentException("Youmustspecifyadomainname.");
16:
17:TCPClienttcpc=newTCPClient();
18:strWhoisInfo="N/A";
19:
20://妄图毗连whois服务器
21:if(tcpc.Connect("whois.networksolutions.com",43)!=0)
22:returnfalse;
23:
24://猎取流
25:Streams=tcpc.GetStream();
26:
27://发送哀求
28:strDomain+="
";
29:Byte[]bDomArr=Encoding.ASCII.GetBytes(strDomain.ToCharArray());
30:s.Write(bDomArr,0,strDomain.Length);
31:
32:Byte[]Buffer=newByte;
33:StringBuilderstrWhoisResponse=newStringBuilder("");
34:
35:intBytesRead=s.Read(Buffer,0,BUFFER_SIZE);
36:while(BytesRead!=0)
37:{
38:strWhoisResponse.Append(Encoding.ASCII.GetString(Buffer,0,BytesRead));
39:BytesRead=s.Read(Buffer,0,BUFFER_SIZE);
40:}
41:
42:tcpc.Close();
43:strWhoisInfo=strWhoisResponse.ToString();
44:returntrue;
45:}
46:}
47:}

名字空间在第6行被声明,并且它用第7行和第47行的年夜括弧括住了WhoisLookup类。要声明本人新的名字空间,实践要做的就是这些。
在WhoisLookup类中固然具有一些风趣代码,出格是因为它申明了利用C#举行socket编程是何等的简单。在staticQuerymethod中经由not-so-stellar域名反省以后,我实例化了TCPClient范例的一个工具,它用来完成具有Whois服务器的43端口上的一切通信。在第21行创建了服务器毗连:
if(tcpc.Connect("whois.networksolutions.com",43)!=0)
由于毗连失利是意料到的了局,以是这个办法不克不及激发一个非常。(你还记着非常处置的“要”和“不要”吗?)前往值是一个毛病代码,而前往零则申明毗连乐成。
关于Whois查找,我必需起首收回一些信息给服务器――我要查找的域名。要完成此项事情,起首取得一个援用给以后TCP毗连的双向流(第25行)。接着附加上一个回车/换行对给域名,以暗示扣问停止。从头以字节数组打包,向Whois服务器发送一个哀求(第30行)。
余下的代码和RequestWebPage类极为类似。在该类中,我再次使用一个缓冲区从远程服务器读进回应。当缓冲区完成读进后,毗连被断开。前往的回应被转给了挪用者。我明白地挪用Close办法的缘故原由是我不想守候渣滓搜集器损坏毗连。毗连工夫不要太长,以避免占用TCP端口这类有数资本。
在可使用.NET组件中的类之前,你必需把它作为一个库来编译。只管如今有了一个已界说的名字空间,该编译命令仍旧没有变:
csc/r:System.Net.dll/t:library/out:whois.dllwhois.cs
注重,假如你想该库按与C#源文件不异的办法定名,就没有需要划定/out:开关。划定该开关是一个优秀的习气,由于良多项目不会只由单个源文件构成。假如你划定了多个源文件,该库以名单中的第一个定名。

8.2.2在客户使用程序中利用名字空间
因为你利用了名字空间开辟组件,以是客户也要引进名字空间
usingPresenting.CSharp;
大概给名字空间中的成员利用完整资历名(fullyqualifiedname),比方
Presenting.CSharp.WhoisLookup.Query(...);

假如你不希冀在名字空间中引进的成员之间呈现抵触,using标记(directive)是首选,出格是因为你具有很少的范例时。利用组件的客户程序样本在清单8.4中给出。

清单8.4测试WhoisLookup组件

1:usingSystem;
2:usingPresenting.CSharp;
3:
4:classTestWhois
5:{
6:publicstaticvoidMain()
7:{
8:stringstrResult;
9:boolbReturnValue;
10:
11:try
12:{
13:bReturnValue=WhoisLookup.Query("microsoft.com",outstrResult);
14:}
15:catch(Exceptione)
16:{
17:Console.WriteLine(e);
18:return;
19:}
20:if(bReturnValue)
21:Console.WriteLine(strResult);
22:else
23:Console.WriteLine("Couldnotobtaininformationfromserver.");
24:}
25:}

第2行使用using标记引进了Presenting.CSharp名字空间。如今,我不管甚么时分援用WhoisLookup,都能够疏忽名字空间的完整资历名了。
该程序对microsoft.com域举行一次Whois查找――你也能够用本人的域名取代microsoft.com。同意命令行参数传送域名,可以使客户的用处更广。清单8.5完成了该功效,但它不克不及完成得当的非常处置(为了使程序更短)。

清单8.5传送命令行参数给Query办法

1:usingSystem;
2:usingPresenting.CSharp;
3:
4:classWhoisShort
5:{
6:publicstaticvoidMain(string[]args)
7:{
8:stringstrResult;
9:boolbReturnValue;
10:
11:bReturnValue=WhoisLookup.Query(args,outstrResult);
12:
13:if(bReturnValue)
14:Console.WriteLine(strResult);
15:else
16:Console.WriteLine("Lookupfailed.");
17:}
18:}

你所必需做的就是编译这个使用程序:
csc/r:whois.dllwhoisclnt.cs
接着可使用命令行参数实行该使用程序。比方,以microsoft.com参数实行
whoisclntmicrosoft.com
当查询运转乐成时,就会呈现microsoft.com的注册信息。(清单8.6显现了输入的大略版本)这是一个很便利的小程序,经由过程组件化的路子写成的,花不到一个小时。假如用C++编写,要花多长工夫?很侥幸,我再也想不起当第一次用C++如许做时,花了多长的工夫。

清单8.6有关microsoft.com(大略)的Whois信息
D:CSharpSamplesNamespace>whoisclient
...

Registrant:
MicrosoftCorporation(MICROSOFT-DOM)
1microsoftway
redmond,WA98052
US
DomainName:MICROSOFT.COM

AdministrativeContact:
MicrosoftHostmaster(MH37-ORG)msnhst@MICROSOFT.COM
TechnicalContact,ZoneContact:
MSNNOC(MN5-ORG)msnnoc@MICROSOFT.COM
BillingContact:
Microsoft-InternicBillingIssues(MDB-ORG)msnbill@MICROSOFT.COM

Recordlastupdatedon20-May-2000.
Recordexpireson03-May-2010.
Recordcreatedon02-May-1991.
Databaselastupdatedon9-Jun-200013:50:52EDT.

Domainserversinlistedorder:

ATBD.MICROSOFT.COM131.107.1.7
DNS1.MICROSOFT.COM131.107.1.240
DNS4.CP.MSFT.NET207.46.138.11
DNS5.CP.MSFT.NET207.46.138.12

8.2.3增添多个类到名字空间
使WhoisLookup和RequestWebPage类共存于统一个名字空间是何等的美好。既然WhoisLookup已经是名字空间的一部分,以是你只须使RequestWebPage类同样成为该名字空间的一部分。
需要的改动很简单被使用。你只需利用名字空间封装RequestWebPage类就能够了:

namespacePresenting.CSharp
{
publicclassRequestWebPage
{
...
}
}

只管两个类包括于两个分歧的文件,但在编译后,它们都是不异名字空间的一部分:
csc/r:System.Net.dll/t:library/out:presenting.csharp.dllwhois.cswebrequest.cs

你不用要依照名字空间的名字给DLL定名。但是,如许做会有助你更简单你记着,当编译一个客户使用程序时要援用哪个库。

8.3小结
在这一章中,你学到了怎样构建一个能够在客户程序中利用的组件。最后,你不用体贴名字空间,但前面第二个组件中先容了该特征。名字空间在表里部均是构造使用程序的好举措。
C#中的组件很简单被构建,并且只需库和使用程序共存于不异的目次,你乃至不用举行特别的安装。当要创立必需被多个客户利用的类库时,步骤就有所改动――而下一章将会告知你为何。

Access是一种桌面数据库,只适合数据量少的应用,在处理少量数据和单机访问的数据库时是很好的,效率也很高。但是它的同时访问客户端不能多于4个。access数据库有一定的极限,如果数据达到100M左右,很容易造成服务器iis假死,或者消耗掉服务器的内存导致服务器崩溃。

灵魂腐蚀 发表于 2015-1-19 12:29:40

兴趣爱好,那么你无须学编程,申请一个域名和空间,在网上下载一些免费开源的CMS系统,你不用改代码,只须熟悉它们的后台操作,像office一样简单方便,很快就能建一个站点,很多站长都是这样做的

若相依 发表于 2015-1-27 06:02:05

从事这个行业,那么你可以学ASP语言,简单快速上手,熟练dreamweav排版,写asp代码,熟练photoshop处理图片,打好基础就行了

简单生活 发表于 2015-2-5 03:11:09

我就感觉到ASP和一些常用的数据库编程以及软件工程方面的思想是非常重要的。我现在也在尝试自己做网页,这其中就用到了ASP,我想它的作用是可想而知的。

若天明 发表于 2015-2-11 03:15:03

我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。

飘飘悠悠 发表于 2015-3-1 20:28:07

下载一个源代码,然后再下载一个VBScript帮助,在源代码中遇到不认识的函数或是其他什么程序,都可以查帮助进行解决,这样学习效率很高。

透明 发表于 2015-3-10 23:39:57

掌握asp的特性而且一定要知道为什么。

莫相离 发表于 2015-3-17 16:10:15

我就感觉到ASP和一些常用的数据库编程以及软件工程方面的思想是非常重要的。我现在也在尝试自己做网页,这其中就用到了ASP,我想它的作用是可想而知的。

小妖女 发表于 2015-3-24 12:07:29

以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。
页: [1]
查看完整版本: ASP网站制作之> 第八章 用C#写组件(rainbow 翻译...