posts - 112, comments - 215, trackbacks - 0, articles - 34
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

运用C#创建一个.Net下的Web Service

Posted on 2007-04-02 10:35 济公 阅读(1709) 评论(7)  编辑 收藏 引用 所属分类: WebService
        微软在其.net战略中,对其主推的Web Service做了大肆的宣扬。现在,Web Service正如火如荼地发展着,相关的各项新技术层出不穷。Web Service的发展正构筑着互联网时代美好的明天。在本文中,我将向大家介绍Web Service的一些基本知识、如何用C#建立一个Web Service。通过文章,我们还将对WSDL、UDDI以及未来的Web Service有一个大致的了解。
        为什么需要Web Service?以前,分布式的应用程序逻辑需要使用分布式的对象模型,通过使用DCOM、CORBA、RMI之类的基本结构,开发人员仍可拥有使用本地模型所提供的丰富资源和精确性,并可将服务置于远程系统中。
当已经有中意的中间件平台(RMI、Jini、CORBA、DCOM 等等)时,我们为什么还要为Web而烦恼呢?中间件确实提供了强大的服务实现手段,但是,这些系统有一个共同的缺陷,那就是它们无法扩展到互联网上:它们要求服务客户端与系统提供的服务本身之间必须进行紧密耦合,即要求一个同类基本结构。然而这样的系统往往十分脆弱:如果一端的执行机制发生变化,那么另一端便会崩溃。例如,如果服务器应用程序的接口发生更改,那么客户端便会崩溃。为了能扩展到互联网运用,我们需要一种松散偶合的基本结构来解决这个问题。如此的情况下就迎来了Web Service的诞生。
        什么是Web Service? Web Service 是一种新的Web应用程序分支,他们是自包含、自描述、模块化的应用,可以发布、定位、通过Web调用。Web Service可以执行从简单的请求到复杂商务处理的任何功能。一旦部署以后,其他Web Service应用程序可以发现并调用它部署的服务。Web Service是一种应用程序,它运用了Web网络技术和基于组件开发的精华成分。可以使用标准的互联网协议,像超文本传输协议(HTTP)和XML,将功能纲领性地体现在互联网和企业内部网上。像DCOM、RMI、IIOP等基于组件的对象模型已经流行了较长一段时间了。然而这些模型都是依赖于一个特定的对象模型协议。Web Service扩展了这些模型,使之可以和简单对象访问协议(Simple Object Access Protocol,SOAP)以及XML通信以根除特定对象模型协议带来的障碍。可将WebService视作Web上的组件编程。(参见如图1)
Web Service基本上是利用超文本传送协议(HTTP)和SOAP来使商业数据可以在网上获得。它将商业对象(COM对象、Java Beans等)显露给在HTTP上的SOAP调用并执行远程功能调用。因此,Web Service的使用者可以在远程对象上通过SOAP和HTTP在Web上进行方法调用
         SOAP调用是一类能引起在位置B上的Web Service组件程序执行的调用。之后,程序执行的结果就以XML文档的形式返回给在位置A上的用户。 在图1中,在位置A的用户怎么知道在位置B的用户的一些情况的呢?这个就要涉及到一个通用标准。服务描述语言(Service Description Language, SDL),SOAP契约语言(SOAP Contract Language,SCL)以及
网络可访问性规格语言(Network Accessible Specification Language,NASSL)都是为了这个目的而建立的XML类语言。然而,IBM和微软最近同意将Web服务描述语言(Web Service Description Language,WSDL)作为Web Service的标准。Web Service组件的结构是通过Web服务描述语言来显露的。WSDL1.1是一个用来描述Web Service的属性以及界面的XML文档。目前已经有了新的规格书,该规格书可以在http://msdn.microsoft.com/xml/general/wsdl.asp上获得。
面临的任务
学会Web Service的最好方法就是自己动手做一个实例。我们都熟悉股票报价服务,纳斯达克、道琼斯都是很著名的例子。它们都提供一个输入公司代号并取得最新的股票价格的接口。本文我们就设法设计出同样的功能。

创建Web Service的工具
本文我们通过MS.Net Framework SDK来实现这个程序。
创建Web Service的比较好的集成开发环境(IDE)是Visual Studio.Net。然而,你也可以很容易的用任何文本编辑器(记事本、写字板、Visual Studio 6.0)来创建一个Web Service文件。
还有,你必须熟悉以下概念:
Net平台的基础知识
C#的基础知识
面向对象概念的基础知识

创建一个Web Service
下面,我们将用C#建立一个名为“SecurityWebService”的Web Service。一个Web Service文件将含有形式为.asmx的扩展名。(就像Asp.net的文件扩展名为.aspx)

