XML Web services是可以由潜在的异类系统通过Internet访问的可编程单元XML Web services在很大程度上依赖于已经被广泛接受的支持互操作的XMLHTTP和其他Internet标准
XML Web services可以由单个应用程序在内部使用或通过Internet对外公开供多个应用程序使用XML Web services可通过标准接口进行访问允许异类的系统以同一种Web方式协同工作
XML Web services没有追随一般的代码可移植性功能而是提供了一个使数据和系统能够协同工作的可行的解决方案XML Web services使用基于XML的消息在多个使用不同组件模型操作系统和编程语言的系统间交换数据采用与通常在分布式应用程序中使用组件相同的方法开发人员可以创建应用程序将不同来源的XML Web services组合在一起
XML Web services的一个核心特征是在服务的实施和使用方面的高度抽象通过将基于XML的消息用作创建和访问服务的机制XML Web services客户端和XML Web services提供商除了需要了解对方的输入输出和位置以外不再需要任何其他信息
XML Web services将分布式应用程序的开发带入了新的时代使用专有结构的紧耦合系统牺牲了应用程序的互操作性XML Web services将互操作性推到了一个全新的高度作为新一代Internet的革命性进步XML Web services将成为链接所有计算设备的基础结构
有关详细信息请参阅Programming the Web with XML Web services
二用托管代码编写的XML Web services
ASPNET页框架同时也作为采用托管代码的XML Web services的框架因此XML Web services可以访问NET框架的许多功能如身份验证缓存和状态管理这样一来开发人员便可以专注于创建或访问XML Web services而无需编写基础结构代码
在ASPNET应用程序模型中Web页专供使用aspx扩展名的浏览器使用为了使XML Web services和常规ASPNET页区分开来XML Web services使用asmx扩展名
XML Web services由XML Web services入口点和实现XML Web services功能的代码组成在ASPNET中asmx文件充当XML Web services的可寻址入口点它引用预编译程序集中的代码文件的支持代码或asmx文件本身包含的代码
使用XML Web services时有两种基本的操作
创建XML Web services创建XML Web services时实际上是在创建一个将功能向XML Web services客户端公开的应用程序
访问XML Web services访问XML Web services时客户端应用程序将查找引用并使用XML Web services中包含的功能
XML Web services 可以是独立的应用程序或大型 Web 应用程序的子组件最低要求是客户端必须能够向 XML Web services 发送消息
有关详细信息请参阅 XML Web services in Managed Code
三使用 Visual Studio 创建 XML Web services
要使用 Visual Studio 创建采用托管代码的 XML Web services需要访问为开发 ASPNET 应用程序(该应用程序将在 Web 项目的环境中创建)而配置的 Web 服务器Web 项目的种类很多当您要在 Visual Studio NET 中使用采用托管代码的 XML Web services 时可以使用 ASPNET Web Service 项目模板在 Visual Studio 中创建 XML Web services 项目后就会看到 Component Designer(组件设计器)组件设计器是 XML Web services 的设计界面可以使用 Design(设计)视图向 XML Web services 添加组件并使用 Code(代码)视图查看或编辑与 XML Web services 关联的代码
在 Visual Studio 中创建 ASPNET Web Service 项目后它将在 Web 服务器上构造一个 Web 应用程序项目结构同时在您的本地计算机上构造一个 Visual Studio 解决方案文件解决方案文件 (sln) 包含配置和生成设置并且保存着一系列与项目关联的文件此外Visual Studio 将自动创建支持 XML Web services 所必需的文件和引用完成后Visual Studio 集成开发环境 (IDE) 将在 Design(设计)视图中显示 asmx 文件
默认情况下当您使用 ASPNET Web Service 项目模板创建 XML Web services 时Visual Studio 将使用支持代码文件(如 ServiceasmxVB 或 Serviceasmxcs)支持代码文件包含实现 XML Web services 功能的代码默认情况下Solution Explorer(解决方案资源管理器)会隐藏支持代码文件当查看 asmx 文件的 Code(代码)视图时实际上您是在查看支持代码文件的内容asmx 文件本身包含处理指令 WebService它指示在何处可以找到 XML Web services 的实现方案生成采用托管代码的 XML Web services 后ASPNET 将自动提供基础结构并处理 XML Web services 的请求和响应包括分析和创建简单对象访问协议 (SOAP) 消息编译的输出是一个 dll 文件该文件位于项目的 bin 文件夹中
有关详细信息请参阅 Creating XML Web services in Managed Code
WebService 处理指令
WebService 处理指令为 ASPNET 环境提供了必要的信息如实现 XML Web services 功能的类以下是 asmx 文件中 WebService 处理指令的示例
注意要在 Solution Explorer(解决方案资源管理器)中查看 asmx 文件的内容请用右键单击 asmx 文件然后单击快捷菜单中的 Open With(打开方式)
在 Open With(打开方式)对话框中选择 Source Code (Text) Editor(源代码 [文本] 编辑器)然后单击 Open(打开)
Language 属性指示开发 XML Web services 所使用的编程语言可以使用任何与 NET 兼容的语言(如 Visual Basic NET 或 Visual C#)来创建 XML Web services与 asmx 页关联的支持代码文件由 Codebehind 属性来指示Class 属性指示支持代码文件中用来实现 XML Web services 功能的类
有关详细信息请参阅 Code Model for XML Web services in Managed Code
SystemWebServicesWebService 类
SystemWebServicesWebService 类定义了 XML Web services 的可选基类并提供了直接访问常见 ASPNET 对象(如应用程序和会话状态的对象)的权限默认情况下使用 Visual Studio 以托管代码的形式创建的 XML Web services 继承此类XML Web services 可以继承此类以获得访问 ASPNET 固有对象(如 Request 和 Session)的权限
如果 XML Web services 没有继承此类也可以从 SystemWebHttpContextCurrent 访问 ASPNET 固有对象实现 XML Web services 的类必须是公共的并且必须有一个公共的默认构造函数(不带参数的构造函数)这样ASPNET 就能够创建 XML Web services 类的实例以处理传入的 XML Web services 请求
有关详细信息请参阅 Inheriting from the WebService Class
WebService 属性
每个 XML Web services 都需要唯一的命名空间它可使客户端应用程序区分出可能使用相同方法名称的 XML Web services在 Visual Studio NET 中创建的 XML Web services 的默认命名空间是尽管命名空间类似于典型的 URL但在 Web 浏览器中是不能查看的它只是一个唯一标识符
注意您可能希望在包含有关您所提供的 XML Web services 信息的位置提供一个 Web 页
WebService 属性提供以下属性
◆Description
此属性的值包含描述性消息此消息将在 XML Web services 的说明文件(例如服务说明和服务帮助页)生成后显示给 XML Web services 的潜在用户
◆Name
此属性的值包含 XML Web services 的名称默认情况下该值是实现 XML Web services 的类的名称Name 属性标识 XML Web services 的 XML 限定名称的本地部分Name 属性也用于在服务帮助页上显示 XML Web services 的名称
◆Namespace
此属性的值包含 XML Web services 的默认命名空间XML 命名空间提供了一种在 XML 文档中创建名称的方法该名称可由统一资源标识符 (URI) 标识使用 XML 命名空间可以唯一标识 XML 文档中的元素或属性因而在 XML Web services 的服务说明中Namespace 被用作与 XML Web services 直接相关的 XML 元素的默认命名空间如果不指定命名空间就使用默认命名空间
以下示例代码说明了 WebService 属性的用法
Visual Basic
Description:="此处可以放一些描述性文字。tw.WiNgWIt.Com",
Name:="MyFavoritesService")> _
Public Class Service1
Inherits System.Web.Services.WebService
' 实现代码。
End Class
// C#
[WebService(Namespace=//MyServer/MyWebServices/",
Description="此处可以放一些描述性文字。",
Name="MyFavoritesService")]
public class Service1 : System.Web.Services.WebService
{
// 实现代码。
}
有关详细信息,请参阅 Using the WebService Attribute。
WebMethod 属性
以托管代码创建 XML Web services 时,通过在 Public 方法声明之前放置 WebMethod 属性可以指定在 XML Web services 中可用的方法。Private 方法不能充当 XML Web services 的入口点,尽管它们可以采用相同的类并且 XML Web services 代码可以调用它们。WebMethod 属性必须应用到可用作 XML Web services 一部分的每种公共方法中。
WebMethod 属性包含配置 XML Web services 行为的几个属性。例如,可以使用此属性在相关服务帮助页提供一个简短说明。
public class Service1 : System.Web.Services.WebService
{
[WebMethod(BufferResponse=false,
CacheDuration=60,
Description="一些描述性的文字",
MessageName="RetrieveData")]
public DataSet GetBigChunkOfData()
{
// 实现代码
}
}
有关详细信息,请参阅 Using the WebMethod Attribute。
四、使用 Visual Studio 部署 XML Web services
当使用 Visual Studio .NET 创建采用了托管代码的 XML Web services 时,应使用标准部署模型:编译项目,然后将结果文件部署到生产服务器。项目 .dll 文件包含 XML Web services 代码类文件(.asmx.vb 或 .asmx.cs)以及项目中的所有其他类文件,但不包含 .asmx 文件本身。然后,您可以将这一个项目 .dll 文件部署到生产服务器中,而无需附带任何源代码。当 XML Web services 接收到请求时,项目 .dll 文件将被加载并执行。
服务帮助页的文件名在配置文件的 XML 元素(默认设置为 DefaultWsdlHelpGeneratoraspx)中指定默认情况下此特定 ASPNET Web 窗体是该计算机中所有 XML Web services 所通用的
\%Windows%
\MicrosoftNET
\Framework
\[version]
\CONFIG
\DefaultWsdlHelpGeneratoraspx
由于服务帮助页只是一个 ASPNET Web 窗体因而可以对其进行替换或修改以包含其他项目(如公司徽标)另外也可以修改相关 nfig 文件的 元素以指定自定义服务帮助页
有关详细信息请参阅 Configuration Options for XML Web services Created Using ASPNET
服务方法帮助页
服务方法帮助页提供了与特定 XML Web services 方法相关的详细信息本页允许您调用使用 HTTPPOST 协议的方法但是随后却无法调用要求复杂输入参数(如 DataSet)类型的方法另外XML Web services 方法必须支持 HTTPPOST 协议才能启用此功能在服务方法帮助页的底部还提供了协议(XML Web services 方法所支持的)的请求和响应消息示例
)thisstylewidth=; border= twffan=done>
图服务方法帮助页
例如要访问 Serviceasmx(本地计算机中 WebService 项目的一部分)中名为 MyWebMethod 的 XML Web services 方法可使用以下 URL
有关详细信息请参阅 Exploring XML Web services Content
Web Service 说明 (wsdl)
服务帮助页还提供了指向 XML Web services 服务说明的链接服务说明是 XML Web services 功能的正式定义服务说明是使用 Web Service 说明语言 (WSDL) 语法的文档服务说明定义了与 XML Web services 交换信息时客户端需要遵循的消息格式合约
要访问名为 Service1.asmx(本地计算机上 TempConvert2 项目的一部分)的 XML Web services 的服务说明(如上例所示),可使用以下 URL:。
有关详细信息,请参阅 Web Services Description Language (WSDL) Explained。
XML Web services 发现
XML Web services 发现是对 XML Web services 说明进行定位和询问的过程,是访问 XML Web services 的基本步骤。通过发现进程,XML Web services 客户端能够在设计阶段了解某个 XML Web services 是否存在,它的功能如何,以及如何正确与它进行交互操作。
然而,实现 XML Web services 的 Web 站点不需要支持该发现进程,而是由另一个站点负责说明服务(如 XML Web services 目录)。另外,可能没有一个公开的方法可用来查找服务,例如在创建专用服务时。
有关详细信息,请参阅 XML Web services Discovery。
静态发现 (.disco)
可以通过发布 .disco 文件(一个 XML 文档,包含指向其他发现文档、XSD 方案和服务说明的链接)来启用 XML Web services 的程序发现。使用 ASP.NET 自动创建的 XML Web services 能够提供生成的发现文档。例如,要访问名为 Service1.asmx(本地计算机中 WebService1 项目的一部分)的 XML Web services 发现文档,可使用以下 URL:
以下示例显示了发现文档的结构:
xmlns:wsdl="">
注意:发现文档是一个元素容器,通常包含提供 XML Web services 发现信息的资源链接 (URL)。如果 URL 是相对的,则假定它们是相对于发现文档的位置。
有关详细信息,请参阅 Fine-Tuning Discovery Mechanisms。
动态发现 (.vsdisco)
动态发现是 ASP.NET 通过开发 Web 服务器上的文件夹层次结构执行迭代搜索以查找可用的 XML Web services 的过程。动态发现 (.vsdisco) 文件是基于 XML 的文件,
当从启用了动态发现的 Web 服务器请求 .vsdisco 文件时,对于已通过动态发现进程进行定位的每个 Web Service,都会返回一个包含 Web Service 发现信息的发现文档。
默认情况下,nfig 中禁用了动态发现。要积极控制哪些 XML Web services 客户端可以发现服务,应该在开发 Web 服务器上只使用动态发现。当向生产 Web 服务器部署 XML Web services 时,应为那些希望客户端能够发现的 XML Web services 创建并发布一个静态发现文件 (.disco)。
有关详细信息,请参阅 Deploying XML Web services in Managed Code。
Web Service 目录
部署完 XML Web services 后,如果希望其他人使用,需要考虑如何让开发人员找到它。使 XML Web services 可以为多数人使用的一种既定方法是,将其注册到 XML Web services 目录中。通用说明、发现和集成 (UDDI) 项目提供了一份公司及其提供的服务的目录。
有关详细信息,请参阅 XML Web services Directories。
五、使用 Visual Studio 访问 XML Web services
XML Web services 客户端是指任何引用和使用 XML Web services 的组件或应用程序。它不必是基于客户端的应用程序,事实上,在大多数情况下,您的 XML Web services 客户端可能是其他 Web 应用程序(如 Web 窗体或其他 XML Web services)。当访问采用托管代码的 XML Web services 时,代理类和 .NET 框架将处理所有结构代码。
从托管代码访问 XML Web services 是一个简单的过程。首先,向希望访问的 XML Web services 项目添加一个 Web 引用。Web 引用使用作为代理的方法为每个公开的 XML Web services 方法创建代理类。其次,添加 Web 引用的命名空间。最后,创建代理类实例并像访问其他类的方法一样访问该类方法。
有关详细信息,请参阅 Accessing XML Web services in Managed Code。
查找 XML Web services 并添加 Web 引用
有时,您可能既是 XML Web services 的提供者,又是 XML Web services 的使用者。在这种情况下,您可能知道 XML Web services 的位置和功能。但在其他时候,您可能是访问由别人提供的 XML Web services。在这种情况下,您或许不知道 XML Web services 是否满足您的要求。
为了简化代码模型,用托管代码编写的应用程序使用一个 Web 引用来代表各本地 XML Web services。通过使用 Add Web Reference(添加 Web 引用)对话框向您的项目添加 Web 引用。此对话框使您可以浏览您的本地服务器、Microsoft UDDI 目录和 Internet 上的 XML Web services。
Add Web Reference(添加 Web 引用)对话框使用 XML Web services 发现进程,在从对话框中浏览的 Web 站点上,查找合适的 XML Web services。对于给定的地址,它使用为查找 XML Web services 发现 (DISCO) 文档并最终找到 XML Web 说明文档(遵守 Web Service 说明语言 [WSDL] 的语法)而设计的算法来询问 Web 站点。
当使用 Add Web Reference(添加 Web 引用)对话框查找到应用程序访问的 XML Web services 后,单击 Add Reference(添加引用)按钮告诉 Visual Studio 将服务说明的一份副本下载到本地计算机,然后生成访问所选 XML Web services 的代理类。代理类包含了一些方法,可以同步或异步调用公开的 XML Web services 方法。
有关详细信息,请参阅 Locating XML Web services。
动态和静态 URL
Web 引用可以使用静态 URL,也可以使用动态 URL。Web 引用的 Web Reference URL 属性用于指定引用的 XML Web services 的 URL。默认情况下,此属性被设置为所选 XML Web services 的 URL(是一个静态 URL)。
如果将 Web 引用的 URL Behavior 属性设置为 Dynamic,则应用程序在运行时将从您的应用程序配置文件的 部分获得 URL,例如:
value=""/>
当您创建代理对象的实例时,您也可以通过编程来为应用程序的对象设置 URL 属性。不管代理使用何种 URL,它必须是符合 WSDL 的 XML Web services;当添加 Web 引用时,应与已使用的 XML Web services 相匹配。否则,早期生成的代理类将不能与之交互。
添加 Web 引用时,您也可以使用 Visual Studio 所使用的同一工具(XML Web services 说明语言工具)生成代理类来创建代理类。当您不能从安装 Visual Studio 的计算机上访问 XML Web services 时,该方法是很有用的。例如,当 XML Web services 所在的网络直到运行时仍不能被客户端访问时。然后,您要手动向应用程序项目添加工具生成的文件。
当使用 Visual Studio 直接从 XML Web services 的服务说明中生成的代理类时,访问采用托管代码的 XML Web services 比较简单。要访问 XML Web services 方法,
您的客户端应用程序应调用相应的代理对象同步方法或异步方法。这些方法执行必要的工作,来远程调用需要的 XML Web services 方法。默认情况下,代理类使用 SOAP 来访问 XML Web services 方法,因为 SOAP 对三种支持的协议操作(HTTP-GET、HTTP-POST 和 HTTP-SOAP)支持最丰富的数据类型。
通过 Add Web Reference(添加 Web 引用)进程生成的代理类来自System.Web.Service.Protocols.SoapHttpClientProtocol 类,它包含的几个属性可用来控制该类访问 XML Web services 的行为。
除此以外,SoapHttpClientProtocol 类还提供了以下属性:
◆ClientCertificates
此属性允许客户端在调用 XML Web services 方法时传递一个或多个客户端证书(也叫做 Authenticode X.509 v.3 证书)。
◆CookieContainer
如果 XML Web services 方法使用会话状态,那么在响应标题中会向 XML Web services 客户端(用来唯一标识 XML Web services 客户端的会话)传回一个 cookie。对于收到该 cookie 的 XML Web services 客户端,必须创建一个 CookieContainer 的新实例并在调用 XML Web services 方法之前将其属性指定为 CookieContainer。这就可以确保 cookie 能够正确地包含在后续请求中。
当 PreAuthenticate 为 True 时,如果验证机制支持该设置,WWW 验证标题将随第一个请求发送。当 PreAuthenticate 为 False(默认值)时,无需先进行用户身份验证,就可以向 XML Web services 方法发送请求。如果知道 Web Service 需要验证,就可以通过将属性设置为 True 来节省一次往返操作。
超时(毫秒)用于同步调用 XML Web services。默认值是 100000 毫秒。将 Timeout 属性值设置为 Timeout.Infinite,表示请求没有超时。但是,Web 服务器仍然有可能引起请求在服务器端超时。
◆Url
此属性的默认值由生成代理类的服务说明中所发现的 location 属性确定。
有关详细信息,请参阅 SoapHttpClientProtocol Class。
调用 XML Web services 方法
向 XML Web services 添加 Web 引用后,您可以调用 XML Web services 的公开方法并像访问其他组件方法一样来访问结果。
在以下的示例代码中,客户端应用程序 (Application1) 访问一个具有 Web 引用 (Converter) 的 XML Web services,该 Web 引用包含代理类 Service1,而代理类又有一个调用 XML Web services 的方法 ConvertTemperature。代码中的粗体行是访问 XML Web services 所必需的。
XML Web services 提供了在松耦合环境中使用标准协议(HTTP、XML、SOAP 和 WSDL)交换消息的能力。消息可以是结构化的、带类型的,也可以是松散定义的。由于 XML Web services 的基础是标准协议,因此您的 XML Web services 应用程序能够与很多实现、平台和设备进行通信。
可以使用 ASP.NET 页框架创建 XML Web services,并使这些 XML Web services 能够访问 .NET 框架的许多功能。由于 ASP.NET 和 .NET 框架是采用托管代码的 XML Web services 的基础,开发人员可以专注于创建或访问 XML Web services,而不需要编写基础结构代码。
当您使用 Visual Studio 直接从 XML Web services 的服务说明中生成的代理类时,访问采用托管代码的 XML Web services 比较简单。代理类代码将方法调用转换为请求消息,并将响应信息返回给方法的返回值。