[VB.NET]单元九 WebService应用

单元九 WebService应用

[学习目标] 本单元主要介绍VB.NET中强大的WebService功能。学习建立服务器端WebService网络服务程序、B/S方式的Browse客户端浏览器程序和C/S方式的Windows应用程序窗体客户端程序,调用WebService网络服务程序的方法。

随着Internet的广泛应用和发展,任何一种应用程序开发语言如果不具备Web开发能力,必将被市场所淘汰。为此,Microsoft公司在加强.NET框架的传统应用程序设计能力的同时,重点提升了各个语言的Web应用程序开发能力和效率。在VB.NET中,提供了更加直观和方便的Web应用程序开发环境。

9.1 建立WebService服务程序

【案例9-1】WebService服务函数的建立。

本案例是建立一个WebService服务程序,它提供了一个服务函数。函数当用户在客户端界面的第一个文本框输入0~9任一数字,单击"将数字字符转化为英文单词"命令按钮时被调用;调用该WebService服务函数后,返回相应用户在客户端第一个文本框中输入数字字符对应的英文单词。服务端和客户端的运行界面效果图分别如图9-1和图9-2所示。

图9-1 WebService提供的服务函数

图9-2 调用WebService提供的服务函数的客户端界面

图9-2 调用WebService提供的服务函数的客户端界面在案例9-2中实现,放在这里显示是为了让用户更直观地理解案例9-1。

[技能目标]

学会建立WebService服务并调用WebService服务。

[操作要点与步骤]

为了提供WebService服务功能,必需先建立WebService服务程序,下面是实现本实例WebService服务程序功能的具体操作步骤:

1. 启动VS.NET,选择"文件→新建→项目"菜单,弹出"新建项目"对话框,如图9-3所示,在该对话框的"项目类型"中选择"Visual Baisc项目",在"模板"列表中选择"ASP.NET Web服务"项,在"位置"文本框中输入"http://localhost/translateWebservice"程序发布文件夹的位置。名称栏自动出现项目名"TranslateWebservice",它是只读的,用户不可改写,要改写必须在在"位置"文本框中改写。单击"确定"按钮,系统将自动创建一个WebService服务的站点所需的所有内容(自动建立TanslateWebservice目录,并将该目录配置为虚拟目录)。

1.WebService服务的translateWebservice项目存放在到IIS的 Web发布文件夹下,该文件夹通常在:"操作系统所在的盘符: /Inetpub/wwwroot/"。(本案例的文件夹是在"D:/Inetpub/wwwroot/TranslateWebService")

2.系统将自动创建一个WebService服务的站点所需的所有内容的前提是在本机上正确安装IIS并启动。

图9-3新建项目对话框

2. 在图9-3所示单击"确定"按钮,屏幕会出现如图9-4所示的界面,表明计算机正在建立Webservice服务站点TanslateWebservice。

图9-4 计算机正在建立Webservice服务站点TanslateWebservice的界面

3. 在屏幕出现如图9-4所示界面后,接着出现如图9-5所示的界面,表明计算机已建立了Webservice服务站点TanslateWebservice。图9-5所示的界面中可以清楚地看出在TanslateWebservice解决方案下有一个项目名为TanslateWebservice,在项目名为TanslateWebservice下面有一些服务器端的服务文件。例如:服务源文件Service1.asmx。

在图9-5 Webservice设计界面,界面中默认文件名为Service1.asmx.vb,并默认为设计视图页面,该页面的正中间有一段文字:"若要在类中添加组件,请从服务器资源管理器或工具箱中拖动它们,然后使用属性窗口来设置它们的属性,若要为类创建方法和事件,请单击此处切换到代码视图。"

页面的正中间有一段文字说明Webservice可以设计自己的服务界面,如果用户不设计服务界面,则运行服务端的程序时是没有自己的服务界面的。

图9-5 计算机已建立了Webservice服务站点TanslateWebservice的界面

单击页面正中间一段文的[此处]超链接将切换到代码视图,系统自动生成的代码如下:

