热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

    本文的开发环境 Vss 2008   目录       1 设计的背景       2  技术点说明       3  方案设计       4  说明   1         设计的背景 一

 

 

本文的开发环境 Vss 2008

 

目录

      1 设计的背景

      2  技术点说明

      3  方案设计

      4  说明

 

1         设计的背景

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

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

 

2 技术点说明

2.1 SoapWsdl区别

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

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

 

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

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

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

 

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

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

 

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

Xml 文件

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

<Books>

  <Book>

    <Name>软件设计原理Name>

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

    <Price>11.00Price>

    <Author>王明Author>

  Book>

  <Book>

    <Name>软件设计模式Name>

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

    <Price>13.00Price>

    <Author>李斯Author>

  Book>

Books>v

XSD文件

 

xml version&#61;"1.0" encoding&#61;"utf-8"?>

<xs:schema xmlns:xs&#61;"http://www.w3.org/2001/XMLSchema">

  <xs:element name &#61;"Books">

    <xs:complexType>

      <xs:sequence>

        <xs:element name&#61;"Book" maxOccurs&#61;"unbounded">

          <xs:complexType>

            <xs:sequence>

              <xs:element name &#61;"Name" type&#61;"xs:string">xs:element>

              <xs:element name &#61;"ISBN" type &#61;"xs:string">xs:element>

              <xs:element name &#61;"Price" type&#61;"xs:decimal">xs:element>

              <xs:element name&#61;"Author" type &#61;"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 &#61; new XmlSchemaCollection();

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

 

            XDocument doc &#61; XDocument.Load("Books.xml");

            doc.Validate(schemalist,(sender,e)&#61;>{

 

                //写日志

                throw e.Exception;

             });

