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");
}
本文的示例下载: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");
}
推荐阅读
-
HTTP协议下用Web Service上传大文件的解决方案
-
asp.net下实现支持文件分块多点异步上传的 Web Services
-
asp.net下使用DIME协议上传文件
-
Spring Cloud下使用Feign Form实现微服务之间的文件上传
-
Asp.net MVC下使用Bundle合并、压缩js与css文件详解
-
Asp.Net Core中配置使用Kindeditor富文本编辑器实现图片上传和截图上传及文件管理和上传(开源代码.net core3.0)
-
asp.net下大文件上传知识整理
-
ASP.NET下使用xml反序列化、缓存依赖实现个性化配置文件的实时生效
-
PHP中使用 TUS 协议来实现可恢复大文件上传
-
httpClient 使用http协议上传文件