Imports System.Web.Services

<System.Web.Services.WebService(Namespace := "http://tempuri.org/translateWebService/Service1")> _

Public Class Service1

Inherits System.Web.Services.WebService

#Region " Web 服务设计器生成的代码 "

Public Sub New()

MyBase.New()

'该调用是 Web 服务设计器所必需的。

InitializeComponent()

'在 InitializeComponent() 调用之后添加您自己的初始化代码

End Sub

'Web 服务设计器所必需的

Private components As System.ComponentModel.IContainer

'注意: 以下过程是 Web 服务设计器所必需的

'可以使用 Web 服务设计器修改此过程。

'不要使用代码编辑器修改它。

<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

components = New System.ComponentModel.Container()

End Sub

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

'CODEGEN: 此过程是 Web 服务设计器所必需的

'不要使用代码编辑器修改它。

If disposing Then

If Not (components Is Nothing) Then

components.Dispose()

End If

End If

MyBase.Dispose(disposing)

End Sub

#End Region

' Web 服务示例

' HelloWorld() 示例服务返回字符串 Hello World。

' 若要生成项目,请取消注释以下行,然后保存并生成项目。

' 若要测试此 Web 服务,请确保 .asmx 文件是起始页

' 并按 F5 键。

'

'<WebMethod()> _

'Public Function HelloWorld() As String

' Return "Hello World"

'End Function

End Class

在上面自动生成的源代码中,有一个函数名为"HelloWorld()"的函数被标注出来,该函数是一个通用的例子,在源代码中是被注释掉了,用户只要将被注释掉的HelloWorld()函数复制一份,然后去掉复制后代码行前面的注释符"'",最后将HelloWorld()函数名改为自己欲定义的函数名,并编写实现该定义函数功能的代码即可。

下面是按照上述方法编写实现将number变量保存的数字转换成相应的英文单词的函数translate()的代码。

HelloWorld()函数前面有一个尖括号的标识符:<WebMethod()>,这个标识符说明了这个函数可以通过WEB访问,用户编写的WEB函数也必须以<WebMethod()>开始进行标记。

<WebMethod()> _

Public Function translate(ByVal number As String) As String

Select Case number

Case 0

Return "zero"

Case 1

Return "one"

Case 2

Return "two"

Case 3

Return "three"

Case 4

Return "four"

Case 5

Return "five"

Case 6

Return "six"

Case 7

Return "seven"

Case 8

Return "eight"

Case 9

Return "nine"

Case Else

Return "输入有错,请输入0~9"

End Select

End Function

4. 此时启动Windows系统IIS服务管理器,如图9-6所示,从图9-6用户可以清楚地看到确实建立了Webservice服务站点,站点名"TanslateWebservice"。

图9-6 Windows系统IIS服务管理器

5. 在查看Windows系统IIS服务管理器的Webservice服务站点后,用户可以查看Webservice服务站点物理目录在D:/Inetpub/wwwroot/translateWebService下。如图9-7所示。

图9-7 Webservice服务站点物理目录

6. 按第3步建立好Service1.asmx.vb代码后,按F5键运行程序,会在浏览器中出现前面在案例9-1所说明的图9-1所示的信息。

这其实不是什么"运行结果",只不过是Visual Studio.NET生成的一个说明页面,类似ReadMe之类的东西,但是,如果单击图9-1中的Translate超链接,就会看到一个测试页面,如图9-8所示。

7. 如果在number输入框中填入"6",如图9-8所示,然后单击[调用]按钮,一个令人惊异的信息出现在如图9-9所示。

这是一个依照SOAP协议生成的XML页面。用户可能觉得它很难懂,确实,它也不是给人看的,是给计算机看的。尽管如此,"six"这个单词还是清楚的,很显然,调用成功了。

当然,WebService并不是这样调用的,可以用B/S方式的Browse客户端浏览器窗体案例程序和用C/S方式的Windows应用程序窗体客户端案例程序调用WebService的服务程序这两个案例在后面将作讲解。

