WSE是什么?

它是Web Service Enhancements,是微软发布的构筑Web服务应用程序的附加套件。这个套件可以使web服务应用程序支持WS-Security、WS-Routing、WS-Attachments等规格。

(1)安全性:支援对平台安全的xml web服务的构筑,具有用于对soap信息进行电子签名和加密的功能。

(2)路由功能,对soap信息进行中继,并负责xml web服务的路由

(3)添加功能,可以向xml web服务soap信息中添加二进制数据。

在.net Web服务中,不支持MIME格式的soap附件,但在WSE2.0中却支持DIME附件,现在的WSE版本为3.0,在2.0中的DIME附件,在3.0中由MTOM模型代替。

关于wse更多内容可以参见老徐的系列:

http://www.cnblogs.com/frank_xl/admin/EditPosts.aspx?catid=177055

现在通过WSE3.0构建附件Soap消息包。

(一)  WSE服务端

WSE3.0可以到:

http://www.microsoft.com/downloads/details.aspx?

familyid=018a09fd-3a74-43c5-8ec1-8d789091255d&displaylang=en

下载

支持vs2005,其它版本的支持请参考其它文档。安装时以插件形式安装。

建立网站,并添加web 服务

[WebMethod]

public void SaveImage(byte[] bb)

{

FileStream fs = File.Create(@"k:\soapPicBinary2.gif");

fs.Write(bb, 0, bb.Length);

fs.Close();

}

在网站项目上右键,然后在右键菜单中可以看到WSE设置:WSE settings 3.0

这个可视化的工具是对Web.config文件的配置工具,WSE配置选项是放在web.config文件中的。

·在常规选项卡上,把增强选项和WSE soap协议工厂选中。

·在消息选项卡上,在MTOM设置中把客户模式选择打开。

然后就可以发布了。

(二)  客户端

在客户端添加web服务引用,生成代理,同时也要进行wse设置,这个比较简单,只要在消息选项卡上,把MTOM设置中的客户模式打开就行。如果是网站项目,会自动在Web.config文件中添加必要的章节,如果是应用程序,会在app.config文件中添加章节。

例如,现在在类库项目中添加wse服务引用,设置3.0后,app.config内容如下:

添加

<section name="microsoft.web.services3"

type="Microsoft.Web.Services3.

Configuration.WebServicesConfiguration, Microsoft.Web.Services3,

Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

章节,此节定义消息模式:

<microsoft.web.services3>

<messaging>

<mtom clientMode="On" serverMode="always" />

</messaging>

</microsoft.web.services3>

测试代码:

public void TestWse()

{

FirstInstance.FirstServiceWse client =

new UTest.FirstInstance.FirstServiceWse();

FileStream fs = new FileStream(@"k:\x1.gif", FileMode.Open);

byte[] bb = new byte[fs.Length];

fs.Read(bb, 0, bb.Length);

client.SaveImage(bb);

}

现在客户端通过的就是WSE服务代理实例来实现WSE服务请求。会了区分WSE下的附件MTOM传输优化,现在先通过WS服务代理实例来实现附件传输:

只要改到实例就可以:

FirstInstance.FirstService client =

new UTest.FirstInstance.FirstService();

查看soap包:

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

<soap:Envelope

xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<soap:Body>

<SaveImage xmlns="http://tempuri.org/">

<bb>R0lGODlhZGMDggAOw==</bb>

</SaveImage>

</soap:Body>

</soap:Envelope>

在包体的附件部分,我省略了大部分内容,但它是base64编码,与我在http://www.cnblogs.com/jams742003/archive/2010/03/31/1701555.html

中的附件的格式相同。

下面是启用了MTOM传输的WSE服务代理实例下的soap包:

----MIMEBoundary634057127108593750

content-id: <0.634057127108593750@example.org>

content-type: application/xop+xml; charset=utf-8; type="text/xml; charset=utf-8"

content-transfer-encoding: binary

<soap:Envelope

xmlns:xop="http://www.w3.org/2004/08/xop/include"

xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"

xmlns:wsse="http://docs.oasis-open.org/wss/2004/

01/oasis-200401-wss-wssecurity-secext-1.0.xsd"

xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/

oasis-200401-wss-wssecurity-utility-1.0.xsd">

<soap:Header>

</soap:Header>

<soap:Body>

