`
kb5706
  • 浏览: 41516 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

学习WebService(一)

 
阅读更多

7.1 Web Service基本概念

Web Service主要是为了使原来各孤立的站点之间能够相互通信、共享资源而提出的一种接口。 Web Service所使用的是Internet上统一、开放的标准,如HTTP、XML、SOAP、WSDL等,所以Web Service可以在任何支持这些标准的环境(Windows、Linux)中使用。其中,SOAP协议(Simple Object Access Protocal,简单对象访问协议)是一个用于分散和在分布式环境下交换网络信息的基于XML的通信协议。在此协议下,软件组件或应用程序能够通过标准的HTTP协议进行通信。它的设计目标就是简单性和扩展性,这有助于大量异构程序和平台之间的互操作性,从而使存在的应用程序能够被广泛的用户访问。Web Service是构造分布式、模块化应用程序的最新技术发展趋势。

因此,我们可以这样定义Web Service:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过 UDDI 进行注册。Web Service 体系结构的主要优点之一是,它允许在不同平台上以不同语言编写的各种程序以基于标准的方式相互通信。相对以前的方案而言,Web Service 的另一大优点是使用标准的Web协议——XML、HTTP和TCP/IP,相对易用和通用。

微软在其.NET战略中,对其主推的Web服务做了大肆的宣扬。现在,Web服务正如火如荼地发展着,相关的各项新技术层出不穷。Web服务的发展正构筑着互联网时代美好的明天。在本节中,将向大家介绍Web服务的一些基本知识,以及如何用ASP.NET来创建Web服务和调用Web服务。

7.2 Web Service的应用场景

以前,分布式的应用程序逻辑需要使用分布式的对象模型,通过使用DCOM、CORBA、RMI之类的基本结构,开发人员仍可拥有使用本地模型所提供的丰富资源和精确性,并可将服务置于远程系统中。

当已经有中意的中间件平台(RMI、Jini、CORBA、DCOM等)时,我们为什么还要为Web而烦恼呢?中间件确实提供了强大的服务实现手段,但是,这些系统有一个共同的缺陷,那就是它们无法扩展到互联网上:它们要求服务的客户端与系统提供的服务本身之间必须进行紧密耦合,即要求一个同类基本结构。然而这样的系统往往十分脆弱:如果一端的执行机制发生变化,那么另一端便会崩溃。例如,如果服务器应用程序的接口更改,那么客户端便会崩溃。为了能扩展到互联网运用,我们需要一种松散耦合的基本结构来解决这个问题。在些情况下就迎来了Web服务的诞生。Web Service技术是一种基于标准的Web协议的可编程组件,我们可以把Web Service看做Web上的组件,Web服务提供者开放一系列的API,开发人员通过调用这些API来集成Web服务,构建自己的应用程序。

1.SOAP

SOAP(Simple Object Access Protocal)是在分散或在分布式环境中交换信息的简单协议,它基于XML协议,以XML形式提供了一个简单且轻量的用于在分散或分布环境下交换结构化和类型信息的机制,其本身并没有定义任何应用程序语义,如编程模型或特定语义的实现,而是通过提供一个有标准组件的包模型和在模块中编码数据的机制定义了一个简单的表示应用程序语义的机制,使其能够用于从信息传递到RPC的各种系统。SOAP规范定义了SOAP消息的格式,以及怎样通过HTTP协议来使用SOAP。SOAP最引人注目的特征是它可以在许多不同的软件和硬件平台上实现。这意味着 SOAP 可用于连接企业内部和外部的不同系统。过去曾试过多种方法以提出一个可用于系统集成的通用通信协议,但它们都没有像SOAP一样获得广泛的认可。为什么呢?因为与许多早期的协议相比,SOAP更小巧,而且更简单和易于实现。HTTP的普及和SOAP的简单性使你几乎可以在任何环境下调用它们,因此成为XML Web Service的理想基础。

2.WSDL

你会怎样向别人介绍你的Web Service有什么功能,以及每个函数调用时的参数呢?你可能会自己写一套文档,甚至口头告诉需要使用你的Web Service的人。这些非正式的方法至少都有一个严重的问题:当程序员坐到电脑前,想要使用你的Web Service的时候,他们的工具(如Visual Studio)无法给他们提供任何帮助,因为这些工具根本就不了解你的Web Service。解决方法是使用机器能阅读的方式提供一个正式的描述文档。Web Service描述语言(WSDL)就是这样一个基于XML的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web Service生成WSDL文档,又能导入WSDL文档,生成调用相应Web Service的代码。

3.UDDI

UDDI(通用发现、说明和集成)是Web服务的黄页。是一套基于Web的、分布式地为Web Service 提供信息注册中心的实现标准,同时包含一组能使企业将自身提供的Web Service注册使得别的企业能够发现的访问协议。与传统黄页一样,你可以搜索提供所需服务的公司,阅读以了解所提供的服务,然后与某人联系以获得更多信息。

趣味理解

Web Service好比一个服务供应商,给其他厂家提供基础服务,其他厂家再将这个服务包装成自己的产品或者服务提供给别人或自己使用。有点像OEM了。既然两个公司需要合作,不可能靠一句话就可以的,就需要一些标准和规范的东西来实现。那么:

SOAP 就像两个公司之间签的合同,约束双方按一定规矩和标准办事。

WSDL 则像说明书,告诉别人你有什么,能给别人提供什么服务。

UDDI 好比你的公司需要在黄页或工商注册,企业的主营业务登记,方便别人查询。当然,你也可以不在 UDDI 中注册,就像在地下室开展业务,靠的是口头吆喝;但是如果你希望拓展市场,则需要 UDDI 以便能被客户发现,更方便地找到你。

Web Service是创建可互操作的分布式应用程序的新平台。Web Service 的主要目标是跨平台的可互操作性。为了达到这一目标,Web Service 是完全基于XML、XSD等独立于平台、独立于软件供应商的标准的。Web Service在应用程序跨平台和跨网络进行通信的时候是非常有用的。Web Service适用于应用程序集成、B2B集成、代码和数据重用,以及通过Web进行客户端和服务器的通信的场合。

当然,Web Service也不是万能的,你不能到处滥用Web Service。在有些情况下,Web Service 会降低应用程序的性能,而不会带来任何好处。例如,一台机器或一个局域网里面运行的同构应用程序就不应该用Web Service 进行通信。

到现在为止,我们已经讨论了如何与 Web Service 通信(SOAP),Web Service是怎样进行说明的(WSDL),以及如何查找 Web Service(UDDI)。这些内容构成了一套基本规范,为应用程序的集成和聚合提供了基础。根据这些基本规范,公司可以构建实际的解决方案,并从中获益。

7.3 创建简单的Web Service项目应用

在ASP.NET中创建Web Service和写一个类文件是很相似的。Web Service是一个以.asmx为扩展名的文本文件,但其中必须包含一条 @WebService指令,用做声明。我在这里向大家讲解一个查询产品价格的Web服务实例,该实例完成的功能相当简单。但是能对初学者起到很好的指导作用。(完整代码示例位置:光盘/code/ch07/WebService1)

实现步骤如下。

(1)打开VS.NET,新建一个项目,在左边的面板中选择“Visual C#”选项,在右边的面板中选择“ASP.NET Web服务应用程序”选项,将其并命名为“WebService1”,如图7-1所示。

图7-1 新建ASP.NET Web服务应用程序

(2)单击“确定”按钮后,VS.NET就为我们创建了一个Web服务项目。在新建完项目后,在开发环境中会出现如图7-2所示的代码。

图7-2 Web服务应用程序

在上面的代码编辑框中,VS已经替我们创建了一个简单的HelloWorld示例Web服务接口方法,这个方法和我们普通的方法所不同的是带有[WebMethod]属性。我们可以注释掉该方法,然后添加我们自己的业务接口代码。

(3)实现我们自己的业务代码。

注释掉系统自动创建的HelloWorld方法,创建一个查询产品价格的GetProductPrice方法。

//<summary>
//查询产品的价格
//</summary>
//<param name="ProductId">产品编号</param>
//<returns>产品价格</returns>
[WebMethod]
public string GetProductPrice(string ProductId)
{
    Products pro = new Products();
    return pro.GetPrice(ProductId);
}


这样,一个简单的Web服务就完成了,非常简单,按下“F5”键运行一下看看效果吧。如图7-3所示。

这个例子非常简单,因为仅有一个方法(GetProductPrice)。单击这个方法会显示另一个网页,如图7-4所示。这一页就是该特定方法的测试页,其中包括对应方法接受的每个参数的文本框。现在请在文本框中输入“001”并单击“调用”按钮。

图7-3 Web服务页面 图7-4 Web服务方法页面

单击“调用”按钮会打开一个新的浏览器窗口,其中显示了一些XML代码。这些XML代码是由该Web服务返回的,其中包括了服务的结果。返回的XML代码如图7-5所示。

图7-5 Web服务调用结果

返回的结果是一段XML代码,客户端应用程序可以通过对XML的处理,解析其中的数据。

7.4 Web Service属性介绍

每个 Web Service都需要唯一的命名空间,它可使客户端应用程序区分出可能使用相同方法名称的 Web Service。在 Visual Studio.NET中创建的Web Service的默认命名空间是“http://tempuri.org/”。尽管命名空间类似于典型的URL,但在Web浏览器中是不能查看的,它只是一个唯一标识符。

Web Service(Web服务)提供以下属性。

l Description:此属性的值包含描述性消息,此消息将在XML Web Service的说明文件(例如服务说明和服务帮助页)生成后显示给XML Web Service的潜在用户。

l Name:此属性的值包含XML Web Service的名称。在默认情况下,该值是实现XML Web Service的类的名称。

l Namespace:此属性的值包含 XML Web Service的默认命名空间。XML命名空间提供了一种在XML文档中创建名称的方法,该名称可由统一资源标识符(URI)标识。使用XML命名空间,可以唯一标识XML文档中的元素或属性。因而,在 XML Web Service的服务说明中,Namespace被用做与XML Web Service直接相关的 XML 元素的默认命名空间。如果不指定命名空间,则使用默认命名空间 http://tempuri.org/。

以下示例代码说明了Web Service属性的用法:

//<summary>
//Service1 的摘要说明
//</summary>
[WebService(Namespace = "http://tempuri.org/",
    Description = "接口的描述说明文字-测试。",
    Name = "LTPService")] //Web Service 的名称
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class Service1 : System.Web.Services.WebService
{
}


WebMethod(Web服务方法)有以下6个属性。

l Description:是对Web Service方法的描述信息。就像Web Service方法的功能注释,可以让调用者看见的注释。

[WebMethod(Description="根据产品编号查询产品的价格")]

public string GetProductPrice2(string ProductId)
{
    Products pro = new Products();
    return pro.GetPrice(ProductId);
}
l         EnableSession:指示Web Service是否启动Session标志,主要通过Cookie完成,默认为false。
public static int i = 0;
[WebMethod(EnableSession = true)]
public int Count()
{
    i = i + 1;
    return i;
}


在IE地址栏中输入:http://localhost/WebService1/Service1.asmx/Count?,刷新看看:

<?xml version="1.0" encoding="utf-8" ?>
  <int xmlns="http://tempuri.org/">1</int>
<?xml version="1.0" encoding="utf-8" ?>
   <int xmlns="http://tempuri.org/">2</int>


//…不停地刷新,Session的值一直存在

l MessageName:主要实现方法重载后的重命名:

public static int i = 0;
[WebMethod(EnableSession = true)]
public int Count()
{
    i = i + 1;
    return i;
}
[WebMethod(EnableSession = true, MessageName = "Count1")]
public int Count(int da)
{
    i = i + da;
    return i;
}


通过count访问的是第1个方法,而通过count1访问的是第2个方法。

l TransactionOption:指示Web Service方法的事务支持。

由于HTTP协议的无状态特性,Web Service方法只能作为根对象参与事务。如果COM对象与Web Service方法参与相同的事务,并且在组件服务管理工具中被标记为在事务内运行,则Web Service方法可以调用这些COM对象。如果一个TransactionOption属性为Required或RequiresNew的Web Service方法调用另一个TransactionOption属性为Required 或RequiresNew的Web Service方法,则每个 Web Service方法将参与它们自己的事务,因为Web Service方法只能用做事务中的根对象。如果异常是从Web服务方法引发的或未被该方法捕获,则自动放弃该事务。如果未发生异常,则自动提交该事务,除非该方法显式调用 SetAbort。

①Disabled

指示Web Service方法不在事务的范围内运行。当处理请求时,将在没有事务的情况下执行Web Service方法。

[WebMethod(TransactionOption = TransactionOption.Disabled)]

②NotSupported

指示Web Service方法不在事务的范围内运行。当处理请求时,将在没有事务的情况下执行Web Service方法。

[WebMethod(TransactionOption= TransactionOption.NotSupported)]

③Supported

如果有事务,则指示Web Service方法在事务范围内运行。如果没有事务,则将在没有事务的情况下创建Web Service。

[WebMethod(TransactionOption= TransactionOption.Supported)]

④Required

指示Web Service方法需要事务。由于Web服务方法只能作为根对象参与事务,因此将为 Web 服务方法创建一个新事务。

[WebMethod(TransactionOption= TransactionOption.Required)]

⑤RequiresNew

指示Web Service方法需要新事务。当处理请求时,将在新事务内创建Web Service。

[WebMethod(TransactionOption= TransactionOption.RequiresNew)]

这里我们来看一个例子。

首先在类代码中添加引用:using System.EnterpriseServices;,然后设置属性TransactionOption = TransactionOption.RequiresNew。

例如:

[WebMethod(TransactionOption = TransactionOption.RequiresNew)]

public int DeleteProduct(string ProductId)
{
    String deleteCmdSQL = "delete from P_Product where ProductId='" +
        ProductId + "'";
    String exceptionCmdSQL = "DELETE FROM NonExistingTable WHERE
        ProductId='" + ProductId + "'";
    SqlConnection sqlConn = new SqlConnection(
        Maticsoft.DBUtility.PubConstant.ConString);
    sqlConn.Open();
    SqlCommand deleteCmd = new SqlCommand(deleteCmdSQL, sqlConn);
    SqlCommand exceptionCmd = new SqlCommand(exceptionCmdSQL, sqlConn);
    //这个命令正确执行          
    deleteCmd.ExecuteNonQuery();
   
    //这个命令执行时会发生异常,所以,第一个命令会自动回滚。因为这个方法被设置为事务模式
    //发生异常时,ASP.NET会自动中断事务并回滚
    int cmdResult = exceptionCmd.ExecuteNonQuery();
    sqlConn.Close();
    return cmdResult;
}


在上面的示例中,如果数据库操作引发异常,则事务将自动中止;否则将提交事务。

l CacheDuration:设置响应应在缓存中保留的秒数。这样Web Service就不需要重复执行多遍,可以提高访问效率,而CacheDuration就是指定缓存时间的属性。

public static int i = 0;
[WebMethod(EnableSession = true, CacheDuration = 30)]
public int Count()
{
    i = i + 1;
    return i;
}


在IE的地址栏里输入:http://localhost/WebService1/Service1.asmx/Count?。

刷新它,内容一样!要使输出不一样,需等30秒。因为代码要在30秒后才被再次执行,之前返回的结果都是在服务器高速缓存里的内容。

有两个问题可以影响ASP.NET 2.0 Web服务应用程序中的输出缓存。

在ASP.NET 2.0中,测试页的HTTP方法已从Get更改为 Post。但是Post通常不进行缓存。如果在ASP.NET 2.0 Web 服务应用程序的测试页中改为使用Get,则缓存将正常工作。

此外,HTTP指示用户代理(浏览器或调用应用程序)应该可以通过将“Cache-Control”设置为“no-cache”以重写服务器缓存。因此,当 ASP.NET 应用程序找到“no-cache”标头时,会忽略缓存的结果。

l BufferResponse:配置Web Service方法是否等到响应被完全缓冲完才发送信息给请求端。普通应用要等完全被缓冲完才被发送。

7.5 ASP.NET如何调用Web Service

在.NET中调用Web Service其实和创建Web Service一样简单。(完整代码示例位置:光盘/code/ch07/ WebAppClient)

实现步骤如下。

(1)首先我们创建一个ASP.NET Web 应用程序。

(2)添加Web Service引用。

在项目上单击鼠标右键,在弹出的快捷菜单中选择“添加Web 引用”命令,如图7-6所示,弹出“添加Web引用”对话框,如图7-7所示的窗口。

图7-6 选择“添加Web引用”命令 图7-7 “添加Web引用”对话框

添加引用分以下3种情况。

l 如果是本解决方案中的Web服务,则选第一个,程序会自动转向解决方案中的服务地址。

l 如果是本计算机上的Web服务,则系统会自动寻找本机的Web服务,供你选择。

l 无论哪种情况,其最终目标都是在URL处输入相应的地址,进行加载,所以,我们可以在URL中输入Web服务的地址,无论是本地还是公网的都一样。然后,单击“前往”按钮,则会列出Web服务的测试页和方法描述,同时验证项目是否能够使用 Web 服务,如图7-8所示。

图7-8 预览Web 引用

这时,我们在“Web引用名”文本框中,输入一个名称,我们将在代码中使用该名称以编程方式访问所选择的Web服务,单击“添加引用”按钮。

(3)此时,项目中多了一个名叫Web References的目录,如图7-9所示,自动生成的代理类就放在这里。

图7-9 Web引用

(4)单击工程中的解决方案资源管理器中的“显示所有文件”按钮,这时就可以看到那个代理类了,名叫Reference.cs。

(5)在代码中使用这个代理类基本上和使用本地普通类一样。

ProductService.LTPService service = new ProductService.LTPService();

string price=service.GetProductPrice("001");

到此为止,ASP.NET调用Web Service的过程就完成了,整个过程只写了两行代码。

分享到:
评论

相关推荐

    学习CXF WebService入门实例一.pdf

    学习CXF WebService入门实例一.pdf学习CXF WebService入门实例一.pdf

    java注解webservice学习第一篇

    NULL 博文链接:https://lsz1023-126-com.iteye.com/blog/2048234

    webservice 学习的c#版本实例

    你想要了解webservice么,那么就下载它吧,通过学习它,你就可以了解webservice的整个过程,但是需要vs2010的支持。是系统分析师考试的一个考试要点。

    Android调用WebService

    最近学习的是在android端如何去调用远程WebService,都说WebService是一种基于SOAP协议的远程调用标准,对于这个协议理解不深,知道webservice可以将不同操作系统平台、不同语言、不同技术整合到一块,android SDK...

    WebService CXF学习文档

    做开发时,查了大量资料,发现一比较全面的资料,分享一下!...WebService CXF学习——高级篇(一)(二) 1.整合Spring框架 2.CXF+Spring+Hibernate 3.WS-Security WebService CXF学习——JAXB剖析

    黑马程序员_WebService_webservice从入门到上手企业开发资料.

    WebService是一个新概念,它的系统架构、实现技术是现有应用的面向Internet的一个延伸。Web是为了程序到用户的交互,而Web Service是为程序到程序的交互作准备,Web Service已成为IT产业近几年来探索的热点课题之一...

    webservice asp.net

    一个简单的webservice asp.net 的例子 新手学习webservice 的教材

    webservice.学习笔记.docx

    SAP与其他外围系统交互使用的一种通讯方式,具体讲述了WSDL文件的发布与在SAP中的部署,以及接口的测试和配置方式

    xfire调用webservice

    1. 学习曲线陡峭:xfire的学习曲线较陡峭,需要开发者有较强的Java编程基础和WebService开发经验。 2. 配置复杂:xfire的配置相对复杂,需要开发者有较强的配置和部署经验。 在本文中,我们讨论了xfire的基本概念、...

    Jersey RESTful WebService框架学习(一)

    NULL 博文链接:https://1197581932.iteye.com/blog/2400218

    用C#写的winform调用webservice天气预报小软件教程

    在本教程中,我们将学习如何使用C#语言在WinForm中调用WebService来实现一个天气预报小软件。这个小软件可以根据城市名称获取天气信息,并将其显示在WinForm窗体上。 C#语言基础 在开始学习本教程之前,需要具备...

    springboot整合CXF发布webservice和客户端调用

    springboot整合CXF发布webservice和客户端调用 项目中每个类都有详细的注释,保证都能看懂,不失为一个学习springboot整合cxf来学习webservice发布调用的好例子

    java使用XFire调用webService接口

    在本文中,我们将学习如何使用 XFire 框架在 Java 中调用 webService 接口。XFIRE 是一个基于 Java 的开源框架,用于简化 Web 服务的开发和集成。下面,我们将通过一个简单的例子,展示如何使用 XFire 调用 ...

    webservice远程调用,返回数据生成xml文件,并通过SAX解析出来

    webservice远程调用,返回String数据并生成xml文件到本地工程,在通过SAX解析器把数据解析出来。这是webservice应用的一个简单的例子。根据该例子的思想,可以实现很多功能了。...我们可以学习其中的一种就可以了

    Axis2集成SSH搭建WebService支持事务(图文详解含核心代码)

    今天特意将项目中用Axis2集成SSH实现WebService的过程记录下来,一方面做一下笔记,另一方面,方便广大码农朋友,希望能跟大家交流学习。 本文介绍用Axis2集成SSH搭建WebService。会达到的效果: 1.按照传统我们用...

    使用eclipse实现webservice

    使用eclipse实现java websservice,此资源包含工程和详细的说明文档,对于想学习webservice的初学者来说这是一个不错的资源。

    ava-webservice例子

    一个学习java-webservice不错的例子,服务端接口、客户端都有

    WebService课件

    微软课程的WebService课件,用于教学与学习,是一到十一章的内容.

    webService视频资源

    webService视频教程,包括源码等一系列全套资源,需要学习的多多交流

    webservice学习之Axis2 (一)

    NULL 博文链接:https://chilongxph.iteye.com/blog/516018

Global site tag (gtag.js) - Google Analytics