由于本案例程序为ASP.NET的Web应用程序,ASP.NET的Web应用程序需要在计算机中装有IIS,如果用户的计算机中没有IIS,则必须安装IIS服务程序。

用户在实际建立WebService服务程序时,可能会遇到以下问题,笔者提供这类问题的解决方案如下:

图9-8 Translate函数的测试页面

图9-9 对WebService调用的返回

1. 有时会出现在安装完IIS,却不能正常启动,这可能是因为计算机防火墙保护所造成的。

下面是解决该问题的操作步骤:

(1)由"控制面板"→"管理工具"→"Internet信息服务",打开"Internet信息服务"窗口,如图9-10所示。

图9-10 "Internet信息服务"窗体

(3)在图9-10所示的窗体中,单击"工具栏"启动 图标,出现如图9-11所示出错提示警告框。

图9-11 出错提示警告框

(4)出现如图9-11所示出错提示警告框是由于计算机个人防火墙处于保护状态,应该停止防火墙的保护状态。

(5)在停止防火墙的保护后,再单击图9-10的窗体的"工具栏"启动 图标,则会正常启动"Internet信息服务"。

2. 有时即使正常启动IIS,但却不能正常建立WebService服务程序。

在建立WebService服务程序,会出现以下两种情况:

(1)Visual Studio .NET 已检测到指定的 Web 服务器运行的不是 ASP.NET 1.1 版

(2)Visual Studio .NET 无法确定在 Web 服务器计算机上运行的是否为 ASP.NET 1.1 版。

发现以上错误,请检查是否属于以下情况:

①确保 .NET Framework 1.1 版已安装在 Web 服务器计算机上。

②如果 ASP.NET 已安装在 Web 服务器计算机上,但仍然遇到此类错误,则可能是配置问题。纠正有问题的安装或配置,可以使用名为 aspnet_regiis 的 ASP.NET 实用工具,这个工具可以在如下所示的路径中找到:

操作系统文件夹/Microsoft.NET/Framework/v1.1.nnnn/

其中: nnnn 表示四位内部版本号。

使用 /i 开关运行该实用工具: aspnet_regiis /I

运行该实用工具:aspnet_regiis /I,可以从命令的正确目录中直接打开该命令窗口;也可以指向 Windows 的"开始/程序/Visual Studio .NET 2003/Visual Studio .NET 工具/Visual Studio .NET 命令提示",在打开的命令窗口中键入 aspnet_regiis /I即可。

[相关知识]

WebService服务是计算机的快速发展催生的新兴技术,是微软.NET蓝图中最为耀眼的技术之一。在一台计算机上,如果有多个程序需要调用同一个程序模块,则这些程序可以通过COM技术实现;推而广之,如果要在遍布全球的互联网上、世界各地的多个站点都要调用某个站点上的程序的功能,该怎么办呢?显然,使用COM技术是无法实现的,而WebService程序就是主要解决这类问题的。 WebService程序通常也分为WebService服务程序和WebService客户程序两大类,WebService服务程序负责提供服务,WebService客户端程序则负责使用服务。在VS.NET中,建立WebService程序通常都是以向导方式实现的,用户只需要在其中添加特定的服务功能代码即可。

ASP.NET是一个统一的WEB开发平台,它为创建WEB应用程序和WEB服务提供高级服务,ASP.NET提供了一种新的编程模型和底层结构,从而以前所未有的速度、灵活性和简易性创建功能强大的WEB应用程序。

ASP.NET并不仅仅是一个新版本,而是Web应用程序编程方面的一个全新概念和方法。ASP.NET中的新功能并不是对ASP的改进,设计它的初衷是为用户提供最佳的应用程序架构。这就意味着在许多领域中,ASP.NET与ASP是不兼容的,不过从长远来说这是一件好事。这表明ASP.NET为应用程序的开发提供了一个功能强得多的平台,同时它也具备了更多的优点。ASP.NET与ASP是互不干扰的。即使两者之间有许多不同,但安装ASP.NET并不会破坏现有的ASP应用程序,之所以如此是由于ASP.NET页有一个新的文件扩展名(.aspx),也就是说它们的处理方式和ASP页是不同的。

