关闭

关闭

关闭

封号提示

内容

首页 [论文]WSE发送带有附件的 SOAP.doc

[论文]WSE发送带有附件的 SOAP.doc

[论文]WSE发送带有附件的 SOAP.doc

上传者: 恋爱是挥霍芳华的方法 2018-07-13 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《[论文]WSE发送带有附件的 SOAPdoc》,可适用于职业教育领域,主题内容包含论文WSE发送带有附件的SOAP使用WSE发送带有附件的SOAP消息,使用DIME和WebServicesEnhancements,WSE中的高级D符等。

论文WSE发送带有附件的SOAP使用WSE发送带有附件的SOAP消息,使用DIME和WebServicesEnhancements,WSE中的高级DIME支持,对DIME使用WSE时的问题,小结WSAttachments是一种推荐的Web服务标准它能利用DIME消息封装协议来帮助在SOAP消息中发送附件。本文将介绍WebServicesEnhancements(WSE)forMicrosoftNET支持使用DIME和WSAttachments规范来发送附件的方法。在WebServicesEnhancements中使用DIMEWSEv使用ASPNET来支持带SOAP附件的DIME并可以从IO流读取DIME消息或将DIME消息写入IO流。本节介绍在ASPNET中向SOAP消息添加二进制附件的详细过程随后讨论WSE对DIME流的支持。WSE运行时实现DIME的方法对于带有附件的SOAP消息WSE运行时实现了一个DIME兼容的消息分析器用于转换传入的DIME消息的记录并从第一个DIME记录中提取主SOAP消息从后续的附件对象记录中提取封装的文件。当主SOAP消息从DIME中提取出来之后它被传递到WSE消息管道中并由一系列输入过滤器根据WSE支持的其他标头对其进行处理。下图显示了WSE运行时和ASPNET处理传入的DIME消息的方法。图:WSE运行时和ASPNET处理传入的DIME消息对于带附件的出站SOAP响应消息WSE中的DIME消息分析器构建一个新的DIME消息其中第一个DIME记录是出站SOAP响应而所有指定的附件都被封装在后续的DIME记录中。下图显示了WSE运行时组装DIME消息的方法。图:WSE运行时组装DIME消息WSE运行时通过丰富的API来进行编程控制并支持DIME。MicrosoftWebServicesDime命名空间中的对象支持DIME。对于由ASPNET提供的基于SOAP的Web服务MicrosoftWebServices命名空间中的SoapContext类通过为给定的SOAP消息指定高级Web服务协议的使用和属性来控制WSE运行时的行为。在WSE编程模型中当收到SOAP请求信息时运行时为接收到的请求生成一个HttpSoapContext对象。HttpSoapContextRequestContext属性访问消息的SoapContext对象并枚举包含在消息的WSE专用标头元素中的信息。如果传入的DIME消息符合WSAttachments规范WSE运行时就把它们作为带附件的SOAP消息来处理并提取主SOAP消息及其所有附件。对于每个附件都会向DimeAttachmentCollection添加一个DimeAttachment对象这样就可以通过SoapContextAttachments属性访问这些附件。与此类似可以向传出消息的SoapContext对象的DimeAttachmentCollection中添加附件以便WSE运行时将它们包含在传出消息的DIME记录中。接下来让我们看一下创建带附件的DIME消息作为Web服务响应的过程。为DIME配置WebServicesEnhancements要在DIME中使用附件即使在ASPNETWeb服务器上安装了WSE仍然需要对ASPNET应用程序进行一些额外的DIME相关配置。在MicrosoftVisualStudioNET中创建新的ASPNETWeb服务项目之后需要把对MicrosoftWebServicesdll程序集的引用添加到项目中。还要向soapExtensionTypes元素添加一个新类型方法是在Webconfig文件中为项目添加一个add元素如下所示:<configuration><systemweb><webServices><soapExtensionTypes><addtype="MicrosoftWebServicesWebServicesExtension,MicrosoftWebServices,Version=,Culture=neutral,PublicKeyToken=bfade"priority=""group=""><soapExtensionTypes><webServices><systemweb><configuration>在本例中type属性值不能包含分隔符或空格。如果webServices和soapExtensionTypes元素不存在还必须将它们添加到Webconfig文件中。WSE设置工具是一个不受支持的VisualStudio外接程序可用来方便地配置使用WSE的Web服务项目。通过安装该工具就可以很容易地配置基于WSE的项目使其使用DIME。向使用WSE的SOAP消息添加附件假设有一个名为ImageDimeService的Web服务类它具有一个返回二进制JPEG图像文件的公有方法。在服务的aspx文件的内含代码页面中应当使用using指令为这些命名空间创建别名如下所示:usingSystemWebServicesusingMicrosoftWebServicesusingMicrosoftWebServicesDime在本例中ImageDimeService类的定义如下:WebService(Namespace=",Description="Web服务使用DIME返回一个或多个JPEG文件。")publicclassImageService:SystemWebServicesWebService{下面的GetImage方法实现WebMethod返回所请求的JPEG文件:WebMethodpublicvoidGetImage(stringimageNameCollection){获取SoapContext作为响应消息SoapContextmyContext=HttpSoapContextResponseContext创建一个数组用于返回相关DIME附件的URI。stringretUri=newstringimageNameCollectionLengthinti=迭代器为由imageID数组中的值指定的每个文件创建一个DimeAttachment对象。Foreach(stringimageNameinimageNameCollection){字符串表示附件的文件名和路径。stringfilePath="C:images"imageName"jpg"使用文件名来创建新的DIME附件并通过MIME媒体类型imagejpeg来指定附件编码。DimeAttachmentdimeImage=newDimeAttachment("imagejpeg",TypeFormatEnumMediaType,filePath)生成对附件对象的基于GUID的URI引用并将其指定给DIME记录的ID属性。dimeImageId="uri:"GuidNewGuid()ToString()将新的DimeAttachment对象添加到SoapContext对象中。myContextAttachmentsAdd(dimeImage)将生成的URI添加到返回的数组中。retUrii=dimeImageIdi}返回与附件的ID值匹配的URI数组。returnretUri}在WebMethod方法中从客户端发出的SOAP请求消息包含一组图像名称。对于集合中的每一个名称Web服务都要从C:images文件夹中检索关联的JPEG文件并将图像添加到ResponseContext的DimeAttachmentCollection中。当WebMethod返回时WSE运行时将响应消息作为主DIME记录并将每个DimeAttachment作为一个后续记录这些记录的顺序与它们被添加到DimeAttachmentCollection中的顺序相同。从DIME消息提取附件为了让使用Web服务的客户应用程序接收并处理DIME消息客户端也必须安装WSE。要使VisualStudio中的MicrosoftNET客户应用程序能够支持WSEDIME必须添加对MicrosoftWebServicesdll程序集的引用。此外向基于DIME的Web服务添加了Web引用后必须修改Referencescs文件中的代理类以便从WSE中的MicrosoftWebServicesWebServicesClientProtocol类继承。例如上面例子中生成的ImageServiceWeb服务的客户端Web服务代理需要按以下方式修改:publicclassImageService:MicrosoftWebServicesWebServicesClientProtocol如果客户端已经安装了WSE设置工具AddWebReference(添加Web引用)将自动生成一个单独的、以“Wse”结尾的代理类该类是从相应的WSE类继承得到的。在这种情况下将ImageServiceWse用作服务代理即可。下面的示例显示了使用ImageServiceWeb服务检索多个JPEG文件作为DIME附件的方法。try{调用Web方法来传递图像名称数组并从返回的数组中捕获URI值以便通过ID来引用附件。stringretUri=myServiceGetImage(imageNameCollection)}catch(Exceptionex){处理任何异常错误。}检查响应消息是否包含任何附件。if(myServiceResponseSoapContextAttachmentsCount>){显示每个附加的JPEG图像文件。for(inti=i<myServiceResponseSoapContextAttachmentsCounti){将附加的图像转换成新的位图对象以供显示。BitmapmyImage=newBitmap(myServiceResponseSoapContextAttachmentsiStream)对图像执行一些操作。}如果未返回任何图像则警告用户。MessageBox("Noimageswerereturned")}在本例中使用DimeAttachmentStream属性将每个JPEG附件作为数据流从内存写入新的位图对象中。WSE中的高级DIME支持WSE可以方便地将附件与传出消息封装在一起而WSE对DIME的支持还提供了一些更高级的功能本节将对这些功能进行讨论。将大附件分块正如您在MSDNMagazine中我写的关于DIME的文章(英文)中看到的一样DIME规范支持将大附件分成多个记录这对处理超大型附件非常有用。分块的原理是将大附件分成块这样在将附件写入单个DIME记录时就无需将整个附件放入缓冲区。WSE允许您使用DimeAttachmentChunkSize属性以字节为单位指定附件的块大小。但是由于ASPNETWebMethods不支持流因此在ASPNET中使用WSE时整个DIME消息都会被缓存到内存中这就限制了实现时分块的有效性。使用DIME传输大附件的更好方法是通过适当的传输方法对DIME进行流处理。使用DimeReader和DimeWriter对数据进行流处理DIME是一种基于消息的格式DIME记录被序列化和可以分块的事实使它能够通过数据包级传输协议(如TCP和UDP)高效使用。WSE支持DIME消息和SystemIOStream对象(如NetworkStream)之间的双向流处理而不受基于消息的协议(如HTTP)的限制。当作为DIME流处理时WSE运行时将传出的DIME记录分块这样就无需定义被进行流处理的对象大小。当到达流结尾处时写入最后的记录块。下面的示例从一个文件(如大型二进制图像文件)生成输入流将该流写到一系列的分块DIME记录中并将DIME消息写到一个Stream对象中这个对象可以是通过TCP传输的NetworkStream:将二进制输入流采样转换成指定MIME媒体类型的DIME流。staticvoidWriteToDime(StreaminputStr,StreamdimeStr,stringmediaType){创建写入器用于将DIME消息写入dimeStreamDimeWritermyDW=newDimeWriter(dimeStr)创建GUID用作DIME记录ID。Guidguid=GuidNewGuid()stringid=stringFormat("uuid:{}",guidToString())创建新的DIME记录其MIME媒体类型由mediaType指定并且用contentLength值来指定分块。DimeRecordmyRecord=myDWLastRecord(id,mediaType,TypeFormatEnumMediaType,)指定很小的记录块:KB。myRecordChunkSize=使用BinaryWriter将流写入DimeRecord。BinaryWritermyWriter=newBinaryWriter(myRecordBodyStream)将传入流中的内容写入BinaryWriter。intsize=bytebytes=newbyteintnumByteswhile((numBytes=inputStrRead(bytes,,size))>){myWriterWrite(bytes,,numBytes)}清理myDWClose()}值得注意的是基于SOAP的DIME实现是将整个DIME消息读入内存而对DIME进行流处理时您可以使用DimeRecordChunkSize来限制需要使用的内存量。以下方法实现了相反的过程即读取DIME流并将记录内容提取到二进制流中。staticvoidReadFromDime(StreamdimeStr,StreamoutStr){创建读取器用于读取流式DIME消息。DimeReadermyDR=newDimeReader(dimeStr)创建DimeRecord以便(仅)读取当前的DIME记录。DimeRecordmyRecord=myDRReadRecord()创建读取器以便将记录内容读到其中。BinaryReadermyReader=newBinaryReader(myRecordBodyStream)将内容写到输出流中。intsize=bytebytes=newbyteintnumByteswhile((numBytes=myReaderRead(bytes,,size))>){outStrWrite(bytes,,numBytes)}清理myReaderClose()myDRClose()}对DIME使用WSE时的问题和版产品一样WSE在支持DIME、WSAttachments和相关规范的方法上存在一些限制。这些问题包括:保护附件根据WSSecurity规范(英文)WSE对保护SOAP消息提供了全面的支持但对以DIME消息形式发送的SOAP消息附件没有提供保护。如果告诉WSE对主SOAP消息进行签名和加密SOAP消息将通过WSESecurityOutpilter传输并在此过程中得到适当的保护。只有通过各种过滤器传递SOAP消息才能封装为带附件的DIME消息也就是说附件本身并未被保护因为它们可以被任意DIME分析器读取。如果需要保护DIME消息中的附件则应该使用一种NET框架支持的加密机制该机制由SystemSecurityCryptography命名空间提供。此外由于当前的DIME规范没有定义对DIME消息标头进行签名的方法WSE无法确定DIME消息是否被篡改。尤其是当使用href来表示特定的附件ID时WSE本身无法验证是否有人修改了ID或是将引用指向了完全不同的地方。因此当使用DIME来传输敏感数据时应该始终对流进行保护或使用安全传输。引用附件WSE支持DIME记录的ID字段可以使用DimeAttachmentId属性来设置这个字段。它允许您使用友好的ID字符串值而不是整数索引值来分配和访问附件。例如通过指定"Tom"而不是数组索引就可以访问ID为Tom的附件如下所示:myServiceResponseSoapContextAttachment"Tom"

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/12
0下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部