asp.net下使用DIME協(xié)議上傳文件
更新時(shí)間:2007年04月13日 00:00:00 作者:
在某些Web Service的應(yīng)用場景下,例如公文的傳送,在Web Service返回結(jié)果的同時(shí)將word文檔及其它附件返回,這時(shí)候可以使用DIME協(xié)議來進(jìn)行文件的傳輸。使用它來傳輸不需要經(jīng)過SOAP消息的序列化/反序列化,有很高的效率。當(dāng)然這里要用到Web Services Enhancements (WSE) ,目前的最新版本為3.0。本文中所使用的版本為2.0sp2,有趣的是WSE的各個(gè)版本中的命令空間都有很大的變化。這一點(diǎn)的確有點(diǎn)讓人苦惱!在安裝WSE時(shí)推薦將Visual Studio Tools也安裝上,這樣會免去手工修改Web Service的Web.config文件的工作。
本文的示例下載:http://www.cnblogs.com/Files/lcybest/DIMESample.rar
Web Service:
首先要引用Microsoft.Web.Services2.dll,修改Web.config文件,將下面這段配置添加進(jìn)去:
<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工具,以上工作可以通過工具來實(shí)現(xiàn)。
下面的代碼演示了在ResponseSoapContext中加入DIME附件的實(shí)現(xiàn):
[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";
}
我們使用一個(gè)windows應(yīng)用程序來演示一下可以接收Web Service附件的客戶端
首先要將Microsoft.Web.Services2.dll引用到項(xiàng)目中,添加對Web Service的引用。此時(shí)如果安裝了WSE工具會自己動(dòng)生成一個(gè)以“WSE”為結(jié)尾的代理類。在代碼中可以直接使用這個(gè)代理類。
如果沒有安裝工具則需要手工修改Visual Studio生成的代理類,代理類默認(rèn)是從System.Web.Services.Protocols.WebClientProtocol繼承的,在這里要修改為從Microsoft.Web.Services2.WebServicesClientProtocol來繼承。
在我們客戶端中可以通過以下代碼來實(shí)現(xiàn)將Response中的文件取出來保存到文件系統(tǒng)中:
程序代碼
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文件,將下面這段配置添加進(jìn)去:
<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工具,以上工作可以通過工具來實(shí)現(xiàn)。
下面的代碼演示了在ResponseSoapContext中加入DIME附件的實(shí)現(xiàn):
[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";
}
我們使用一個(gè)windows應(yīng)用程序來演示一下可以接收Web Service附件的客戶端
首先要將Microsoft.Web.Services2.dll引用到項(xiàng)目中,添加對Web Service的引用。此時(shí)如果安裝了WSE工具會自己動(dòng)生成一個(gè)以“WSE”為結(jié)尾的代理類。在代碼中可以直接使用這個(gè)代理類。
如果沒有安裝工具則需要手工修改Visual Studio生成的代理類,代理類默認(rèn)是從System.Web.Services.Protocols.WebClientProtocol繼承的,在這里要修改為從Microsoft.Web.Services2.WebServicesClientProtocol來繼承。
在我們客戶端中可以通過以下代碼來實(shí)現(xiàn)將Response中的文件取出來保存到文件系統(tǒng)中:
程序代碼
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");
}
相關(guān)文章
ASP.NET小結(jié)之MVC, MVP, MVVM比較以及區(qū)別(一)
MVC, MVP和MVVM都是用來解決界面呈現(xiàn)和邏輯代碼分離而出現(xiàn)的模式。以前只是對它們有部分的了解,沒有深入的研究過,對于一些里面的概念和區(qū)別也是一知半解?,F(xiàn)在一邊查資料,并結(jié)合自己的理解,來談一下對于這三種模式思想的理解,以及它們的區(qū)別。歡迎各位高手拍磚。2014-05-05
.Net Core實(shí)現(xiàn)JWT授權(quán)認(rèn)證
這篇文章介紹了.Net Core實(shí)現(xiàn)JWT授權(quán)認(rèn)證的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01
asp.net為網(wǎng)頁動(dòng)態(tài)添加description描述信息的方法
這篇文章主要介紹了asp.net為網(wǎng)頁動(dòng)態(tài)添加description描述信息的方法,涉及asp.net動(dòng)態(tài)操作網(wǎng)頁元素的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
使用.net core3.0 正式版創(chuàng)建Winform程序的方法(圖文)
這篇文章主要介紹了使用.net core3.0 正式版創(chuàng)建Winform程序的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
.NET程序調(diào)試技巧(一):快速定位異常的一些方法
這篇文章主要介紹了.NET程序調(diào)試技巧(一):快速定位異常的一些方法,本文講解了定位本機(jī)異常、在客戶環(huán)境定位.net程序異常兩方面的內(nèi)容,需要的朋友可以參考下2015-06-06