Web服务是ASP.NET框架中的一个重要的内容,主要用于程序和程序之间的通信,可以从根本上改变设计应用程序的方式。以前,应用程序只能运行在离散的、受控制的服务器组上。而通过Web服务,应用程序可以运行在广泛分布的资源集上并进行数据的处理和显示,并且不管这些资源是否具有相同的类型、服务器和操作系统等。Web服务为程序提供了通过Internet使用SOAP(Simple Object Access Protocol,简单对象访问协议)协议进行通信的机制,它支持分布式环境,而且不再需要关心应用程序使用什么技术。

在VB.NET中,实际上并不需要知道后台进行了什么操作。发送给Web服务的信息会由ASP.NET框架自动转换为XML协议。ASP.NET框架管理该过程,接收返回的XML文档,并把返回的数据按需要放在组件接口上。VB.NET在创建Web服务的同时创建一个名称为Service1.asmx的文件。

Web服务就是可编程的URL,就是使用标准的Internet协议(比如HTTP或XML)远程可调用的应用程序组件。它要想成功用于Internet就需要提供一个与操作系统无关、与程序设计语言无关、与机器类型无关、与运行环境无关的平台。

与WEB服务相关的技术主要有以下四个方面

1.表示数据 (XML)

2.交换消息 (SOAP)

3.服务描述 (WSDL)

4.服务发现与发布 (UDDI和WS-Inspection)

第一个方面在知识点9-1-3中介绍,其它三个方面分别在知识点9-2-1、知识点9-2-2、知识点9-2-3中介绍。

为了唯一的标识XML元素,必须使用全局唯一的标示符URI。URI是一个唯一的标识资源的串(Uniform Resource Identifier),URI分成了两个子类,一个是URL,一个是URN(Uniform Resource Name)。

1. URL(Universal Resource Locator统一资源定位符):不仅定义了从何处获取资源,而且还定义了如何获取资源(即采用何种协议http或FTP)

2. URN:就是代表一个资源与位置无关的串:至于资源在何处或如何到达资源则没有任何要求,因为一个URN只是一个唯一性串。其语法提供了全局唯一性。

3. XML模式(XML Schema):

XML模式是DTD(Document Type Definition)的超集,DTD可以指定元素是包含字符数据还是其他数据或是一个空元素,DTD不能指定某个特殊元素是否包含整数、浮点数或字符串。另外,DTD有自己的语法,而XML模式遵循XML语法。

9.2 建立以B/S方式的Browse客户端浏览器程序

【案例9-2】B/S方式的Browse客户端调用WebService服务。

该案例是设计一个以B/S方式的Browse客户端浏览器窗体。当在浏览器窗体的地址栏中输入"hhttp://Localhost/Browse_Client/webform1.aspx"后会出现如图9-2所示的浏览器窗体,在第一个文本框输入0~9的任一数字字符,单击"将数字字符转化为英文单词"命令按钮时;调用案例9-1的WebService服务函数,然后在第二个文本框中显示调用WebService服务函数的返回值,该返回值是相应第一个文本框中输入数字字符对应的英文单词。

[技能目标]

学会在客户端浏览器窗体添加Web引用,并运行客户端浏览器窗体调用WebService服务。

[操作要点与步骤]

1. 启动VS.NET,新建"ASP.NET Web应用程序"模板的应用程序,位置为"http://localhost/Browse_Client",如图9-12所示。单击"确定"按钮,向导将自动创建一个默认的Web应用程序。

图9-12 创建Web应用程序

2. 在图9-14所示按下"确定"按钮,屏幕会出现象图9-4所示的界面,表明计算机正在建立ASP.NET Web应用程序。

3. 接着出现如图9-13所示的界面,表明计算机已建立了ASP.NET Web应用程序。图9-13所示的界面中可以清楚地看出在Browse_Client解决方案下有一个项目名为Browse_Client,在项目名为Browse_Client下面有一些客户端的文件。例如:客户端网页文件webform1.aspx。

