徐文兵的IT博客

(全力支持博客实名化)

常用链接

统计

积分与排名

Tech WebSite

兄弟连

最新评论

以XML为数据传输格式的Web service设计方案

 

 

本文的开发环境 Vss 2008

 

目录

      1 设计的背景

      2  技术点说明

      3  方案设计

      4  说明

 

1         设计的背景

一个公司有多套系统,多套系统是基于不同的平台,并在系统中包含了webFormWindows service 等形式的软件 ,同时每套系统都需要和公司的客户资料打交道。

在这样的情况下,我们设计了一个Web服务来统一的管理,对于Web 服务与客户端信息交互的方式通过固定格式的XML文档来实现  

 

2 技术点说明

.1 SoapWsdl区别

    Soap 全称为 simple object access protocal(简单对象访问协议)

 是以XML为基础通过Http,负责客户端和服务器端信息传递,

 

    Wsdl 全称是 web services description language web 服务描述语言)

 也是以XML为基础负责描述Web服务定义的接口的信息语言,描述web 服务的接口

 包含了接口定义的方法,参数,参数类型,等信息

 

.2 XML 结构文档XSD简要说明和XSD 验证方式

 XSD的全称为XML schema definitionXML 结构定义)它是一种描述XML结构的语言,用来描述XML文档的定义的元素,数据类型

 

vs2008 中利用xsd文档验证XML文件的结构

Xml 文件

<?xml version="1.0" encoding="utf-8"?>

<Books>

  <Book>

    <Name>软件设计原理</Name>

    <ISBN> 122-232-223-444-4444</ISBN>

    <Price>11.00</Price>

    <Author>王明</Author>

  </Book>

  <Book>

    <Name>软件设计模式</Name>

    <ISBN>122-111-223-2223</ISBN>

    <Price>13.00</Price>

    <Author>李斯</Author>

  </Book>

</Books>v

XSD文件

 

<?xml version="1.0" encoding="utf-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name ="Books">

    <xs:complexType>

      <xs:sequence>

        <xs:element name="Book" maxOccurs="unbounded">

          <xs:complexType>

            <xs:sequence>

              <xs:element name ="Name" type="xs:string"></xs:element>

              <xs:element name ="ISBN" type ="xs:string"></xs:element>

              <xs:element name ="Price" type="xs:decimal"></xs:element>

              <xs:element name="Author" type ="xs:string"></xs:element>

            </xs:sequence>

          </xs:complexType>

        </xs:element>

      </xs:sequence>

    </xs:complexType>

  </xs:element>

</xs:schema>

对应的后台代码

添加命名空间

                 using System.Xml.Schema;

using System.Xml.Linq;

//Coding

            XmlSchemaCollection schemalist = new XmlSchemaCollection();

            schemalist.Add(string.Empty, "Books.xsd");

 

            XDocument doc = XDocument.Load("Books.xml");

            doc.Validate(schemalist,(sender,e)=>{

 

                //写日志

                throw e.Exception;

             });

.3 Web Server 的客户端权限验证

       在说明Web Server的客户端权限验证之前,我们先了解一下SoapHeader

      SoapHeader 是SOAP Envelope中的一部分 ,SoapHeader 一般的解决凌驾于具体的服务功能的问题,一般的是框架层面上的问题,比如说权限。下面是 web server 客户端权限的说明。

首先 Web server 是不带状态的,客户端按照权限票据的方式来获得权限,基本的流程是,服务端提供一个生成票据的端口的接口,在这个接口中包含了证明客户端身份的帐号和密码,验证通过,返回一个权限票据

      在客户端调用服务端具体的业务接口时通过SoapHeader传输权限票据,作为客户端的身份验证。

    SoapHeader 在服务器端简要代码用例

    /// <summary>

    /// Summary description for Service1

    /// </summary>

    [WebService(Namespace = "http://tempuri.org/")]

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    [ToolboxItem(false)]

    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.

    // [System.Web.Script.Services.ScriptService]

    public class Service1 : System.Web.Services.WebService

    {

 

        public LoginUserInfo _userinfo ;

        [WebMethod]

        [SoapHeader("_userinfo")]

        public string ServerInterface()

        {

            if (Authentication())

            {

                return "No Pass The Authentication";

            }

            else

            {

                return "Pass the Authentication";

            }

           

            return "Hello World";

        }

 

        /// <summary>

        /// Authentication whether  the LoginUser have purview

        /// </summary>

        /// <returns></returns>

        private bool Authentication()

        {

            if (_userinfo.Name== "Admin") //this is Example

                return true ;

            else

                return false ;

        }

    }

 

 

    /// <summary>

    /// 登陆用户信息

    /// </summary>

    public class LoginUserInfo : SoapHeader

    {

        /// <summary>

        /// 用户名称

        /// </summary>

        public string Name { get; set; }

 

        /// <summary>

        /// 用户密码

        /// </summary>

        public string PassWord { get; set; }

 

    }

    SoapHeader 在客户端的简要代码用例

   

           ServiceSoapClient Client = new ServiceSoapClient();

           Client._userinfo.Name = "admin";

           Client._userinfo.PassWord = "passWord";

           Client.Authentication();

   

    