<SaveImage xmlns="http://tempuri.org/">

<bb>

<xop:Include href="cid:1.634057127108906250@example.org" />

</bb>

</SaveImage>

</soap:Body>

</soap:Envelope>

----MIMEBoundary634057127108593750

content-id: <1.634057127108906250@example.org>

content-type: application/octet-stream

content-transfer-encoding: binary

GIF89ad

----MIMEBoundary634057127108593750—

可以看到所谓的MTOM优化传输包的形式。

Web service,或是WSE以soap协议(包)来传递消息,消息是重要的,也是目的所在。精确的控制消息,或说精准的控制包的内容是最主要的任务。

Soap协议版本从1.1到1.2有一些改进,消除了以前所存在的歧义,使解析更明确。.net web 服务及WSE就是遵循soap协议规则而用于控制soap包的简便工具。

现在实现传递附件和客户实例

服务端:

[WebMethod]

public void SaveImage(byte[] bb)

{

FileStream fs = File.Create(@"k:\soapPicBinary3.gif");

fs.Write(bb, 0, bb.Length);

fs.Close();

}

[WebMethod]

public void SaveAttachments(byte[] bb,Customer customer)

{

SaveImage(bb);

CreateText(customer);

}

private void CreateText(Customer customer)

{

StreamWriter writer=  File.CreateText(@"k:\customer.txt");

writer.Write(customer.Unid.ToString()

+ ":" + customer.UserName

+ " " + customer.CreateTime.ToString());

writer.Close();

}

其中加粗的方法是进行测试的方法。

在客户端:

public void TestCustomer()

{

FirstInstance.Customer customer =

new UTest.FirstInstance.Customer();

customer.Unid = 2;

customer.UserName = "Songjiang";

customer.CreateTime = Convert.ToDateTime("2010-4-1");

FileStream fs = new FileStream(@"k:\x1.gif", FileMode.Open);

byte[] bb = new byte[fs.Length];

fs.Read(bb, 0, bb.Length);

fs.Close();

FirstInstance.FirstServiceWse client =

new UTest.FirstInstance.FirstServiceWse();

client.SaveAttachments(bb, customer);

}

包的形式大概也能猜出来,现在只取包体一段内容:

<soap:Body>

<SaveAttachments xmlns="http://tempuri.org/">

<bb>

<xop:Include href="cid:1.634057142194062500@example.org" />

</bb>

<customer>

<Unid>2</Unid>

<UserName>Songjiang</UserName>

<CreateTime>2010-04-01T00:00:00</CreateTime>

</customer>

</SaveAttachments>

</soap:Body>

其中的客户还是以原来的格式存储,而附件(图片)是以MTOM形式存在发送。

消息是主体,消息就是包,精准的控制包的各个部分及命名要根据工具的控制力和自己的深入程度来达到。.net ws做为微软的ws工具,是不支持MIME附件soap包的,但在WSE2中就支持了对DIME附件的控制,在3.0中又支持了MTOM传输,这是工具的控制力;在WCF中,对于信道,信道元素,绑定模型等深层内容的掌握就是程序员深入理解和构建包的有力条件。尽管在我们的应用层面上,WCF对我们的大部分应用已经胜任且绰绰有余,但更深入的研究、理解和应用只有好处。轮子并不要我们创造,但从割胶到提取加工,以至到轮胎成型,如果整个过程我们理解的话,也不是坏事的,这样最少有2个好处:对于不同路面的轮胎可以进行不同处理而提供最恰当的轮胎(尽管差一点的轮胎也能上路);谁知道什么时候要做一回鲁宾逊?

例如,为服务的方法添加名字空间:

<SaveAttachments xmlns="http://tempuri.org/">

这个可以在web服务的类中添加修饰标签来达到:

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