&#xff12;.3 Web Server 的客户端权限验证

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

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

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

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

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

    ///

    /// Summary description for Service1

    ///

    [WebService(Namespace &#61; "http://tempuri.org/")]

    [WebServiceBinding(ConformsTo &#61; 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";

        }

 

        ///

        /// Authentication whether  the LoginUser have purview

        ///

        ///

        private bool Authentication()

        {

            if (_userinfo.Name&#61;&#61; "Admin") //this is Example

                return true ;

            else

                return false ;

        }

    }

 

 

    ///

    /// 登陆用户信息

    ///

    public class LoginUserInfo : SoapHeader

    {

        ///

        /// 用户名称

        ///

        public string Name { get; set; }

 

        ///

        /// 用户密码

        ///

        public string PassWord { get; set; }

 

    }

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

   

           ServiceSoapClient Client &#61; new ServiceSoapClient();

           Client._userinfo.Name &#61; "admin";

           Client._userinfo.PassWord &#61; "passWord";

           Client.Authentication();

   

    

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

                    IList list &#61; (from p in doc.Root.Elements("Book")

                                select new Book

                                {

                                    Name &#61; p.Element("Name").Value,

                                    ISBN &#61; p.Element("ISBN").Value,

                                    Price &#61;Convert.ToDecimal(p.Element("Price").Value),

                                    Author &#61; p.Element("Author").Value

                                }).ToList();

  

&#xff13; 方案设计

3.1 结构图

未命名.JPG
                        Web
服务结构图

 

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

3.1.1 服务接口定义

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

ContractedBlock.gifExpandedBlockStart.gifCode
  /// 
    
/// Summary description for Service1
    
/// 

    [WebService(Namespace &#61; "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo 
&#61; 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 AuthenticationTicket ClientTicket;
       
        
        [WebMethod]
        [SoapHeader(
"ClientTicket")]
        
public string AddCustomInf(string XMLString)
        {
           
            
if (!Authentication)
                
return string.Empty;
            
//解析并生成CustomInf对象
            IList<CustomInf> list &#61; XMLParser.Instance.Parser(XMLString); 
            CustomInfOper oper 
&#61; new CustomInfOper();
            
//保存客户信息
            foreach (CustomInf inf in list)
            {
                oper.AddCustomInf(inf);
            }

        }

        
/// 
        
/// Authentication whether  the LoginUser have purview
        
/// 

        
/// 
        private bool Authentication()
        {
           
bool returnvalue&#61;false;
           
if (ClientTicket !&#61; null)
           { 
                
//数据库验证票据是否有效

               returnvalue 
&#61; true;
           }
           
return returnvalue;
        }


        
/// 
        
/// 根据帐号和密码&#xff0c;生成验证票据&#xff0c;并返回
        
/// 

        
/// 用户名称
        
/// 密码
        
/// 
        public string GetAuthenticationTicket(string UserName,string PassWord)
        {
            
string AuthenticationTicket &#61; string.Empty;

            
//验证权限&#xff0c;并返回票据
            return AuthenticationTicket;
        }

    }


    
/// 
    
/// 验证票据
    
/// 

    public class AuthenticationTicket : SoapHeader
    {
        
public string Ticket { getset; }
    }


3.1.2 XML解析器&#xff0c;转化对象

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

ContractedBlock.gifExpandedBlockStart.gifCode
  1None.gifinternal class XMLParser
  2None.gif
  3ExpandedBlockStart.gifContractedBlock.gif    dot.gif{
  5InBlock.gif        private XMLParser()
  7ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{ }
  8InBlock.gif
  9InBlock.gif        private static XMLParser _instance;
 11InBlock.gif        internal static XMLParser Instance
 13ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 15InBlock.gif            get
 17ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 19InBlock.gif                if (_instance &#61;&#61; null)
 21InBlock.gif                _instance &#61; new XMLParser();
 23InBlock.gif                return _instance;
 25ExpandedSubBlockEnd.gif            }

 27ExpandedSubBlockEnd.gif        }

 32InBlock.gif
 33InBlock.gif        internal IList<CustomInf> Parser(string XMLString)
 34InBlock.gif
 35ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 37InBlock.gif            try
 39ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 43InBlock.gif                //验证XML文档结构是否和XSD文件一致
 45InBlock.gif                XmlSchemaSet schemas &#61; new XmlSchemaSet();
 47InBlock.gif                schemas.Add("", System.Web.HttpContext.Current.Request.MapPath(System.Web.HttpContext.Current.Request.ApplicationPath &#43; "/App_LocalResources/Template.xsd"));
 48InBlock.gif
 49InBlock.gif                XDocument doc &#61; XDocument.Load(XmlReader.Create(new StringReader(XMLString)));
 50InBlock.gif
 51InBlock.gif                bool errors &#61; false;
 52InBlock.gif
 53InBlock.gif                doc.Validate(schemas, (o, e) &#61;>
 54InBlock.gif
 55ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{

 57InBlock.gif                    errors &#61; true;
 58InBlock.gif
 59InBlock.gif                    throw e.Exception;
 60InBlock.gif
 61ExpandedSubBlockEnd.gif                }
);
 68InBlock.gif
 69InBlock.gif                //获取对应数据并转化成对应对象
 71InBlock.gif                IList<CustomInf> list &#61; (from p in doc.Root.Elements("CustomInf")
 73InBlock.gif                                         select new CustomInf
 75ExpandedSubBlockStart.gifContractedSubBlock.gif                                              dot.gif{
 77InBlock.gif                                                  CustomName &#61; p.Element("CustomName").Value,
 79InBlock.gif                                                  Telephone &#61; p.Element("Telephone").Value,
 81InBlock.gif                                                  Address &#61; p.Element("Address").Value,
 85ExpandedSubBlockEnd.gif                                              }
).ToList();
 89InBlock.gif                return list;
 93ExpandedSubBlockEnd.gif            }

 94InBlock.gif
 95InBlock.gif            catch (XmlException ex)  //异常处理写日志
 97ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 99InBlock.gif              //写日志
101ExpandedSubBlockEnd.gif            }

103InBlock.gif            catch (XmlSchemaValidationException ex)
105ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
107InBlock.gif                //写日志
109ExpandedSubBlockEnd.gif            }

110InBlock.gif
111InBlock.gif            catch (Exception ex)
113ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
115InBlock.gif              //写日志
117ExpandedSubBlockEnd.gif            }

121InBlock.gif            return null;
123ExpandedSubBlockEnd.gif        }

125ExpandedBlockEnd.gif    }

126None.gif

 

3.1.3 业务层

具体的业务

添加客户信息

ContractedBlock.gifExpandedBlockStart.gifCode
public class CustomInfOper   
 {
        
/// 
        
/// 添加客户信息
        
/// 

        
/// 
        public void AddCustomInf(CustomInf info)
        { 
        }

    }

                              2008/08/25   夜   小徐  于上海

 

 



推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
author-avatar
海啸1203_902
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有