与HTML中使用enctype="multipart/form-data"一样,如何使用Web服务从客户端(Windows装有C#.NET)上传文件?
Michèle Leroux Bustamante:一条简单的传送在HTTP协议上的简单对象访问协议(SOAP)消息,它的内容类型通常是“text/xml”。尽管你可以包含一个二进制附件作为Web服务方法调用的参数,但是由于数据被编码成为xs:base64 或者xs:hexbinary(嵌入或者引用),给消息增加了多余负担,因此会导致额外开销。此外,XML语法分析程序在分析这些引用,以及对SOAP消息进行语法分析时打开附件的效率很低。为了解决这一问题,出现了许多用于处理SOAP消息附件的标准。其中,世界万维网联盟(W3C)最早推荐的是带有附件的SOAP消息是,它定义了在一个多用途的网际邮件扩充协议(MIME)中,消息类型是“multipart/related”时,如何将SOAP消息作为一个复合的SOAP文件进行传送。第一个MIME部分是SOAP信封,接下来的部分则包含附件。虽然带有附件的SOAP消息针对减少有效负载开销的问题是有效的,但是它并没有提出一个正式的解决方法来实现在SOAP消息中添加附件。
直接因特网消息封装(DIME)和Web服务(WS)附件规范改进这一解决方法。DIME类似于MIME,但DIME是一个交互的二进制消息各式,它支持任意类型消息的编译。DIME中消息被封装成为“application/dime”类型而不是“multipart/related”类型,因此在接收消息时便可以相应地进行语法分析。Web服务附件则描述在DIME中封装SOAP消息的方法。
直接因特网消息封装(DIME)和Web服务(WS)
最后,回答你的问题,Web服务工具包支持使用对象模型来实现在SOAP消息中添加附件,因此,你可以从HTTP头部提取详细信息并创建复杂的SOAP消息。由于Web服务代理服务器的产生,你可以简简单单的只写几行代码便完成:从一个二进制流中创建DIME附件,把它添加到输出附件集中,以及调用Web服务方法。如下所示,使用一个.NET Web服务完成添加附件的代码。
DimeAttachment attachment =
new DimeAttachment("image/jpeg",
TypeFormatEnum.MediaType,
data);
svc.RequestSoapContext.Attachments.Add(attachment);
svc.SignAttachment(text);
简而言之,当你向一个Web服务传送附件的时候,目前的工具包已经完成对DIME/WS附件的标准化。这很有可能带来加密、数字签名和其他目前还不支持的特性的发展,而且标准的名称甚至可能改变,但目前这还只是趋势。
As a teaser, I have included the links to some newly emerging discussions on SMTOM whose roots derive from PASWA. See below.
作为探讨,下面的这些链接是一些新出现的关于SMTOM的讨论,SMTOM是根源于PASWA的。请往下看。
规范链接:
http://www.w3.org/TR/SOAP-attachments
http://www.ietf.org/internet-drafts/draft-nielsen-dime-soap-01.txt
http://www.ietf.org/internet-drafts/draft-nielsen-dime-02.txt
http://www.w3.org/TR/SOAP-attachments
http://www.w3.org/TR/soap12-mtom/
http://www.gotdotnet.com/team/jeffsch/paswa/paswa61.html
http://www.dotnetdashboard.net/DesktopDefault.aspx?tabindex=7&tabid=73
