VS.NET中Web Services入门

2023-05-16

 
Visual Studio .NET 中的 XML Web services 入门
摘要:Microsoft® Visual Studio® .NET 和 XML Web services 提供了一个简单、灵活且基于标准的模型,开发人员无论使用何种平台、编程语言或对象模型均可以编写组合应用程序。本文将帮助您快速学习使用 Visual Studio .NET 创建并访问 XML Web services。本文包含一些指向英文站点的链接。

目录
简介
用托管代码编写的 XML Web services
使用 Visual Studio 创建 XML Web services
使用 Visual Studio 部署 XML Web services
使用 Visual Studio 访问 XML Web services
总结
简介
XML Web services 是可以由潜在的异类系统通过 Internet 访问的可编程单元。XML Web services 在很大程度上依赖于已经被广泛接受的支持互操作的 XML、HTTP 和其他 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
ASP.NET 页框架同时也作为采用托管代码的 XML Web services 的框架。因此,XML Web services 可以访问 .NET 框架的许多功能,如身份验证、缓存和状态管理。这样一来,开发人员便可以专注于创建或访问 XML Web services,而无需编写基础结构代码。

在 ASP.NET 应用程序模型中,Web 页专供使用 .aspx 扩展名的浏览器使用。为了使 XML Web services 和常规 ASP.NET 页区分开来,XML Web services 使用 .asmx 扩展名。

XML Web services 由 XML Web services 入口点和实现 XML Web services 功能的代码组成。在 ASP.NET 中,.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,需要访问为开发 ASP.NET 应用程序(该应用程序将在 Web 项目的环境中创建)而配置的 Web 服务器。Web 项目的种类很多,当您要在 Visual Studio .NET 中使用采用托管代码的 XML Web services 时,可以使用 ASP.NET Web Service 项目模板。在 Visual Studio 中创建 XML Web services 项目后,就会看到 Component Designer(组件设计器)。组件设计器是 XML Web services 的设计界面。可以使用 Design(设计)视图向 XML Web services 添加组件,并使用 Code(代码)视图查看或编辑与 XML Web services 关联的代码。

在 Visual Studio 中创建 ASP.NET Web Service 项目后,它将在 Web 服务器上构造一个 Web 应用程序项目结构,同时在您的本地计算机上构造一个 Visual Studio 解决方案文件。解决方案文件 (.sln) 包含配置和生成设置,并且保存着一系列与项目关联的文件。此外,Visual Studio 将自动创建支持 XML Web services 所必需的文件和引用。完成后,Visual Studio 集成开发环境 (IDE) 将在 Design(设计)视图中显示 .asmx 文件。

默认情况下,当您使用 ASP.NET Web Service 项目模板创建 XML Web services 时,Visual Studio 将使用“支持代码文件”(如 Service1.asmx.vb 或 Service1.asmx.cs)。支持代码文件包含实现 XML Web services 功能的代码。默认情况下,Solution Explorer(解决方案资源管理器)会隐藏支持代码文件。当查看 .asmx 文件的 Code(代码)视图时,实际上您是在查看支持代码文件的内容。.asmx 文件本身包含处理指令 WebService,它指示在何处可以找到 XML Web services 的实现方案。生成采用托管代码的 XML Web services 后,ASP.NET 将自动提供基础结构并处理 XML Web services 的请求和响应,包括分析和创建简单对象访问协议 (SOAP) 消息。编译的输出是一个 .dll 文件,该文件位于项目的 bin 文件夹中。

有关详细信息,请参阅 Creating XML Web services in Managed Code。

WebService 处理指令
WebService 处理指令为 ASP.NET 环境提供了必要的信息,如实现 XML Web services 功能的类。以下是 .asmx 文件中 WebService 处理指令的示例:

' Visual Basic
<%@ WebService Language="vb" Codebehind="Service1.asmx.vb"
    Class="WebService1.Service1" %>

// C#
<%@ WebService Language="c#" Codebehind="Service1.asmx.cs"
    Class="WebService1.Service1" %>
注意:要在 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。

