zoukankan      html  css  js  c++  java
  • SOAP消息机制简介

    SOAP消息机制简介

      SOAP(Simple Object Access Protocol,简单对象访问协议)作为一种信息交互协议在分布式应用中非常广泛,如WebService。在使用.Net开发WebService时候,只需要在对应的方法上加上WebMethod特性然后就可以通过网络进行SOAP消息的发送。这样在平时使用Webservice时,可能不太关心SOAP消息的结构到底是怎样的。下面大致说说SOAP消息的结构,以及使用工具监听SOAP消息报文。
    本节目录:

    • 1、XSD是什么
    • 2、基于SOAP的数据交互系统是XSD的
    • 3、SOAPSOAP消息结构
    • 4、支持SOAP的协议
    • 5、通过SOAPHeader扩展SOAP
    • 6、SOAP自定义异常
    • 7、监听SOAP消息

    1、XSD是什么                                                                             
      XSD(XML Scheme Definition,XML大纲定义)文档用来描述XML的结构和内容。它本身也是一个XML文档,通过它我们可以知道xml文档中包含哪些节点,以及这些节点应该是什么类型的值等。常见的如WSDL文档。

    2、基于SOAP的数据交互系统应该是XSD的                                          
      WebService数据交互格式是基于SOAP的,而实际上SOAP就是具有SOAP格式的XML数据。基于XML的跨平台特性,各个系统在调用WebService时,都需要能准确的理解WebService需要什么类型的参数,有哪些参数,返回值是什么等等。要很好的说明这些问题,XSD是一种很好的选择。所以说这类系统是XSD的。。

    3、SOAP消息结构                                                                        
      首先看看如下SOAP请求消息:

      它包含由SOAP信封(<soap:Envelope>) SOAP 头(<soap:Header>) SOAP消息体 (<soap:Body>)组成。其中<soap:Envelope>是SOAP消息中的根节点,是SOAP消息中必须的部分;<soap:Header>是SOAP消息中可选部分,如果SOAP消息中含有它,那么它一定要是soap:Envelope>中的第一个元素节点;<soap:Body>是SOAP中必须部分,如果SOAP消息中没有<soap:Header>,那么<soap:Body>必须是SOAP中第一个元素节点。
      此外:在WebService返回给消费者时,如果服务发生异常,则返回给服务消费者还有<soap:Fault>元素节点,它包含在<soap:Body>中。如下:

    1
    2
    3
    4
    5
    6
    7
    8
    <soap:Body>
    <soap:Fault>
    <faultcode xmlns:q0="ns=cnblogs.com/tyb1222">q0:code</faultcode>
    <faultstring>System.Web.Services.Protocols.SoapException: 0x00</faultstring>
    <faultactor/>
    <detail />
    </soap:Fault>
    </soap:Body>

    <faultcode>是<soap:Fault>中必须的元素节点,它让消费者能识别错误。

    <faultstring>是<soap:Fault>中必须的元素节点,用来描述错误文本信息
    <faultactor/>不是<soap:Fault>中必须的元素节点,用来描述是在哪个路由节点上出错。
    <detail >用来描述与<soap:Body>有关的应用程序集错误信息。如果Body不能被正确处理,那 <detail >就是<soap:Fault>中必须元素

    4、支持SOAP的协议                                                                      
      通常,访问的WebService都是通过Web服务器。访问Web服务器最常见的应用协议当然是久负盛名的HTTP了。HTTP也就成了支持SOAP最常用的协议。实际上支持SOAP支持的任何传输协议实现应用程序之间的通讯,包括TCP、SMTP等。

    5、通过SOAPHeader扩展SOAP                                                        
      在.Net平台上开发WebService,如果不通过SOAPHeader对SOAP头进行扩展,SOAP消息中只有<soap:Envelope>、<soap:Body>这两个SOAP中必须的两个节点。很多时候SOAPHeader的使用也是SOAP种经常用到的部分,如通过SOAPHeader 对消费者做身份认证,或者给SOAP消息中使用Actor来进行SOAP消息路由等。
      通过SOAPHeader扩展SOAP,可以在派生类中重写SOAPHeader的实现。注意通过派生类实现对SOAPHeader重写时,需要给派生类定义一个无参数构造函数,否则发布访问WebService时会报因为没有无参数构造函数而无法序列化的问题。
    简要介绍一下扩展SOAPHeader。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class EaxmHeader : SoapHeader
    {
         public string UserName { get; set; }
         public string Password { get; set; }
     
        public EaxmHeader()
        {
        }
     
        public EaxmHeader(string userName,string password)
        {
            UserName = userName;
            Password = password;
        }
    }

      然后在WebService具体函数接口上通过SOAPAttribute中MemberName设置为将EaxmHeader对象添加。如下:

    [WebMethod]
    [SoapHeader("header", Direction = SoapHeaderDirection.InOut)]
    public int divide(int x, int y)

    6、SOAP自定义异常                                                                      
      网络通信中发射异常是难免的。有时为了保障服务的安全性而尽量少暴露服务信息并且需要让消费者知晓在调用过程中发生异常的原因,一般可通过抛出自定义SOAPException异常,在<soap:Fault> 中自定义<faultcode>错误码和 <faultstring>提示文本信息。如在catch中 throw new SOAPException(...)

    7、监听SOAP消息                                                                         
      SOAP消息监听工具有MSSoapT(Microsoft SOAP ToolKit),tcpTrace等工具。下面就说说使用它们来监听SOAP消息。
    发布完WebService以后,可以通过WSDL通过WebService URI地址或者是WebService的WSDL文档来生成服务代理类(参见前一节)。
    代理类生产完成以后,在代理类的构造函数中设置端口号。如:

    public class ExamService : SoapHttpClientProtocol
    {
        private SendOrPostCallback divideOperationCompleted;
     
        /// <remarks/>
        public ExamService()
        {
        }
    ....
    }

      上面http://193.168.11.94:8866 就是在使用工具监听SOAP消息时本地的端口号。注意:如果是在VS调试环境下,使用Asp.Net Development Server也会使用一个端口号,实际监听的端口号是代理类中设置的端口,和它一般是不同。


    7.1、使用MSSoapT监听SOAP 消息                                                   
    设置监听端口、主机等信息,如下图:

    这样,调试程序时,MSSoapT监听到SOAP 消息如下图:

    上半部分为请求SOAP消息,下部分为返回SOAP消息。如下图:


    7.2、使用tcpTrace监听SOAP 消息。                                                 


    这样监听到的消息如下图:

    分类: WCF工具

    .Net Framework SDK下的命令汇总

      .Net SDK下有很多命令工具,有许多在我们平时开发应用中很有帮助。最近看书总结了一些,但是难免有点以偏概全,挂一漏万。下面就介绍这些命令的基本用法,实际应用中可以参考MSDN。

      切入正题,打开SDK命令提示,如下图:

    1、ildasm (IL Disassembler IL 反汇编器)

      它是一个重要的工具,通过它,可以查看元数据(metedata)信息,IL等。

    •  保存、查看IL代码:在VS2008命令窗口输入ILDAsm,然后通过它的【文件】菜单打开文件,如下图:

    • 查看元数据信息:在ILDASM中按"Ctrl+M"即能查看元数据信息。如下图

      

    2、SN.exe(Strong Name)强名称工具。

      可使用它来生产密钥、查看密钥,并使用它生成的私钥对程序集签名。写入密钥使用它的 -t选项,查看公钥用-tp 选项,如下图:


    3、NGen.exe 本地代码生成器 。

      将一个程序集的所有IL代码编译成本地代码,并将这些本地代码保存到一个单独的文件中。NGen.exe对最终执行环境做出的假设是非常保守的,所有他生成的代码不会像JIT生成的代码那样高度优化。
      本机映像生成器 (Ngen.exe) 是一个提高托管应用程序性能的工具。Ngen.exe 创建本机映像(包含经编译的特定于处理器的机器代码的文件),并将它们安装到本地计算机上的本机映像缓存中。运行库可从缓存中使用本机映像,而不是使用实时 (JIT) 编译器编译原始程序集。
    主要介绍它的三个选项:install(安装)、uninstall(卸载)、display(显示).
    它安装有点类似将程序集安装在GAC中,有点不同的是它安装的程序集不需要强签名,而如果要将程序集安装在GAC中,则需要强签名。在使用display,显示程序集之前必须先通过install进行安装。

    安装使用install选项:

    卸载使用uninstall选项:

    显示使用display选项:


    4、WSDL

      这个工具大家应该很熟悉,它就是生成WebService代理类的工具,可以通过URI生成,也可以通过Web服务描述语言(WDSL)生成。


    5、AL 程序集链接器

      可生成一个EXE或者PE文件,但不能将多个文件合并成一个。也可以将资源文件嵌入到一个程序集中。可以生成附属程序集(标明了一种具体文化语言的程序集)

    由此可见AL命令生成的程序集只是通过将链接的文件生成一个新的文件,连接文件还是还是存在的
    6、CLRVer.exe CLR版本查看工具

    列出一台机器上安装的所有CLR版本。低版本下不能查看高版本。如在3.5下:

    4.0下:


    7、DumpBin.exe\CorFlags.exe

    用它们检查编译器生成的托管模块所签入的信息。CorFlags转换工具可用于配置可移植可执行映像的标头CorFlags部分


    8、ILAsm.exe IL汇编器

      ILDasm IL反汇编器,MSIL 汇编程序。MSIL 汇编程序从 Microsoft 中间语言 (MSIL) 生成可移植可执行的 (PE) 文件。(有关 MSIL 的更多信息,请参见 编译为 MSIL。)可以运行结果可执行文件(该文件包含 MSIL 和所需的元数据)以确定 MSIL 是否按预期执行。

    将IL代码生成的PE文件:

    确保 .il 源文件中的最后一行代码具有结尾空白或行尾字符。如在使用ILDASM生成的IL代码末尾如下图:

    9、PEVerify.exe

      它检查一个程序集的所有方法,帮助确定其 MSIL 代码及关联的元数据是否满足类型安全要求。/md (metedata简写)、/il(中间语言)是它选择项中的两个。其中/md针对程序集中的元数据(metedata);/IL针对程序集中实现的方法执行 MSIL语言类型安全类型检查;如果两者都未指定,则都会检查,先执行/md检查,如果没有错误则执行/il检查,否则会执行检查。;如果指定/IL检查,则无论/md检查如何都会执行/il检查。


    10、TlbImp.exe

      COM 类型库中的类型定义转换为公共语言运行库程序集中的等效定义。Tlbimp.exe 的输出为二进制文件(程序集),
    该文件中包含在原始类型库中定义的类型的运行库元数据。可以使用诸如 Ildasm.exe 这样的工具检查此文件。

    11、Tlbexp.exe 类型库导出程序。

      生成一个类型库,该类型库描述公共语言运行库程序集中定义的类型,应用程序(如 Visual Basic 6.0)可以使用生成的类型库绑定到程序集中定义的 .NET 类型。不能使用 Tlbexp.exe 从使用类型库导入程序 (Tlbimp.exe) 导入的程序集生成类型库


    12、RegAsm.exe 程序集注册工具
      程序集注册工具读取程序集中的元数据,并将所需的项添加到注册表中。注册表允许 COM 客户程序以透明方式创建 .NET Framework 类。类一经注册,任何 COM 客户程序都可以使用它,就好像该类是一个 COM 类。类仅在安装程序集时注册一次。程序集中的类实例直到被实际注册时,才能从 COM 中创建。


    13、CSC.EXE 编译如果程序代码中含有不安全的类型,使用它编译时会失败。

    14、SVCUtil.exe

      它的作用类似WSDL,不同的是它用于WCF,将WCF服务生产代理类。

     15、GACUtil.exe

      在GAC中安装一个强命名程序集。弱命名程序集是不能被安装到GAC中的。默认情况下,执行该命令的用户必须是Windows 或Administrator下的,其他组下的用户不能使用此命令对程序集进行安装、卸载、安装弱名称程序集时,如下图:

    使用之前介绍的强名称工具SN生成的密钥对程序集进行签名,然后安装:

    查看程序集:

    卸载程序集:

    16、MakeCert.exe证书生成工具。

      仅用于生成用于测试目的的x.509证书。使用它时,有许多可选项。其中-sk用于指定密钥容器的位置,此位置包含私钥。如果不存在,系统将自动创建一个。-n 用于指定证书主题,此名称必须符合 X.509 标准。最简单的方法是在双引号中指定此名称,并加上前缀 CN=;

    17、CertMgr.exe

    证书管理工具,管理证书、证书信任列表、证书吊销列表它使用证书的两类存储区:StoreFile和系统存储区。不指定证书存储区类型,它能识别存储区类型并执行适当的操作。

    在命令行中查看证书信息:

    运行时如果不指定任何参数,将启动GUI界面:

    18、SignTool.exe(.Net FrameWork 1.0、1.1版本中为ChkTrust.exe)。

      用于对文件进行数字签名,验证文件或时间戳文件的签名。为了检验SignTool对文件签名,首先使用它的Verify选项验证一下文件:

     

    对文件签名:


    19、StoreAdm.独立存储工具。

      管理独立存储,提供列出用户的存储区和删除它们的选项:


    20、PermView.exe权限查看工具。允许查看程序集的请求权限(仅仅在.Net FrameWork 1.0\1.1中可用)

    21、SecUtil

      从程序集中提取强名称信息或公钥,并将该信息转换为可合并到代码中的格式。

    .Net FrameWork 4.0中已经不再使用。
    22、SetReg.exe(在.Net FrameWork 1.0、1.1以上版本中已使用SignTool)。设置注册表工具
    23、Cert2Spc.exe 发行者证书测试工具。

      通过一个或多个X.509证书创建发行者证书。仅用于测试目的

    http://www.cnblogs.com/tyb1222/archive/2012/02/21/2360971.html

  • 相关阅读:
    vmvare桥接模式下无法连接网络
    netty LEAK: ByteBuf.release() was not called before it's garbage-collected
    FileOutputStream write与原文件md5不一致,文件变大了 或者 SpringMVC的 ResponseEntity 下载的文件与原文件md5值不一样
    小技巧:linux怎么查看连接的创建时间
    org.springframework.dao.QueryTimeoutException: Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException: Command timed out after 300 millisecond(s)
    fastJson转换json字符串到对象中时类型为list的字段为空
    zookeeper集群搭建Exception when following the leader java.io.EOFException
    用ab测试代理程序
    centos7 配置java程序自启动
    log4j2配置模板
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2377206.html
Copyright © 2011-2022 走看看