图9-13已建立了ASP.NET Web应用程序

4. 在"解决方案资源管理器"对话框中,在项目文件"Browse_Client"上右击鼠标,弹出的快捷菜单,选择"添加Web引用"菜单,出现"添加Web引用"对话框,如图9-14所示。

图9-14 "添加Web引用"对话框

5. 在图9-16中单击"本地计算机上的Web服务"超级链接,系统自动列出本地计算机上的Web服务,如图9-15所示。

图9-15本地计算机上的Web服务列表

6. 根据需要选择Web服务,本案例程序选择图9-15所示的最后一行前面的超级链接Service1,即http://localhost/translateWebService/Service1.asmx的Service1服务,系统显示链接的Web服务页,如图9-16所示。

图9-16 Web服务页

7. 在图9-16所示的Web引用名位置自动显示Web引用名为:Localhost,该Web引用名Localhost可以根据需要进行修改,在后面的代码中要用到此名称,它实际上就是代理类。单击"添加引用"按钮返回webform1.aspx设计窗体,此时用户可以清楚地看到在"解决方案资源管理器"的引用项下面多了一个"Web References"引用项,在该引用项下面是Web引用名为:Localhost,如图9-17所示。

8. 在图9-17 Web窗体中添加两个文本框Web控件TextBox,两个标签Web控件Label及一个命令按钮Web控件Button,按表9-1设置以上Web控件的属性后的界面如图9-18所示。

在图9-18中每个Web控件都有一个与Windows窗体上的控件不一样的标记,在每个Web控件的左上角有一个绿色的小箭头,这些Web控件在Web窗体的HTML模板上用作控件类的引用时都在每个控件前带有前缀asp,例如,文本框的HTML标记符是asp:Textbox。

表9-1 Web控件的属性

控件名 属性名 设置值

Label1 Id Label1

Text 输入0~9的数字

Label2 Id Label2

Text 对应的数字的英文单词

TextBox1 Id Txt_num

TextBox2 Id Txt_word

Readonly True

Button Id Translate

Text 数字转换为英文单词

图9-18添加Web控件并设置属性后界面

9. 为图9-18 Web窗体中的命令按钮Web控件Button编写Click事件代码如下:

Public Class WebForm1

Inherits System.Web.UI.Page

#Region " Web 窗体设计器生成的代码 "

'该调用是 Web 窗体设计器所必需的。

<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

End Sub

Protected WithEvents Label1 As System.Web.UI.WebControls.Label

Protected WithEvents Label2 As System.Web.UI.WebControls.Label

Protected WithEvents Translate As System.Web.UI.WebControls.Button

Protected WithEvents Txt_num As System.Web.UI.WebControls.TextBox

Protected WithEvents Txt_word As System.Web.UI.WebControls.TextBox

'注意: 以下占位符声明是 Web 窗体设计器所必需的。

'不要删除或移动它。

Private designerPlaceholderDeclaration As System.Object

Private Sub Page_Init(ByVal sender As System.Object,ByVal e As System.EventArgs) _

Handles MyBase.Init

'CODEGEN: 此方法调用是 Web 窗体设计器所必需的

'不要使用代码编辑器修改它。

InitializeComponent()

End Sub

#End Region

Private Sub Translate_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _

Handles Translate.Click

Dim translate_num As New localhost.Service1

Dim english_word As String

english_word = translate_num.translate(Txt_num.Text.Trim())

If (Trim(Txt_num.Text) = "") Then

Txt_word.Text = "对不起!输入数字可能不在0~9之间,不能转换"

Else

Txt_word.Text = english_word

End If

End Sub

End Class

10. 项目的保存与运行

代码输入完成,先将项目保存,然后按F5键或单击工具栏上的运行按钮运行该项目,项目运行后,在第一文本框中输入8,单击命令按钮,调用WebService服务程序,则在第二个文本框会出现"eight",效果图如图9-19所示。