System.Web.Services.WebService 类
System.Web.Services.WebService 类定义了 XML Web services 的可选基类,并提供了直接访问常见 ASP.NET 对象(如应用程序和会话状态的对象)的权限。默认情况下,使用 Visual Studio 以托管代码的形式创建的 XML Web services 继承此类。XML Web services 可以继承此类以获得访问 ASP.NET 固有对象(如 Request 和 Session)的权限。

如果 XML Web services 没有继承此类,也可以从 System.Web.HttpContext.Current 访问 ASP.NET 固有对象。实现 XML Web services 的类必须是公共的,并且必须有一个公共的默认构造函数(不带参数的构造函数)。这样,ASP.NET 就能够创建 XML Web services 类的实例以处理传入的 XML Web services 请求。

有关详细信息,请参阅 Inheriting from the WebService Class。

WebService 属性
每个 XML Web services 都需要唯一的命名空间,它可使客户端应用程序区分出可能使用相同方法名称的 XML Web services。在 Visual Studio .NET 中创建的 XML Web services 的默认命名空间是“http://tempuri.org/”。尽管命名空间类似于典型的 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 元素的默认命名空间。如果不指定命名空间,就使用默认命名空间 http://tempuri.org/。
以下示例代码说明了 WebService 属性的用法:

' Visual Basic
<WebService(Namespace:="http://MyServer/MyWebServices/", _
   Description:="此处可以放一些描述性文字。",
   Name:="MyFavoritesService")> _
Public Class Service1
    Inherits System.Web.Services.WebService
    ' 实现代码。
End Class

