欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp.net下使用DIME协议上传文件

程序员文章站 2023-11-11 20:45:16
在某些web service的应用场景下,例如公文的传送,在web service返回结果的同时将word文档及其它附件返回,这时候可以使用dime协议...
在某些web service的应用场景下,例如公文的传送,在web service返回结果的同时将word文档及其它附件返回,这时候可以使用dime协议来进行文件的传输。使用它来传输不需要经过soap消息的序列化/反序列化,有很高的效率。当然这里要用到web services enhancements (wse) ,目前的最新版本为3.0。本文中所使用的版本为2.0sp2,有趣的是wse的各个版本中的命令空间都有很大的变化。这一点的确有点让人苦恼!在安装wse时推荐将visual studio tools也安装上,这样会免去手工修改web service的web.config文件的工作。
本文的示例下载:http://www.cnblogs.com/files/lcybest/dimesample.rar
web service:
首先要引用microsoft.web.services2.dll,修改web.config文件,将下面这段配置添加进去:
<webservices>
<soapextensiontypes>
<add type="microsoft.web.services2.webservicesextension, microsoft.web.services2, version=2.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35" priority="1" group="0" />
</soapextensiontypes>
</webservices>
</system.web>
如果你安装了wse的visual studio工具,以上工作可以通过工具来实现。
下面的代码演示了在responsesoapcontext中加入dime附件的实现:
[webmethod]
public string getdocument(string documentid)
{
if(documentid.length==0)
return "documentid can not be empty!";
attachment attach=new attachment(guid.newguid().tostring(),@"d:\test.doc");
microsoft.web.services2.responsesoapcontext.current.attachments.add(attach);
return "sendok";
}
我们使用一个windows应用程序来演示一下可以接收web service附件的客户端
首先要将microsoft.web.services2.dll引用到项目中,添加对web service的引用。此时如果安装了wse工具会自己动生成一个以“wse”为结尾的代理类。在代码中可以直接使用这个代理类。
如果没有安装工具则需要手工修改visual studio生成的代理类,代理类默认是从system.web.services.protocols.webclientprotocol继承的,在这里要修改为从microsoft.web.services2.webservicesclientprotocol来继承。
在我们客户端中可以通过以下代码来实现将response中的文件取出来保存到文件系统中:
 程序代码
private void button1_click(object sender, system.eventargs e)
{
talkserver.datainterface client=new dimeclient.talkserver.datainterface();
string strvalue=client.getdocument("test111");
if(client.responsesoapcontext.attachments.count==0)
{
messagebox.show("no attachments in the webservice response!");
return;
}
microsoft.web.services2.attachments.attachment attach;
attach=client.responsesoapcontext.attachments[0];
byte[] buffer=new byte[attach.stream.length];
client.responsesoapcontext.attachments[0].stream.read(buffer,0,buffer.length);
system.io.filestream stream=new system.io.filestream(@"c:\test.doc",system.io.filemode.create);
stream.write(buffer,0,buffer.length);
stream.flush();
stream.close(); 
if(strvalue=="sendok")
messagebox.show("receive succeed");
else
messagebox.show("receive fail");
}