<%@ WebService Language="C#" class="SecurityWebService" %>
这条语句将告诉编译器程序将运行在Web Service模式下以及C#类的名称。同时我们要访问Web Service的名字空间。还有,最好添加一个对System名字空间的引用。
using System;
using System.Web.Services;
该SecurityWebService的类应该继承Web Service类的功能。因此,我们添加了下面这行代码:
public class SecurityWebService : WebService
现在我们来运用我们的面向对象的技巧编写一个C#类。C#的类和C++、Java的类非常相象,如果你有C++和Java的基础,这个就是小菜一碟了。
.Net下的Web Service能够设定一些基本的数据类型。因此,如果我们返回“int”、“float”或是“string”等数据类型的话,它能自动将它们转化为标准的XML输出。然而不巧的是在大多数的情况下,我们需要同一个实体的一类数据集。下面我先举个例子。我们的SecurityWebService股票报价服务要求用户输入一个公司的代号,然后它会给出公司的全名以及当前的股票价格。由此,我们需要一个公司的三条信息:
公司代号(数据类型:string)
公司全名(数据类型:string)
股票价格(数据类型:double)
我们需要将单个股票报价的数据信息分解开。可以有很多方法完成此项工作,我们这里用了最好的枚举数据类型。我们在C#中用了“structs”,和C++中的structs一样。代码如下:
public struct SecurityInfo
{
public string Code;
public string CompanyName;
public double Price;
}

现在我们已经完成所有建立Web Service所需的模块了。因此,所有的代码如下:

<%@ WebService Language="C#" class="SecurityWebService" %>

using System;
using System.Web.Services;

public struct SecurityInfo
{
public string Code;
public string CompanyName;
public double Price;
}

public class SecurityWebService : WebService
{
private SecurityInfo Security;

public SecurityWebService()
{
Security.Code = "";
Security.CompanyName = "";
Security.Price = 0;
}

private void AssignValues(string Code)
{
// 在这里使用商业组件
// 方法调用就是用来获得所需的数据的
// 本程序中我给相应的代码添加了一个对应的字符串以方便显示
// 同时,我使用了随机数产生器来生成股票价格

Security.Code = Code;
Security.CompanyName = Code + " Pty Ltd";
Random RandomNumber = new System.Random();
Security.Price = double.Parse(new System.Random(RandomNumber.Next(1,10)).NextDouble().ToString("##.##"));
}

[WebMethod(Description="This method call will get the company name and the price for a given security code.",EnableSession=false)]
public SecurityInfo GetSecurityInfo(string Code)
{
AssignValues(Code);
SecurityInfo SecurityDetails = new SecurityInfo();
SecurityDetails.Code = Security.Code;
SecurityDetails.CompanyName = Security.CompanyName;
SecurityDetails.Price = Security.Price;
return SecurityDetails;
}
}

请记住,这个Web Service能通过Http做任何使用。我们也许会在代码中涉及到一些很敏感的商业数据,但是却不想它落入他人之手。那解决的方案就是保护一些逻辑函数,使用户只能访问到一些用来显示数据的函数。为了达到这个目的,我们使用了关键字“[Web Method]”。下面就是示例代码:
[WebMethod(Description="This......",EnableSession=false)]
public SecurityInfo GetSecurityInfo(string Code)
这个函数的访问类型是公有型的。标签“Description”是用来描述这个Web Service的功能的。因为我们不必储存任何session数据,所以我们将session状态设置为false。
private void AssignValues(string Code)
这是一个应该被逻辑保护的函数。因为我们不希望我们的商业机密数据能在Web被轻易的获得,所以我们将函数的访问类型设为private(注:在这里,即使你将函数的访问类型设为public,这个函数还是不能被公共地访问到,原因是关键字“[Web Method]”没有被用到)。
到此,我们可以用GetSecurityInfo(string)函数来获得最新的股票价格。同时,为了方便起见,我给公司代码添加了相应公司的名字。还有,股票的价格是随机产生的。
最后,我们将该文件保存在一个由IIS控制的目录下,文件名为“SampleService.asmx”。运行后的图示如下:
以上是一个由.Net Framework生成的Web页面,我们并没有创建这个页面(它是由系统自动产生的,所以我并不需要写任何代码来创建该页面)。这个功能使我们的工作量相对减轻了不少。同样,你也可以通过运用Asp.net的Pagelets功能或修改网页文件使页面以不同的方式显示其中的内容。你可以在
http://www.ibuyspy.com/store/InstantOrder.asmx获得一个很好的例子。