.4 Linq 查询XML文档并返回查询结果的对象

                    IList<Book> list = (from p in doc.Root.Elements("Book")

                                select new Book

                                {

                                    Name = p.Element("Name").Value,

                                    ISBN = p.Element("ISBN").Value,

                                    Price =Convert.ToDecimal(p.Element("Price").Value),

                                    Author = p.Element("Author").Value

                                }).ToList();

  

3 方案设计

3.1 结构图

未命名.JPG
                       
Web
服务结构图

 

下面以添加客户信息为例 各层之间的定义

3.1.1 服务接口定义

包含权限票据接口和正常的服务功能接口

Code


3.1.2 XML解析器,转化对象

将字符串转化成对应的对象

Code

 

3.1.3 业务层

具体的业务

添加客户信息

Code

 

 

0
0
(请您对文章做出评价)
« 上一篇:“Orcas”新语言特征 :Lambda (λ) 表达式
» 下一篇:系统开发过程中的几点使用技巧

posted on 2008-08-25 22:51 徐文兵 阅读(2282) 评论(6)  编辑 收藏 所属分类: 数据库和XML技术, 软件分析和设计, ASP.net

评论

#1楼 2008-08-25 23:46 Gray Zhang      

对于你的验证的设计不是很明白,烦请指教一下
1.你的意思是在第一次通讯的时候传送用户名密码,以后都传送一个表明会话的ID呢,还是每一次都传送用户名和密码
2.用户名和密码传送过程中的安全问题打算如何解决
  回复  引用  查看    

#2楼 2008-08-26 00:07 士兵偷鸡[未注册用户]

楼主文中已经提到了,webserver是不带状态的,所以应该不是使用“表明会话的ID”
其次,文中也提到了soapheader,用户名和密码应该是在soapheader中提供的。
安全问题我也想请教一下楼主的解决方案。
  回复  引用    

#3楼[楼主] 2008-08-26 09:02 徐文兵      

1 不是每次都传递账号和密码
2 传递的账号和密码是通过加密的方式去控制安全问题的(账号和密码是无论如何都要传递过去的)

下面是验证的基本流程

这就像Form认证一样 , 通过一个登陆页面,输入登陆的账号和密码,在验证账号和密码成功后,生成一个权限验证票据,并保存到Cookie中去,
在其后 访问web 后台时 ,通过检查权限验证票据,来获得访问权限
web server 的权限设计流程是这个样子的
用户 在调用服务之前 ,首先调用服务提供的验证方法(这个方法带有两个参数 账号 和密码)验证并返回一个系统生成的票据,(注意这个票据就是权限的接下来 用户将返回的票据传到服务的继承soapHeader 对象中去,并同时调用相关的服务,系统根据票据可以直接判断 用户是否有权限了。
  回复  引用  查看    

#4楼 2008-09-06 16:05 Kai.Ma      

doc.Validate(schemalist,(sender,e)=>{

=>

是什么写法?
  回复  引用  查看    

#5楼 2008-09-06 16:41 A.Z!![未注册用户]

@Kai.Ma
一个架构师,不知道这是什么写法??不可思议!!
  回复  引用    

#6楼 2008-09-06 20:45 Kai.Ma      

@A.Z!!

C#2.0里面 我确实不知道:) ,今天查阅了一下,发现是3.0的Lambda表达式。看来要努力学习了。
  回复  引用  查看