注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

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

2011-02-23 08:52:37|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
目录

      1 设计的背景

      2  技术点说明

      3  方案设计

      4  说明



1        设计的背景

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

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



2 技术点说明

2.1 Soap和Wsdl区别

    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 文件
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <Books>

  3.   <Book>

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

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

  6.     <Price>11.00</Price>

  7.     <Author>王明</Author>

  8.   </Book>

  9.   <Book>

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

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

  12.     <Price>13.00</Price>

  13.     <Author>李斯</Author>

  14.   </Book>

  15. </Books>
复制代码
XSD文件
  1. <?xml version="1.0" encoding="utf-8"?>

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

  3.   <xs:element name ="Books">

  4.     <xs:complexType>

  5.       <xs:sequence>

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

  7.           <xs:complexType>

  8.             <xs:sequence>

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

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

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

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

  13.             </xs:sequence>

  14.           </xs:complexType>

  15.         </xs:element>

  16.       </xs:sequence>

  17.     </xs:complexType>

  18.   </xs:element>

  19. </xs:schema>
复制代码
对应的后台代码

添加命名空间
  1. using System.Xml.Schema;

  2. using System.Xml.Linq;

  3. //Coding

  4. XmlSchemaCollection schemalist = new XmlSchemaCollection();

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



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

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



  8. //写日志

  9. throw e.Exception;

  10. });
复制代码
2.3 Web Server 的客户端权限验证

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

      SoapHeader

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

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

    SoapHeader 在服务器端简要代码用例
  1.     /// <summary>

  2.     /// Summary description for Service1

  3.     /// </summary>

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

  5.     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

  6.     [ToolboxItem(false)]

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

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

  9.     public class Service1 : System.Web.Services.WebService

  10.     {



  11.         public LoginUserInfo _userinfo ;

  12.         [WebMethod]

  13.         [SoapHeader("_userinfo")]

  14.         public string ServerInterface()

  15.         {

  16.             if (Authentication())

  17.             {

  18.                 return "No Pass The Authentication";

  19.             }

  20.             else

  21.             {

  22.                 return "Pass the Authentication";

  23.             }

  24.            

  25.             return "Hello World";

  26.         }



  27.         /// <summary>

  28.         /// Authentication whether  the LoginUser have purview

  29.         /// </summary>

  30.         /// <returns></returns>

  31.         private bool Authentication()

  32.         {

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

  34.                 return true ;

  35.             else

  36.                 return false ;

  37.         }

  38.     }





  39.     /// <summary>

  40.     /// 登陆用户信息

  41.     /// </summary>

  42.     public class LoginUserInfo : SoapHeader

  43.     {

  44.         /// <summary>

  45.         /// 用户名称

  46.         /// </summary>

  47.         public string Name { get; set; }



  48.         /// <summary>

  49.         /// 用户密码

  50.         /// </summary>

  51.         public string PassWord { get; set; }



  52.     }
复制代码
SoapHeader 在客户端的简要代码用例
  1. ServiceSoapClient Client = new ServiceSoapClient();

  2.           Client._userinfo.Name = "admin";

  3.           Client._userinfo.PassWord = "passWord";

  4.           Client.Authentication();
复制代码
2.4 Linq 查询XML文档并返回查询结果的对象
  1.                     IList<Book> list = (from p in doc.Root.Elements("Book")

  2.                                 select new Book

  3.                                 {

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

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

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

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

  8.                                 }).ToList();
复制代码
3 方案设计

3.1 结构图

附件: WEB服务结构图.bmp

Web 服务结构图



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

3.1.1 服务接口定义

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



