2002-09-16 12:02
利用自定义Web控件构造XML网络服务应用
本文将要告诉您:在全新的.NET平台上,利用自定义Web控件来使用XML网络服务是多么简单。
什么是自定义Web控件?让我们来看看微软的解释:“Web控件运行在Web服务器上,它包括表单控制(例如:按钮和文本框等)和某些特殊用途的控件(例如:日历控件等)。因此,Web控件允许您通过编程控制这些网页元素。Web控件比HTML控件更加抽象,故它的目标模型不受HTML语法的限制”(原文见http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebUIWebControls.asp)。
稍后我们将利用Web控件在网页上显示一些文本。
微软对“XML网络服务”所下的定义是:“遵循标准的Internet协议,存在于Web服务器上的可编程实体”(原文见http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemWebServices.asp)。
现在来创建一个简单的Web服务器控件,它的功能是从可扩展标示语言(XML)网络服务中读取文本,并且显示在网页上;所用的工具是在DOS方式下的一个简单的文本编辑器。这个例子非常实用,因为Web服务器控件是一个独立的软件包。您只需要发布编译过的DLL文件,而用户只需用鼠标把控件拖放到目标网页即可,余下的工作全部由控件来完成。这样,大多数Web应用都可以实现高度的模块化,因为所有的繁琐工作都被封装到控件内部了。
第一步:取得数据
现在市场上有许多优秀的XML网络服务可供选择。我将选择一种能产生引文(出自名家或非名家之笔)的Web服务供本文使用。因此我们的第一任务,就是要选定最合适的XML网络服务。候选的公共Web服务有三个:
1.SANTRA Technology的iON服务 - http://www.mysantra.com
2.XMethods的Web服务 - http://www.xmethods.com
3.Sal
Services的Web服务经纪人 - http://www.salcentral.com
我个人偏爱http://www.mysantra.com,因为它提供许多高级功能:监听、警示、运行时间统计等,还有便利的比较功能。我们将要用到的内容是Santra经过反复搜索和比较之后才提供的。在Santra服务详情(http://www.mysantra.com/MyService_Details.asp?service_id=358)里还包含WSDL文件的地址,现在把这个路径复制到剪贴板里,在工程里将用它来建立Web服务引用。
第二步:准备工作
首先,创建工程文件夹,例如“c:\inetpub\WebControls\Quote\”,导入Web服务引用。
然后,点击Start->Run,键入cmd,回车,切换到工程所在目录(cd
c:\inetpub\WebControls\Quote),现在我们可以导入Web服务了。
在.NET框架里,有一个便利的公用程序wsdl.exe。
Web服务描述语言
(WSDL)工具为ASP.NET的Web服务生成代码,位于WSDL的客户端读取文件、XSD
schema和.discomap发现文件(译者注:发现文件是包含所有可用Web服务摘要的XML文件)。(参见http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cptools/html/cpgrfwebservicesdescriptionlanguagetoolwsdlexe.asp)。wsdl.exe能与disco.exe联用。
键入wsdl/?可以得到wsdl.exe的简单帮助信息(完整的描述已经超出本文范围)。这里用到的命令非常简单:
wsdl/namespace:SantraQuote http://rob.santra.com/webservices/public/quote/index.asmx?wsdl
输出结果:
Microsoft (R) Web Services Description Language Utility
[Microsoft (R)
.NET Framework, Version 1.0.3328.4]
Copyright (C) Microsoft Corporation
1998-2001. All rights reserved.
Writing file 'C:\Inetpub\WebControls\Quote\QuoteService.cs'.
通过这条命令,我们将在名字空间SantraQuote下使用我们给出的URL提供的XML网络服务生成一个代理服务类,相应的类文件QuoteService.cs将被自动生成。
现在把我们的Web控件代码加到代理服务类中。为什么要把代码直接加进去?固然,其他Web服务程序可以通过定义另外的名字空间和类,并且引用代理服务类实现复用;但是,我们要发布的是单个自我包含的DLL文件,因此我们把控件代码全部封装到同一个文件和名字空间里。
第三步:编码Web控件
在我们的QuoteService.cs文件里面有许多代码用于加工XML网络服务提供的内容,不管它。首先,为名字空间UI和WebControls建立引用:
using System.Web.UI;
using System.Web.UI.WebControls;
然后,增加一个QuoteControl类,它只有一个方法(Render),其功能是调用QuoteService类的“Quote”方法:
public class QuoteControl : Control {
QuoteService QS = new
QuoteService();
protected override void Render( HtmlTextWriter writer) {
writer.Write(QS.Quote());
}
}
现在,我们可以编译名字空间了。在DOS提示状态下,我们将会使用 C#编译器csc。在编译以前,先看看它的帮助信息(csc
/?)。本例我们仅仅用到一个命令:
csc /t:library /out:C:\Inetpub\wwwroot\bin\QuoteServiceControl.dll QuoteService.cs
输出结果是:
Microsoft (R) Visual C# .NET Compiler version 7.00.9372.1
for Microsoft
(R) .NET Framework version 1.0.3328
Copyright (C) Microsoft Corporation
2001. All rights reserved.
这个结果代表编译成功。如果发生任何错误,它将会有详细的解释,并指出错误在哪里。因此,通过简单的调试,控件就能通过编译了。
命令行中的/t参数用来指定目标类型,我们用的是library,以便应用于其他工程;此外,我们还用了/out:参数指定DLL文件名(QuoteServiceControl.dll)和目标路径(本例在Web根目录下的bin子目录)。
忙了大半天,最终得到了什么?呃,请看看Web根目录下的bin子目录,您会发现QuoteServiceControl.dll这个文件,它包含了我们的Web服务器控件的全部代码,并且能被ASPX页面调用。
第四步:编码ASP.NET测试页
为了简单起见,我们仍然使用自己的文本编辑程序,而不是Visual Studio.NET(VS.NET)工具。下面我们建立一个小小的测试页(c:\inetpub\wwwroot\quote\index.aspx),仅有两行代码。
第一行:
<%@ Register TagPrefix="CTL" Namespace="SantraQuote" Assembly="QuoteServiceControl" %>
请注意<%@ Register 后面的内容。它的作用是注册控件(DLL的文件名字)到指定的名字空间(SantraQuote),并且绑定到一个标记前缀(CTL)。此标记前缀可以任意命名,用于在表单中调用Web服务器控件。
第二行:
<CTL:QuoteControl runat="server"/>
这一行就把我们的控件加到网页中。
完整的代码是:
<%@ Register TagPrefix="CTL" Namespace="SantraQuote"
Assembly="QuoteServiceControl" %>
<html>
<body>
Random Quote:
<CTL:QuoteControl runat="server" />
</body>
</html>
最后,我们在Web浏览器中测试该页:在地址栏中输入http://localhost/quote即可。第一次运行时,它会多花几钟进行编译,随后将随机地显示引文。若点击Reload刷新,则页面显示将大大加快。
接下来,我们继续讨论如何在VS.NET环境中使用该控件。
第五步:在VS.NET中使用控件
首先,创建一个C# ASP.NET新工程“http://localhost/Quote.NET”。待IDE环境创建空白的新工程以后,我们就把组件加入工具箱(工具箱位于屏幕左边):选择Components,按右键,选择Customize Toolbox,在.NET Framework Components里,点Browser,选中c:\inetpub\wwwroot\bin\QuoteServiceControl.dll。它将会在SantraQuote名字空间里找到两个类,我们只需要其中的QuoteControl,故反选QuoteService,点OK。现在可以看到QuoteControl出现在工具箱中。点击它并且拖到Webform1.aspx页面。此时控件立即开始从Web服务读取文本并产生输出了。您也可以使用HTML面板进行编辑和格式化输出。测试前,把默认Web窗体重新命名为“index.aspx”。完成编辑以后点Play按钮。系统将自动打开一个IE窗口,并连接到我们的网页。嗯,一切顺利。关掉IE浏览器,返回IDE环境。现在您已经在VS.NET环境下构建了演示控件。以后在http://localhost/Quote.NET/index.aspx 就可以看到它了!
小结
衷心希望本文让您对Web控件有了一个基本认识,并且可以动手构造它了。如果您有任何疑问,请随时与我们联系。