当前位置导航:炫浪网>>网络学院>>网页制作>>XML/WebService教程

在数据架构规划前进行XML消息的设计

本文假定你对Visual Studio.NET和XML技术都比较熟悉

摘要

    Web服务是利用XML消息来传递数据的技术。如果你要设计一个数据库结构,你大概不会让你的工具去自动的完成,而是要手工的进行调整来保证最高的效率,作者在这篇文章中认为,设计Web服务也是一样的。你需要首先了解Web服务会返回什么样的数据,然后再用这样的数据结构来设计出最有效率的消息格式。你将从这篇文章中学习到如何决定有效的消息结构,并且根据这一结构来创建相关的Web服务。

    没有经验的开发者在开发Web服务时,经常跳过设计这一重要的第一步,他们从给工程添加Web引用开始,然后再给服务中添加相应的Web方法。虽然这种方法比较简便,却不是创建真正用于业务的Web服务的好办法,因为这样的话就忽略了Web服务消息结构的设计。在这篇文章中,我会向大家解释为什么这种常规的办法不适合重要的开发,然后会教给大家用Visual Studio® .NET设计Web服务的更好办法。

*

对你的数据有把握

    当编写面向数据的应用时,如何去创建数据库结构呢?你是不是会先设计出类程序然后再让你的集成开发环境帮你自动创建数据库结构,还是你会亲自手动创建标准化的,完整的和高效的数据库结构?一般情况下你都会选择手动的来创建数据库结构。即使你是利用了可视化的数据结构设计器,而不是使用数据定义语言(DDL)来进行设计,你依然对数据结构的设计有良好的控制。

    Web服务的目标就是在恰当的时候提供恰当的数据。当客户端调用Web服务时,XML格式的消息被用于发送请求和返回结果。当编写Web服务和相应的客户端程序时,你主要就是针对这些消息格式编程,应用程序真正关心的就是这些消息中承载的数据。既然如此,为什么要先设计出Web服务的类和方法,然后再用工具自动的生成消息的数据结构?你应该先设计出消息的数据结构,然后再根据这一结构来设计Web服务,就像你在设计数据库结构时一样。

消息,而不是方法

    优先考虑消息是一个进步,例如,某个Web服务接收地区编码,然后返回当地的天气情况,习惯了面向对象的方法,你会自然而然的就设计出GetWeather方法来获取字符参数,然后返回一个CurrentWeather对象的实例。(参见示例1)

    这种方法不是很好,因为你设计的这些方法和对象仅对你这个Web服务有意义,使用这个Web服务的程序对你设计的CurrentWeather类却一无所知,例如类成员所表示的具体意义。事实上,客户程序仅仅知道它接收了一个名叫CurrentWeather的XML架构(XSD)复杂类型,当你访问Web服务的WSDL说明(形如weatherservice.asmx?wsdl)时会自动的创建这一XSD类型的定义,客户端工具就会根据自身的情况将这一XSD类型映射成为数据结构。例如,SOAP工具会把CurrentWeather实例映射成为IXMLDOMNodeList接口的XML节点。.NET Framework通常会把这个XSD类型转换成为本地类型,从而带来很多麻烦,例如,增加了对示例1中Web服务引用的.net应用会根据CurrentWeather的XSD类型自动生成一个名叫CurrentWeather的类:

public class CurrentWeather
{
    public string Conditions;
    public string IconUrl;
    public Single Humidity;
    public Single Barometer;
    public float FahrenheitTemperature;
}

    对那些不知道这一Web服务功能的人来说,第一个问题就是“CelsiusTemperature属性哪里去了,为什么FahrenheitTemperature是一个域而不是属性”?答案就是,只有服务内CurrentWeather类的公共,可读写的成员会被.NET Framework自动序列化成为XML,因为CelsiusTemperature是只读的,它就没有被序列化,也就不能在客户端的CurrentWeather类中体现出来,而且,自动生成的客户端类只包含公共域,而不是属性。客户端程序仅仅知道有名叫CurrentWeather的XSD类型,但XSD类型并没有区分属性和域,对于客户端来讲都只是数据。

    从这个角度看,你会觉得Web服务有着很严重的局限性,不能够让客户端得到服务所返回对象的实例。这其实并不是Web服务的局限,而只是你不能把Web服务看成是获取远程对象(就像DCOM一样)的手段的原因。

    设计天气服务的更好办法是从定义消息开始。例如,你定义了WeatherRequest消息,包含有地区编码和包含有当地天气情况的CurrentWeather消息。示例2就体现了示例的请求和返回消息,可以作为你设计Web服务的起点。

    现在,由于Web服务和客户端的开发者都有可以理解这一Web服务的WeatherRequest消息和CurrentWeather消息,他们就不再会被一些实现细节所困惑了,例如只读成员和属性等。

 

共3页 首页 上一页 1 2 3 下一页 尾页 跳转到
相关内容
赞助商链接