// C#
[WebService(Namespace="http://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 行为的几个属性。例如,可以使用此属性在相关服务帮助页提供一个简短说明。

WebMethod 属性提供以下属性:

BufferResponse - 当设置为 True(默认设置)时,ASP.NET 将响应向下发送到客户端之前先缓存整个响应。缓存是一种非常有效的方法,可以通过减少辅助进程和 Internet 信息服务 (IIS) 进程之间的通信来提高性能。当设置为 False 时,ASP.NET 会将响应缓存在 16 KB 的区块中。通常,只有在不想一次将响应的全部内容都缓存在内存中时,才将此属性设置为 False。例如,正在写回一个将项流出数据库的集合。除非另行指定,否则默认值为 True。
CacheDuration - 此属性的值指定 ASP.NET 缓存每个唯一参数设置结果所需的秒数。除非另行指定,否则默认值为 0,此设置将禁用结果缓存。
Description - 此属性的值提供了对 XML Web services 方法的说明,显示于服务帮助页中。除非另行指定,否则默认值为空字符串。
EnableSession - 当设置为 False(默认设置)时,ASP.NET 将无法访问 XML Web services 方法的会话状态。当设置为 True 时,XML Web services 可以直接从 HttpContext.Current.Session 访问会话状态集合;在继承了 WebService 基类的情况下,也可以使用 WebService.Session 属性进行访问。
MessageName - 此属性的值使 XML Web services 能够使用别名来唯一标识重载的方法。除非另行指定,否则默认值为方法名。当为 MessageName 指定值后,结果 SOAP 消息会反映出此名称而不是实际的方法名。
TransactionOption - 此属性的值指定 XML Web services 方法是否可以作为事务的根对象。虽然可以将 TransactionOption 属性设置为 TransactionOption 枚举类型的任意值,但是 XML Web services 方法仅有两种可能行为:它不参与事务(Disabled、NotSupported 和 Supported),或是创建新事务(Required 和 RequiresNew)。除非另行指定,否则默认值为 TransactionOption.Disabled。要使用此属性,需要向 System.EnterpriseServices.dll 添加一个引用。此命名空间包含的方法和属性,提供了可在 COM+ 服务中找到的分布式事务模型。System.EnterpriseServices.ContextUtil 类允许您使用 SetAbort 或 SetComplete 方法设置该事务。
以下示例代码说明了 WebMethod 属性的用法:

' Visual Basic
Public Class Service1
    Inherits System.Web.Services.WebService
    <WebMethod(BufferResponse:=False, _
               CacheDuration:=60, _
               Description:="一些描述性的文字",
               MessageName:="RetrieveData")> _
    Public Function GetBigChunkOfData() As DataSet
        ' 实现代码
    End Function
End Class

// C#
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 文件将被加载并执行。

图 1:部署 XML Web services

要将 XML Web services 部署到非开发服务器,可以添加 Web 安装项目,也可以将所需的文件复制到目标服务器。要使您的 XML Web services 可供其他人使用,需要将其部署到可供目标客户端访问的 Web 服务器。

有关详细信息,请参阅 Deploying XML Web services in Managed Code。

服务帮助页
从 Web 浏览器调用 .asmx 文件,而不提供已识别的查询字符串时,.asmx 文件将为 XML Web services 返回一个自动生成的服务帮助页。

例如,要访问名为 Service1.asmx(本地计算机中 WebService1 项目的一部分)的 XML Web services 的服务帮助页,可使用以下 URL:

http://localhost/WebService1/Service1.asmx
此服务帮助页提供了 XML Web services 提供的以及您可以通过编程访问的方法的列表。每种方法都含有一个指向其详细信息的链接。另外,此帮助页还包括指向 XML Web services 说明文档的链接。

图 2:服务帮助页

服务帮助页的文件名在配置文件的 <wsdlHelpGenerator> XML 元素(默认设置为 DefaultWsdlHelpGenerator.aspx)中指定。默认情况下,此特定 ASP.NET Web 窗体是该计算机中所有 XML Web services 所通用的:

/%WINDOWS%
   /Microsoft.NET
      /Framework
         /[version]
            /CONFIG
               /DefaultWsdlHelpGenerator.aspx
由于服务帮助页只是一个 ASP.NET Web 窗体,因而可以对其进行替换或修改以包含其他项目(如公司徽标)。另外,也可以修改相关 Web .config 文件的 <wsdlHelpGenerator> 元素以指定自定义服务帮助页。

有关详细信息,请参阅 Configuration Options for XML Web services Created Using ASP.NET。

服务方法帮助页
服务方法帮助页提供了与特定 XML Web services 方法相关的详细信息。本页允许您调用使用 HTTP-POST 协议的方法。但是,随后却无法调用要求复杂输入参数(如 DataSet)类型的方法。另外,XML Web services 方法必须支持 HTTP-POST 协议才能启用此功能。在服务方法帮助页的底部还提供了协议(XML Web services 方法所支持的)的请求和响应消息示例。

图 3:服务方法帮助页

例如,要访问 Service1.asmx(本地计算机中 WebService1 项目的一部分)中名为 MyWebMethod 的 XML Web services 方法,可使用以下 URL:

http://localhost/WebService1/Service1.asmx?op=MyWebMethod
有关详细信息,请参阅 Exploring XML Web services Content。

Web Service 说明 (.wsdl)
服务帮助页还提供了指向 XML Web services 服务说明的链接,服务说明是 XML Web services 功能的正式定义。服务说明是使用 Web Service 说明语言 (WSDL) 语法的文档。服务说明定义了与 XML Web services 交换信息时,客户端需要遵循的消息格式合约。

Web Service 说明示例

<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:s0="http://Walkthrough/XmlWebServices/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
targetNamespace="http://Walkthrough/XmlWebServices/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
  <types>
    <s:schema elementFormDefault="qualified"
targetNamespace="http://Walkthrough/XmlWebServices/">
      <s:element name="ConvertTemperature">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="dFahrenheit"
type="s:double" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="ConvertTemperatureResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1"
name="ConvertTemperatureResult" type="s:double" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="double" type="s:double" />
    </s:schema>
  </types>
  <message name="ConvertTemperatureSoapIn">
    <part name="parameters" element="s0:ConvertTemperature" />
  </message>
  <message name="ConvertTemperatureSoapOut">
    <part name="parameters" element="s0:ConvertTemperatureResponse" />
  </message>
  <message name="ConvertTemperatureHttpGetIn">
    <part name="dFahrenheit" type="s:string" />
  </message>
  <message name="ConvertTemperatureHttpGetOut">
    <part name="Body" element="s0:double" />
  </message>
  <message name="ConvertTemperatureHttpPostIn">
    <part name="dFahrenheit" type="s:string" />
  </message>
  <message name="ConvertTemperatureHttpPostOut">
    <part name="Body" element="s0:double" />
  </message>
  <portType name="Service1Soap">
    <operation name="ConvertTemperature">
      <documentation>此方法可以将华氏温度转换为摄氏温度。</documentation>
      <input message="s0:ConvertTemperatureSoapIn" />
      <output message="s0:ConvertTemperatureSoapOut" />
    </operation>
  </portType>
  <portType name="Service1HttpGet">
    <operation name="ConvertTemperature">
      <documentation>此方法可以将华氏温度转换为摄氏温度。</documentation>
      <input message="s0:ConvertTemperatureHttpGetIn" />
      <output message="s0:ConvertTemperatureHttpGetOut" />
    </operation>
  </portType>
  <portType name="Service1HttpPost">
    <operation name="ConvertTemperature">
      <documentation>此方法可以将华氏温度转换为摄氏温度。</documentation>
      <input message="s0:ConvertTemperatureHttpPostIn" />
      <output message="s0:ConvertTemperatureHttpPostOut" />
    </operation>
  </portType>
  <binding name="Service1Soap" type="s0:Service1Soap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
    <operation name="ConvertTemperature">
      <soap:operation
soapAction="http://Walkthrough/XmlWebServices/ConvertTemperature"
style="document" />
      <input>
        <soap:body use="literal" />
      </input>
      <output>
        <soap:body use="literal" />
      </output>
    </operation>
  </binding>
  <binding name="Service1HttpGet" type="s0:Service1HttpGet">
    <http:binding verb="GET" />
    <operation name="ConvertTemperature">
      <http:operation location="/ConvertTemperature" />
      <input>
        <http:urlEncoded />
      </input>
      <output>
        <mime:mimeXml part="Body" />
      </output>
    </operation>
  </binding>
  <binding name="Service1HttpPost" type="s0:Service1HttpPost">
    <http:binding verb="POST" />
    <operation name="ConvertTemperature">
      <http:operation location="/ConvertTemperature" />
      <input>
        <mime:content type="application/x-www-form-urlencoded" />
      </input>
      <output>
        <mime:mimeXml part="Body" />
      </output>
    </operation>
  </binding>
  <service name="Service1">
    <documentation>一种温度转换服务。</documentation>
    <port name="Service1Soap" binding="s0:Service1Soap">
      <soap:address
location="http://localhost/TempConvert2/Service1.asmx" />
    </port>
    <port name="Service1HttpGet" binding="s0:Service1HttpGet">
      <http:address
location="http://localhost/TempConvert2/Service1.asmx" />
    </port>
    <port name="Service1HttpPost" binding="s0:Service1HttpPost">
      <http:address
location="http://localhost/TempConvert2/Service1.asmx" />
    </port>
  </service>
</definitions>
要访问名为 Service1.asmx(本地计算机上 TempConvert2 项目的一部分)的 XML Web services 的服务说明(如上例所示),可使用以下 URL:

http://localhost/TempConvert2/Service1.asmx?WSDL
有关详细信息,请参阅 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:

http://localhost/WebService1/Service1.asmx?DISCO
以下示例显示了发现文档的结构:

<?xml version="1.0" ?>
<disco:discovery  xmlns:disco="http://schemas.xmlsoap.org/disco"
xmlns:wsdl="http://schemas.xmlsoap.org/disco/wsdl">
      <wsdl:contractRef ref="http://MyWebServer/UserName.asmx?WSDL"/>
</disco:discovery>
注意:发现文档是一个元素容器,通常包含提供 XML Web services 发现信息的资源链接 (URL)。如果 URL 是相对的,则假定它们是相对于发现文档的位置。
有关详细信息,请参阅 Fine-Tuning Discovery Mechanisms。

动态发现 (.vsdisco)
动态发现是 ASP.NET 通过开发 Web 服务器上的文件夹层次结构执行迭代搜索以查找可用的 XML Web services 的过程。动态发现 (.vsdisco) 文件是基于 XML 的文件,可以包含零或多个 <exclude> 节点。每个 <exclude> 节点包含一个“path”属性,path 属性包含指向子文件夹(动态发现进程不应搜索的子文件夹)的相对路径。以下是 .vsdisco 示例文件:

<?xml version="1.0" encoding="utf-8" ?>
<dynamicDiscovery xmlns="urn:schemas-dynamicdiscovery:disco.2000-03-17">
     <exclude path="_vti_cnf" />
     <exclude path="_vti_pvt" />
     <exclude path="_vti_log" />
     <exclude path="_vti_script" />
     <exclude path="_vti_txt" />
     <exclude path="Web References" />
</dynamicDiscovery>
当从启用了动态发现的 Web 服务器请求 .vsdisco 文件时,对于已通过动态发现进程进行定位的每个 Web Service,都会返回一个包含 Web Service 发现信息的发现文档。

默认情况下,web.config 中禁用了动态发现。要积极控制哪些 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)。

如果将 URL Behavior 属性设置保留为默认值 Static,则当创建类实例时,会使用硬编码的 URL 来设置该代理类的 URL 属性。

如果将 Web 引用的 URL Behavior 属性设置为 Dynamic,则应用程序在运行时将从您的应用程序配置文件的 <appSettings> 部分获得 URL,例如:

<appSettings>
   <add key="myApplication.myServer.Service1"
        value="http://myServer/myXmlWebService/Service1.asmx"/>
</appSettings>
当您创建代理对象的实例时,您也可以通过编程来为应用程序的对象设置 URL 属性。不管代理使用何种 URL,它必须是符合 WSDL 的 XML Web services;当添加 Web 引用时,应与已使用的 XML Web services 相匹配。否则,早期生成的代理类将不能与之交互。

添加 Web 引用时,您也可以使用 Visual Studio 所使用的同一工具(XML Web services 说明语言工具)生成代理类来创建代理类。当您不能从安装 Visual Studio 的计算机上访问 XML Web services 时,该方法是很有用的。例如,当 XML Web services 所在的网络直到运行时仍不能被客户端访问时。然后,您要手动向应用程序项目添加工具生成的文件。

有关详细信息,请参阅 Managing Project Web References。

使用代理类
生成的代理类有自己的命名空间,在创建代理类实例前,您必须向客户端应用程序添加命名空间。对于其他类来说,在调用方法之前,您必须首先创建它的实例。此过程与创建其他类实例没有区别。

当使用 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 能够正确地包含在后续请求中。
Credentials - 当使用 Credentials 属性时,XML Web services 客户端必须实例化实现 ICredentials 的类(如 NetworkCredential),然后设置专用于验证机制的客户凭证。NetworkCredential 类可以用来设置使用基本、摘要式、NTLM 和 Kerberos 身份验证机制的验证凭证。
PreAuthenticate - 当 PreAuthenticate 为 True 时,如果验证机制支持该设置,WWW 验证标题将随第一个请求发送。当 PreAuthenticate 为 False(默认值)时,无需先进行用户身份验证,就可以向 XML Web services 方法发送请求。如果知道 Web Service 需要验证,就可以通过将属性设置为 True 来节省一次往返操作。
Proxy - 如果客户端需要使用不同于在系统设置中所发现的代理设置,需要使用此属性。可以使用 WebProxy 类来设置代理设置,因为它可以实现 IWebProxy。否则,默认代理设置可能将在配置文件中进行设置。
Timeout - 超时(毫秒)用于同步调用 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 所必需的。

' Visual Basic
Imports System
Module Module1
    Sub Main()
        Dim cService As New Converter.Service1()
        Dim dFahrenheit As Double
        Dim dCelsius As Double
        Console.Write("华氏度:")
        dFahrenheit = Convert.ToDouble(Console.ReadLine())
        dCelsius = cService.ConvertTemperature(dFahrenheit)
        Console.Write("摄氏度:")
        Console.WriteLine(dCelsius.ToString())
    End Sub
End Module

// C#
using System;
namespace Application1
{
   class Class1
   {
      static void Main()
      {
         Converter.Service1 cService = new Converter.Service1();
         Console.WriteLine("华氏度:");
         double dFahrenheit = Convert.ToDouble(Console.ReadLine());
         double dCelsius = cService.ConvertTemperature(dFahrenheit);
         Console.Write("摄氏度:");
         Console.WriteLine(dCelsius.ToString());
      }
   }
}
总结
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 比较简单。代理类代码将方法调用转换为请求消息,并将响应信息返回给方法的返回值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS.NET中Web Services入门 的相关文章

  • 如何 XML 序列化 DateTimeOffset 属性?

    The DateTimeOffset当数据表示为 Xml 时 我在此类中拥有的属性不会呈现 我需要做什么来告诉 Xml 序列化将其正确呈现为DateTime or DateTimeOffset XmlRoot playersConnecte
  • Lightspeed 与 NHibernate

    有什么体验光速 http www mindscape co nz products LightSpeed comparison aspx Mindscape 提供的比较并没有过多说明 NHibernate Lightspeed 看起来很灵活
  • 忽略挂起的更改中的某些文件

    这是我的问题 我已经更改了解决方案中的某些文件 假设是 Web config 并且永远不想签入 因为这些更改仅涉及我的计算机 有没有办法在 TFS 中忽略某个文件中的更改并将其从挂起的更改窗口中删除 当然 我可以在每次签入时跳过这个文件 但
  • C# 转换为小数

    如果有的话 有什么区别 decimal d decimal myDouble decimal d new decimal myDouble decimal d Convert ToDecimal myDouble 没有区别 如果你看一下源码
  • Api 控制器中长时间运行的任务(使用 Web API,自托管 OWIN)

    我想在自托管 OWIN 环境中的 ApiController 中运行长时间运行的任务 例如 4 5 分钟 但是 我想在开始该任务后 一旦开始长时间运行的任务 就发回响应 而不等待它完成 这个长时间运行的任务与 HTTP 无关 并且顺序运行一
  • C# 数据表来保存表格(无限嵌套)

    我相对较新C 但来自C C 背景 我需要一个类似于的数据类型 类 DataTable 但允许存储的列保存 简单 类型 int float boolean string 以及相同类型的数据 以便一个列可以保存另一个表 该表也具有存储表等的列
  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 在 .Net 中保持 Powershell 运行空间打开

    我正在尝试从 VB Net 中运行一些 PowerShell 代码 如果您知道的话 C 编码器也可能会有所帮助 代码的第一部分 我需要使用密码连接到 na 控制器 并且需要保持连接打开 我还有其他命令需要通过单击按钮来运行 获取文件 显示文
  • 使用Azure Service Fabric的默认客户端时如何向请求添加消息头?

    我想知道是否可以将自定义消息头注入到传出请求中以携带附加信息 而无需反序列化有效负载来完成身份验证 验证或请求关联等功能 例如通过消息检查器提供的 wcf Update 使用 SDK v2 您现在可以 相对 轻松地修改 Reliable S
  • 如何从 ReadOnlySpan 复制到 Array

    我的班级有一个财产public byte Location get new byte 30 我希望能够从 a 中填充它ReadOnlySpan
  • 是否可以调整AppFabric缓存服务器来存储更大的对象?

    当我假设将较大的对象图添加到缓存中时 我收到 AppFabric 缓存服务器错误 错误代码 子状态 连接已终止 可能是由于服务器或网络问题或序列化对象大小大于服务器上的 MaxBufferSize 请求的结果未知 我确信这不是网络问题 我能
  • 使 .net web api 队列请求以“单线程”方式运行

    我们有一个 c net Web API 服务调用代码 该代码无法一次处理多个数据库请求 该系统适用于需求相对较小的账单在线支付 我们无法控制代码来进行可以解决问题的更改 另一个使用相同代码的小组使用 WCF API 和服务配置将并发请求限制
  • 模拟 WCF 客户端代理的最佳方法

    有没有办法使用 Rhino 模拟框架来模拟 WCF 客户端代理 以便我可以访问 Channel 属性 我正在尝试对 Proxy Close 方法进行单元测试 但由于代理是使用抽象基类构造的ClientBase
  • Quartz 与“反应式扩展”

    我正在寻找 C 的调度库 很长一段时间以来 我认为 唯一 的选择是 Quartz NET 它非常强大并且工作得很好 但是当我发现 Reactive Extensions RX http msdn microsoft com en us da
  • 检查 DBNull 会引发 StrongTypingException

    我正在使用数据集从数据库中提取数据 一行中的一个字段是NULL 我知道这个 但是 以下 vb net 代码会抛出StrongTypingException 在数据集设计器中自动生成的 get SomeField 方法中 If Not IsD
  • 如何转义 HTML 字符?在.NET中-->“

    如何在 NET 中转义 HTML 字符 我正在从 json 字符串中获取 html 并在标题中得到 amp quot more text 看起来我需要做两次才能得到 amp quot 成为 quot 那么它就是一个 如何转义 NET 中的所
  • 使用 NServiceBus FileShareDataBus 时清理文件

    我在 NServiceBus 3 中使用 FileShareDataBus 是否支持清理数据总线文件 如果不是 实现此目的的最佳实践是什么 例如如何确保该文件不是错误队列中消息的一部分 鉴于不可能知道消息在错误队列中停留多长时间 我通常会在
  • 什么可以解释托管堆上超过 5,000,000 个 System.WeakReference 实例?

    我一直在针对生产 ASP NET Web 应用程序运行负载测试 并且看到在堆上创建了大量 System WeakReference 在大约 15 分钟内 负载管理堆内存已飙升至大约 3GB 并且我有大约 5 000 000 个对 Syste

随机推荐

  • 用pip命令把python包安装到指定目录

    pip3 install bs4 target 61 D Python37 Lib site packages pip2或者pip3 包管理系统 install 安装 bs4 xff1a 要安装Python的包 指定安装目录 xff1a t
  • VScode配置C++以及一些问题解决方案

    如果有CLion的 xff0c 那就用CLion吧 xff0c 我个人觉得CLion是一个非常好的IDE Vscode配置C 43 43 VScode配置C 43 43 的详细过程 xff0c 请看官网 xff1a Get Started
  • BlockCode 少儿编程 1《拔萝卜》

    1题目 34 拔萝卜 34 34 拔萝卜 xff0c 拔萝卜 xff0c 嗨呦拔萝卜 老太婆 xff0c 小姑娘 xff0c 小黄狗 xff0c 小花猫快来一起拔萝卜 34 34 老太婆 xff0c 小姑娘 xff0c 小黄狗 xff0c
  • Wifiphisher —— 非常非常非常流氓的 WIFI 网络钓鱼框架

    编者注 xff1a 这是一个非常流氓的 WIFI 网络钓鱼工具 xff0c 甚至可能是非法的工具 xff08 取决于你的使用场景 xff09 在没有事先获得许可的情况下使用 Wifiphisher 攻击基础网络设施将被视为非法活动 使用时请
  • BlockCode 少儿编程 2 《做早操》

    1 题目 34 做早操 34 34 小朋友们排成一队做早操 xff0c 小明前面有4个小朋友 xff0c 后面有3个小朋友 34 34 4个同学 xff0c 3个同学 34 34 这队一共多少个小朋友 xff1f 34 2 编程知识 CPU
  • BlockCode 少儿编程 10 《分铅笔》

    1 题目 34 分铅笔 34 34 妈妈给姐姐买了8支铅笔 xff0c 给弟弟买了4支铅笔 xff0c 姐姐分给弟弟 xff0c 使得姐弟俩两人的铅笔一样多 34 34 8支 xff0c 4支 34 34 姐姐最后有几只铅笔 xff1f 3
  • USB3.0扩展坞集线器Hub引起鼠标卡顿飘解决方法

    大部分USB3 0扩展坞集线器Hub会引起鼠标卡顿飘 xff0c 尤其是无线鼠标 蓝牙鼠标 xff0c 无线键盘也会出现输入迟缓的问题 mac 和 Windows都是这样 解决方法 xff1a 1 xff09 usb3 0集线器插入2 0接
  • 禁止鼠标唤醒睡眠的电脑,无线鼠标、蓝牙鼠标

    经常一不小心碰到鼠标就会唤醒睡眠的电脑 xff0c 有时咳嗽声大一点也能唤醒 解决方法 xff1a xff08 1 xff09 打开 设备管理器 在 此电脑 上右键 xff0c 属性 左侧找到设备管理器 或者 xff0c 在开始按钮上右键
  • C#与C++ dll 之间传递字符串string wchar_t* char* IntPtr

    1 由C 向C 43 43 dll 传入字符串时 xff0c 参数直接用string xff0c 设置编码格式 CharSet Unicode CharSet Ansi C 43 43 dll接收使用wchar t 或 char 2 由C
  • SwiftUI 导航 NavigationStack NavigationLink navigationDestination

    导航的显示区域使用NavigationStack 导航的新视图会显示在NavagationStack中 左右分栏导航使用NavigationSplitView 触发导航的按钮使用NavigationLink 示例1 显示颜色视图 struc
  • SwiftUI 数组初始化 append 不工作 无效 init中 State Array

    State的数组在初始化函数init是不能添加数据的 xff0c append在init中无效 xff0c 不能添加数据 实现方法如下 xff1a 采用视图控件的回调函数 appear if myArray count 61 61 0 my
  • SwiftUI List 中 多个 按钮 button 同时触发 buttonStyle

    在list中的一个单元格中设置多个按钮会出现同时触发的问题 xff0c 解决方法是增设按钮的类型属性 buttonStyle borderless 在List的单元格中 xff0c 按钮的下面 buttonStyle borderless
  • 隐私策略

    隐私权声明 软件注重对您的个人隐私的保护 我们不会在任何情况下收集您的信息 本隐私权声明适用于本软件的所有相关服务 您个人信息的搜集 本软件不收集任何您的个人信息 控制您的个人信息 本软件不控制您的任何个人信息 您个人信息的安全 严格保护您
  • MMPlayer同步文件到手机应用中的方法

    自己准备好要同步的文件 xff0c 如mp3 mp4 xff0c 然后按照如下操作 xff1a xff08 1 xff09 mac电脑插上iPhone xff08 2 xff09 打开访达Finder xff08 3 xff09 在左上列表
  • 全世界到底有多少软件开发人员?

    埃文斯数据公司 Evans Data Corporation 2019 最新的统计数据 xff08 原文 xff09 显示 xff0c 2018 年全球共有 2300 万软件开发人员 xff0c 预计到 2019 年底这个数字将达到 264
  • 并查集【通俗易懂】【知识点】

    为了解释并查集的原理 xff0c 我将举一个有爱的例子 话说江湖上散落着各式各样的大侠 xff0c 有上千个之多 他们没有什么正当职业 xff0c 整天背着剑在外面走来走去 xff0c 碰到和自己不是一路人的 xff0c 就免不了要打一架
  • QtreeWiget各节点之间连线样式设置

    QTreeWidget树状图默认各节点直接是没有线连接的 xff0c 看着层次感不强 xff0c 用户体验不太好 xff0c 所以需要设置一下样式 方法一 xff1a 通过对qtreewidget进行qss样式设置 效果图如下 xff1a
  • gitlab安装部署及问题解决(实践篇)

    系统环境 xff1a centos7 9 gitlab版本 xff1a 11 1 4 一 GitLab简介 GitLab 是一个用于仓库管理系统的开源项目 xff0c 使用Git作为代码管理工具 xff0c 并在此基础上搭建起来的web服务
  • 详解利用nodejs对json文件进行新增数据及删除指定的数据

    细节链接 详解利用nodejs对本地json文件进行增删改查 文件 1 首先存在packagename json文件 xff0c 具体内容如下 34 label 34 34 星享优惠 34 34 value 34 34 com kyy xx
  • VS.NET中Web Services入门

    Visual Studio NET 中的 XML Web services 入门 摘要 xff1a Microsoft Visual Studio NET 和 XML Web services 提供了一个简单 灵活且基于标准的模型 xff0