或者打开IE浏览器,在IE浏览器的地址栏中输入地址信息为"http://localhost/Browse_Client/WebForm1.aspx"后,在出现的Web窗体中的第一文本框中输入8,单击命令按钮,调用WebService服务程序,则在第二个文本框会出现"eight",运行的效果也如图9-19所示。

通过以上两个案例,用户应该对WebService有了直观的认识。一般说使用COM技术可以让方法调用跨过进程的边界(或者说从一个应用程序调用另一个应用程序),而使用DCOM技术则可以让方法调用在局域网内进行,那么通过WebService就使得Web也成了程序之间交流的场所。所以,WebService使得软件开发的模式发生了根本的变化:在Web上搭好一个框架,而具体的逻辑可以从各WebService生产者那里购买。这些WebService服务程序无需像现在的软件那样放在光盘上分发,直接将WebService服务程序放在网站上以供下载,用户只需要知道一个地址,就可以在程序中调用它们。而且,如果WebService需要升级,只要不改动接口,对用户的使用毫无影响。

更进一步地说,由于WebService是基于标准的HTTP协议来传送的,所以它可以顺利地通网关,也就是说,无论有没有网关的限制,整个Web都可以变成一个巨大的程序来运行,这种协同计算机的能力可能会产生出今天不敢想象的各种应用。

图9-19 B/S方式客户端调用WebService服务程序的效果图

[相关知识]

XML作为Internet上信息交换的标准已经得到了广泛的应用,SOAP(Simple Object Access Protocol)是用于在 Web 上交换结构化和类型信息(XML编码信息)的简单的轻量级协议,它使得任何实现基本的Internet通信服务的系统都能处理和传送XML消息。

SOAP(Simple Object Access Protocol)它包括四个部分:

1. SOAP封装(envelop),也称为SOAP信封。该信封定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;

2. SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例;

3. SOAP RPC RPC 样式(请求/响应)的消息交换模式 (RPC representation),表示远程过程调用和应答的协定;

4. SOAP绑定(binding),定义 了SOAP 和 HTTP 之间的绑定。

SOAP简单的理解,就是这样的一个开放协议SOAP=RPC+HTTP+XML:采用HTTP作为底层通讯协议;RPC作为一致性的调用途径,XML作为数据传送的格式,允许服务提供者和服务客户经过防火墙在Internet进行通讯交互。

XML是一种编码数据的标准方法。SOAP基于XML定义了一种消息格式以便交换方法、请求和响应,并最终完成WEB服务的调用,而服务描述 (WSDL)则是用于描述如何使用SOAP来调用WEB服务的。

WSDL(Web Services Describtion Language)是用来描述网络服务或终端服务的一种XML语言,它用于定义WebService以及如何调用它们(描述Web服务的属性,例如它做什么?它位于何处?如何调用它?等等)。它包含对一组操作和消息的抽象定义,绑定到这些操作和消息的一个具体协议和这个绑定的一个具体服务访问规范。

以上三种描述了WEB服务的抽象定义(抽象定义层),这三部分与具体WEB服务部署细节无关,是可复用的描述。(即这三部分可以说是WEB服务本身,与具体的语言实现,遵从的平台的细节规范,被部署到那台机器无关)

WEB 服务发现是定位或发现一个或多个说明特定的WEB 服务的文档的过程,WEB 服务的客户通过发现来知道某个Web 服务是否存在,以及从哪里获取这个WEB 服务的文档。

UDDI(Unified Discribtion Discovery Interface)是一种使贸易伙伴彼此发现对方和查询对方的规范。它是最终用户通过搜索企业列表、企业分类或者实际WEB服务的可编程描述,它使得查找产品和服务成为可能。UDDI不仅是一个简易的搜索引擎,它也包含了如何通过编程来和这些WEB服务进行交互。

UDDI程序员的API规范是一个文档,概述了公共课调用SOAP接口在UDDI站点上执行的每项操作。它由两部分组成:Inquiry API,用于查询和浏览UDDI注册表来发现最终用户查询的企业和服务:Publisher API,用于添加、更新和删除UDDI注册表中的企业和服务信息。