如何使用这个Web Service?
现在我们来使用这个Web Service。我们先输入一些值来获得股票示例价格。
按下Invoke按钮,我们就可以获得以下的XML文档:
这样,这个Web Service就给用户提供了其所需的信息了。因为是XML格式的文档,我们需要写客户端来析取这个XML文档。客户端可以为以下几类:
1.一个Web页面
2.一个控制台或是Windows下的运用程序
3.一个用WML语言描述的手机程序
4.一个运用在PDA上的Palm或Win CE程序
你可以直接用Http Get方法来调用这个Web Service。这样的话就不会出现第一个页面了,也不需要用户去点击Invoke按钮了。具体方法:
http://server/webServiceName.asmx/functionName?parameter=parameterValue
调用我们的Web Service的方法就是:
http://localhost/work/aspx/SampleService.asmx/GetSecurityInfo?Code=IBM

到此为止,我们已经知道如何用C#创建并使用一个Web Service,但是任务并没有完全完成。我们需要知道如何在Internet上找到我们的Web Service,我们的Web Service能不能也被收入在个大搜索引擎。为了解决这个问题,我们就需要建立一个“discovery”文件。

创建发现文件
在访问一个已有的Web Service以前,你必须先得找到并整合这个Web Service,这个过程就是Web Service的发现过程。通过这个发现过程,你才知道这个Web Service能为你提供什么样的服务以及你怎么和它实现互动。发现文件是一个以.DISCO为扩展名的XML文件。在实际运用中,你是不必为每一个Web Service创建发现文件的。以下就是一个发现文件的例子:
<?xml version="1.0" ?>
<disco:discovery xmlns:disco="
http://schemas.xmlsoap.org/disco/";>
<scl:contractRef ref="
http://localhost/work/aspx/SampleService.asmx?SDL";/>
</disco:discovery>
我们先将这个文件命名为“SampleService.disco”,并将它保存在该Web Service的目录下。如果我们是在“/work/aspx”目录下创建Web Service的话,我们就可以运用更灵活的“动态发现”了。“动态发现”能自动为我们检测“/work/aspx”目录以及子目录下的所有*.DISCO文件的,这样就省了我们不少功夫。
<?xml version="1.0" ?>
<dynamicDiscovery xmlns="urn:schemas-dynamicdiscovery:disco.2000-03-17">
</dynamicDiscovery>  
你可以在
http://services3.xmethods.net/dotnet/default.disco获得一份能使用的发现文件。通过分析发现文件,我们可以找到所需的Web Service。然而,在得到发现文件前你必须知道这个发现文件的确切的URL。否则你还是找不到你要的发现文件的,那么你当然就不能找到你要的Web Service了。这样,我们现在就要用到一项新技术了――通用发现,描述和整合(Universal Description,Discovery,and Integration,UDDI)来为已存在的Web Service做宣传了。UDDI是公开的,基于Internet的。这项技术目前还处于起初阶段,所以正不断发展着。你可以在http://uddi.microsoft.com/ 获得有关UDDI的参考。

发布这个Web Service
发布Web Service是很简单的。和Asp.net的程序差不多,你只要将.asmx文件和.disco文件拷贝到相应的目录,这样如果一切正常,这个Web Service就可以工作了。

展望Web Service的未来
Web Service技术的前途是相当光明的。在推动Web Service技术向前发展的道路上,不仅微软注入了很大的投资,Sun、IBM等也表示很大的兴趣。同时,网上还有为Apache和Java Web开发的SOAP工具包。然而,Web Service起步不久,还需要很多的工作要做。特别在国内,Web Service技术起步比国外有晚了一步,所以更要抓紧时间、迎接挑战。

Feedback

# re: 运用C#创建一个.Net下的Web Service  回复  更多评论   

2007-08-13 17:11 by 8383
只要有博客就可以在8383.com免费申请.CN域名,输入域名就能直接进入博客,我刚申请了一个,快输入8383hosting.cn到我的博客看我是如何耍酷吧!

# re: 运用C#创建一个.Net下的Web Service  回复  更多评论   

2010-06-27 00:08 by DeboraFuentes
In the complicated way to the academic grade students have to purchase thesis examples close to this good post at <a href="http://www.primedissertations.com">thesis</a> writing service or an experienced <a href="http://www.primedissertations.com">buy dissertation</a> service.

# re: 运用C#创建一个.Net下的Web Service  回复  更多评论   

2010-08-17 18:22 by plagiarism checker
I think it's charismatic, because it evince a very academic-focussed attitude. Preserving the incorruptibility of the academic system seems to be a greatest importance, although frankly declare illegal compensated ads for such a service seems a frail response. When the establishment is known by your friends who were animated with the results of the partnership, about this good topic . But remember always to use plagiarism checking run them through this plagiarism detection system for absolute checking and make sure that your material is authentic.

# re: 运用C#创建一个.Net下的Web Service  回复  更多评论   

2012-07-14 07:58 by purchasing essays
A imazing story will remain in society’s memories constantly. If you continue your research, you hopefully, would be hired by paper writing services. Just because you only can create the critique essay.
只有注册用户登录后才能发表评论。