消息(5)——WSE增强的web服务套件,MTOM附件相关推荐

  1. appollo消息服务器,Springboot 集成 MQTT —— web 服务端实现(apollo 客户端)-Go语言中文社区...

    基于 MQTT 可以实现很多场景,例如现在使用比较多的物联网,还有消息的实时推送.联网的设备连接上 apollo 服务器以后,一直监听 apollo 推送过来的信令/消息即可. 1.web 服务端向联 ...

  2. 【转】Web服务软件工厂

    patterns & practices开发中心 摘要 Web服务软件工厂(英文为Web Service Software Factory,也称作服务工厂)是一个集成的工具.模式.源代码和规范 ...

  3. 学习笔记---Web服务、Remoting、WCF (上) --- Web服务

    自从程序设计诞生起, 如何最大限度的重用代码, 减小编码的重复劳动就是程序员永恒不变的课题. 我们从学习面向对象开始, 先后引入了很多种共享代码的手段, 随着学习的不断深入就越发觉得程序设计的发展过程 ...

  4. 用 ASP.NET 开发 Web 服务的五则技巧

    (转的,作者不详) 一.禁用HTTP POST/GET协议 除非另外指定,否则,.NET将试图把Web服务绑定到三种协议:HTTP/POST.HTTP/GET和SOAP.之所以说"试图&qu ...

  5. SOA 设计原则和 Web 服务中的数据传输

    SOA 被翻译为面向服务架构,它应该是创建从自治服务生成系统的一个架构方法,它的目的是更方便地进行集成. SOA是Web 服务的一个自然延伸,因为Web 服务只是解决了异构系统之间的互操作,并没有降低 ...

  6. Web服务生存周期内发生的事件/Soap扩展的阶段/Soap扩展的步骤

    客户端创建WEB服务代理类的一个新实例,该对象驻留在客户端所在的同一台计算机上. 客户端调用代理类上的方法. 客户端计算机上的ASP.NET框架的基础结构将WEB服务方法的参数序列化为SOAP消息,并 ...

  7. Web 服务寻址(WS-Addressing)对 SOAP 的隐式影响

    文档选项 <tr valign="top"><td width="8"><img alt="" height= ...

  8. 描述 Web 服务:WSDL

    Web 服务描述语言(Web Services Description Language,WSDL)是一种基于 XML 的格式,它正在成为一种业界标准,用于以与实现无关的方式描述 Web 服务.将创建 ...

  9. WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载

    MTOM消息优化传输机制主要应用于大量数据的传输,很多文章中也直接得出结论:使用MTOM文件传输效率高.为什么MTOM的数据传输效率会比别的方式要高?MTOM真的如此完美吗,它有什么不足?什么情况下使 ...

最新文章

  1. AI一分钟|特斯拉股价收跌近 5%,私有化引发市场疑虑;三星发布智能音箱Galaxy Home...
  2. IDEA里运行代码时出现Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger的解决办法(图文详解)...
  3. python代码异常对照表格_Python表格py错误(pandas错误?)
  4. 人脸颜值评分软件_在线算个颜值,特科学的那种 | 知多少
  5. [html] 在H5中如何预加载音频?
  6. linux服务器运维操作命令,Windows和Linux系统服务器运维基本操作指令
  7. 产品经理有话说!这个报表神器更新了6大功能,绝对亮眼
  8. python优先级排序_用Python实现优先级队列的3种方法
  9. ADS(Advanced Design system)仿真测试元器件在不同功率下的输入阻抗
  10. n皇后问题-c语言实现
  11. plpgsql 编译执行
  12. java模拟简单的qq聊天_初学java之模拟QQ聊天软件(简单实现)
  13. 天线要设计为四分之一波长的原因
  14. 得力打印机(DL888D型号)Linux对接——Java+C版
  15. AI高考的信息检索策略
  16. 最简单的共享列表服务器KissLists
  17. 关于M1卡的SAK--其实都在前面函数的返回中
  18. 面向对象:面向对象程序设计
  19. C++:实现量化期权定价理论方法之一Bates模型测试实例
  20. Laravel4.1数据库 数据库填充(六)

热门文章

  1. 玩转Linux系统用户管理
  2. 软件测试—软件测试基础知识—测试用例设计的方法判定表和因果图
  3. 修理计算机英语,英语口语对话:修理电脑
  4. 将servlet[login]标记为不可用_30分钟上手OUTLOOK - 邮件标记
  5. java刷机_java非智能手机能不能通过刷机安装一个安卓智能系统
  6. 0基础可以学Web前端吗?如何快速掌握前端开发技能?
  7. html相对路径之前,HTML之绝对路径与相对路径
  8. i7 3960x支持服务器内存吗,酷睿i7 3960X支持多大内存
  9. 快递管理系统 java_快递管理基于java物流快递管理系统设计.doc
  10. kali无法共享本机文件_MySQL服务端读取客户端文件漏洞的复现