WS-Inspection(分布式WEB服务发现技术)

WS-Inspection 语言以及它如何为任一类型的 Web 服务描述文档提供简单的、分布式的服务发现方法。WS-Inspection 技术是现有服务发现方法(例如 UDDI)的补充,因为它定义了检查 Web 站点来获得服务描述的过程。

1. WS-Inspection 文档提供一种方法来聚集不同类型的服务描述。WS-Inspection 文档中,一个服务可以有多种对服务描述的引用。例如,可以既使用 WSDL文件,又在 UDDI 注册中心描述一个 Web 服务。对这两种服务描述的引用应该放在 WS-Inspection 文档中。

2. WS-Inspection 规范的两个主要功能

(1).定义XML格式用于列举对现有服务描述的引用。

(2).定义一组约定,这样能容易定位WS-Inspection 文档。

3. WS-Inspection 文档格式

WS-Inspection 文档提供对服务描述的引用的集合。这些服务描述可以用任何服务描述格式(例如 WSDL、UDDI 或者简单 HTML)定义。 WS-Inspection 文档包含对服务描述引用的列表和对其它 WS-Inspection 文档的引用。

WS-Inspection 文档将包含一个或多个 <service> 元素和 <link> 元素。一个 <service> 元素将包含一个或多个不同类型的对相同 Web 服务的服务描述的引用。<link> 元素可包含唯一一类对服务描述的引用,但是这些服务描述不必引用相同的Web服务。

4. 查找 WS-Inspection 文档

WS-Inspection 规范提供的第二个主要功能是如何定义一个可以访问 WS-Inspection 文档的位置。创建了两个约定使 WS-Inspection 文档的位置和检索相对容易。

9.3 建立以C/S方式的客户端Windows窗体程序

【案例9-3】C/S方式的客户端Windows窗体调用WebService服务。

通常WebService服务程序是一个需要IIS支持的应用程序,而WebService客户端程序可以有多种形式,调用WebService服务程序的客户端程序既可以是"ASP.NET Web"应用程序(案例9-2),也可以是Windows窗体应用程序,以及其他形式的应用程序。这些调用WebService服务的客户端程序在调用WebService服务程序中的Web服务时的基本原则是一样的,只是在客户端的外观表现不同而已。

该案例是设计一个以C/S方式的客户端Windows窗体,通过客户端Windows窗体调用WebService服务程序的编程技术。该案例最终的效果图如图9-20所示,当在图9-20的Windows窗体中的第一个文本框输入0~9的任一数字,单击"将数字字符转化为英文单词"命令按钮时;调用案例9-1的WebService服务函数,然后在第二个文本框中显示调用WebService服务函数的返回值,该返回值是相应第一个文本框中输入数字字符对应的英文单词。

图9-20客户端Windows窗体调用WebService服务程序的效果图

[技能目标]

通过客户端Windows窗体调用WebService服务程序的编程技术,并体会它与以B/S方式的Browse客户端浏览器窗体调用WebService服务程序的差异。

[操作要点与步骤]

1. 启动VB.NET,新建一个 "Windows应用程序",在"位置"文本框中输入"d:/vb.net",在项目名称栏填上"Window_Client",如图9-21所示。单击"确定"按钮,系统将自动创建一个Windows应用程序。

图9-21创建一个Windows应用程序

2. 在图9-21单击"确定"按钮后,在出现的窗体上添加两个文本框Windows控件TextBox,两个标签Windows控件Label及一个命令按钮Windows控件Button,按表9-2设置以上Windows控件的属性后的界面如图9-22所示。

表9-2 Windows控件的属性

控件名 属性名 设置值

Label1 Name Label1

Text 输入0~9的数字

Label2 Name Label2

Text 对应的数字的英文单词

TextBox1 Name Txt_num

TextBox2 Name Txt_word

Readonly True

Button Name Translate

Text 数字转换为英文单词

图9-22添加Windows控件并设置属性后界面