Code
  1.   /// <summary>
  2.     /// Summary description for Service1
  3.     /// </summary>
  4.     [WebService(Namespace = "http://tempuri.org/")]
  5.     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  6.     [ToolboxItem(false)]
  7.     // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
  8.     // [System.Web.Script.Services.ScriptService]
  9.     public class Service1 : System.Web.Services.WebService
  10.     {

  11.         public AuthenticationTicket ClientTicket;
  12.      
  13.        
  14.         [WebMethod]
  15.         [SoapHeader("ClientTicket")]
  16.         public string AddCustomInf(string XMLString)
  17.         {
  18.          
  19.             if (!Authentication)
  20.                 return string.Empty;
  21.             //解析并生成CustomInf对象
  22.             IList<CustomInf> list = XMLParser.Instance.Parser(XMLString);
  23.             CustomInfOper oper = new CustomInfOper();
  24.             //保存客户信息
  25.             foreach (CustomInf inf in list)
  26.             {
  27.                 oper.AddCustomInf(inf);
  28.             }

  29.         }

  30.         /// <summary>
  31.         /// Authentication whether  the LoginUser have purview
  32.         /// </summary>
  33.         /// <returns></returns>
  34.         private bool Authentication()
  35.         {
  36.           bool returnvalue=false;
  37.           if (ClientTicket != null)
  38.           {
  39.                 //数据库验证票据是否有效

  40.               returnvalue = true;
  41.           }
  42.           return returnvalue;
  43.         }


  44.         /// <summary>
  45.         /// 根据帐号和密码,生成验证票据,并返回
  46.         /// </summary>
  47.         /// <param name="UserName">用户名称</param>
  48.         /// <param name="PassWord">密码</param>
  49.         /// <returns></returns>
  50.         public string GetAuthenticationTicket(string UserName,string PassWord)
  51.         {
  52.             string AuthenticationTicket = string.Empty;

  53.             //验证权限,并返回票据
  54.             return AuthenticationTicket;
  55.         }

  56.     }


  57.     /// <summary>
  58.     /// 验证票据
  59.     /// </summary>
  60.     public class AuthenticationTicket : SoapHeader
  61.     {
  62.         public string Ticket { get; set; }
  63.     }
复制代码
3.1.2 XML解析器,转化对象

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




Code
  1.   1internal class XMLParser
  2.   2
  3.   3    {
  4.   5        private XMLParser()
  5.   7        { }
  6.   8
  7.   9        private static XMLParser _instance;
  8. 11        internal static XMLParser Instance
  9. 13        {
  10. 15            get
  11. 17            {
  12. 19                if (_instance == null)
  13. 21                _instance = new XMLParser();
  14. 23                return _instance;
  15. 25            }
  16. 27        }
  17. 32
  18. 33        internal IList<CustomInf> Parser(string XMLString)
  19. 34
  20. 35        {
  21. 37            try
  22. 39            {
  23. 43                //验证XML文档结构是否和XSD文件一致
  24. 45                XmlSchemaSet schemas = new XmlSchemaSet();
  25. 47                schemas.Add("", System.Web.HttpContext.Current.Request.MapPath(System.Web.HttpContext.Current.Request.ApplicationPath + "/App_LocalResources/Template.xsd"));
  26. 48
  27. 49                XDocument doc = XDocument.Load(XmlReader.Create(new StringReader(XMLString)));
  28. 50
  29. 51                bool errors = false;
  30. 52
  31. 53                doc.Validate(schemas, (o, e) =>
  32. 54
  33. 55                {

  34. 57                    errors = true;
  35. 58
  36. 59                    throw e.Exception;
  37. 60
  38. 61                });
  39. 68
  40. 69                //获取对应数据并转化成对应对象
  41. 71                IList<CustomInf> list = (from p in doc.Root.Elements("CustomInf")
  42. 73                                        select new CustomInf
  43. 75                                              {
  44. 77                                                  CustomName = p.Element("CustomName").Value,
  45. 79                                                  Telephone = p.Element("Telephone").Value,
  46. 81                                                  Address = p.Element("Address").Value,
  47. 85                                              }).ToList();
  48. 89                return list;
  49. 93            }
  50. 94
  51. 95            catch (XmlException ex)  //异常处理写日志
  52. 97            {
  53. 99              //写日志
  54. 101            }
  55. 103            catch (XmlSchemaValidationException ex)
  56. 105            {
  57. 107                //写日志
  58. 109            }
  59. 110
  60. 111            catch (Exception ex)
  61. 113            {
  62. 115              //写日志
  63. 117            }
  64. 121            return null;
  65. 123        }
  66. 125    }
  67. 126
复制代码
3.1.3 业务层

具体的业务

添加客户信息




Code
  1. public class CustomInfOper 
  2. {
  3.         /// <summary>
  4.         /// 添加客户信息
  5.         /// </summary>
  6.         /// <param name="info"></param>
  7.         public void AddCustomInf(CustomInf info)
  8.         {
  9.         }

  10.     }
复制代码
(文/macroxu-1982  出处/博客园)
  评论这张
 
阅读(765)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017