3. 为图9-22 Windows窗体中的命令按钮Windows控件Button编写Click事件代码如下:

Public Class Form1

Inherits System.Windows.Forms.Form

#Region " Windows 窗体设计器生成的代码 "

'Windows 窗体设计器自动生成的代码略

#End Region

Private Sub btnInterpret_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _

Handles btnInterpret.Click

Dim translate_num As New localhost.Service1

Dim english_word As String

english_word = translate_num.translate(Txt_num.Text.Trim())

If (Trim(Txt_num.Text) = "") Then

Txt_word.Text = "对不起!输入数字可能不在0~9之间,不能转换"

Else

Txt_word.Text = english_word

End If

End Sub

End Class

4. 在为图9-22 Windows窗体中的命令按钮Windows控件Button编写Click事件代码后,按案例9-2中第4、5、6、7的步骤"添加Web引用","添加Web引用"后的效果图如图9-23所示。Web引用名为:Localhost,该Web引用名Localhost可以根据需要进行修改,在第3步的程序代码中用到了此名称,它实际上就是代理类。此时用户可以清楚地看到在"解决方案资源管理器"的引用项下面多了一个"Web References"引用项,在该引用项下面是Web引用名为:Localhost,如图9-23所示。

5. 项目的保存与运行

代码输入并"添加Web引用"完成后,先将项目保存,然后按F5键或单击工具栏上的运行按钮运行该项目,项目运行后,在第一文本框中输入7,单击命令按钮,调用WebService服务程序,则在第二个文本框会出现"seven",效果图如图9-20所示。

练习园地9

一、 基础题

1. 简单描述WebService服务。

2. WebService服务采用的协议有哪些?并说出WebService服务的过程。

3. ASP.NET与ASP是向下兼容的吗?为什么?

4. VB.NET在创建Web服务的同时创建一个什么文件?

5. 在IE浏览器中运行什么类型的文件可以运行客户端程序?服务端呢?

6. 请简要说出与WEB服务相关的技术名词的含义。

表示数据 (XML)、交换消息 (SOAP)、服务描述 (WSDL)、服务发现与发布 (UDDI和WS-Inspection)

7. 请分别写出运行案例9-2,在WEB窗体的第一个文本框中分别输入0、1、2、3、4、5、6、7、8、9、A、#、%和空(什么都不输)时,单击命令按钮后,在第二个文本框中分别显示什么信息?为什么?

二、 实战题

1. 完成本单元案例9-1、案例9-2、案例9-3。

2. 编写一个WebService服务,它能提供计算器的功能。分别使用WEB窗体和WINDOWS窗体调用该WebService服务。

3. 如何能在同一客户端应用程序中利用两个具有相同名称的远程WEB服务?

三、挑战题

案例9-1所创建Web服务站点在D:/Inetpub/wwwroot/TranslateWebService目录下,请问Web服务站点可以不建在D:/Inetpub/wwwroot/目录下吗?而将这个Web服务站点建在D:/aaa目录下,请问如何实现?

提示:

1.首先在D盘上建立文件夹AAA。

2.启动Windows系统IIS服务管理器,在"默认WEB"下新建一个TEST虚拟站点或虚拟目录指向D盘上新建立文件夹AAA,如图9-24所示。

图9-24新建一个虚拟站点或虚拟目录指向D盘上新建立文件夹AAA

3. 新建的TEST虚拟站点或虚拟目录的属性如图9-25所示。

图9-25 TEST虚拟站点或虚拟目录的属性

4. 再次启动Windows系统IIS服务管理器,可以看到刚建立的TEST虚拟站点或虚拟目录,如图9-26所示。

图9-26 刚建立的TEST虚拟站点或虚拟目录

5.请参考案例9-1在"新建项目"对话框中的输入,输入本挑战题应该输入的信息。单击"确定"按钮,系统将自动创建一个WebService服务的站点所需的所有东西,如图9-27和图9-28所示。

图9-29 D::/AAA目录下的信息

图9-30 TEST站点信息

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")