溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎樣實現(xiàn)WCF上傳文件

發(fā)布時間:2021-11-24 09:45:55 來源:億速云 閱讀:260 作者:柒染 欄目:編程語言

今天就跟大家聊聊有關(guān)怎樣實現(xiàn)WCF上傳文件,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

在優(yōu)酷上我想上傳一段視頻,你有想過會臺是怎么實現(xiàn)的嗎?這里我就為大家分析一下關(guān)于利用WCF上傳文件,在WCF沒出現(xiàn)之前,我一直使用用WebService來上傳文件,我不知道別人為什么要這么做,因為我們的文件服務(wù)器和網(wǎng)站后臺和網(wǎng)站前臺都不在同一個機器,操作人員覺得用FTP傳文件太麻煩,我就做一個專門用來上傳文件的WebService,把這個WebService部署在文件服務(wù)器上,然后在網(wǎng)站后臺調(diào)用這個WebService,把網(wǎng)站后臺頁面上傳上來的文件轉(zhuǎn)化為字節(jié)流傳給WebService,然后WebService把這個字節(jié)流保存文件到一個只允許靜態(tài)頁面的網(wǎng)站(靜態(tài)網(wǎng)站可以防止一些腳本木馬)。

WebService來上傳文件存在的問題是效率不高,而且不能傳輸大數(shù)據(jù)量的文件,當(dāng)然你可以用Wse中的MTOM來傳輸大文件,有了WCF就好多了,通過使用WCF傳遞Stream對象來傳遞大數(shù)據(jù)文件,但有一些限制:只有BasicHttpBinding、NetTcpBinding和NetNamedPipeBinding支持傳送流數(shù)據(jù)。流數(shù)據(jù)類型必須是可序列化的Stream或MemoryStream。傳遞時消息體(MessageBody)中不能包含其他數(shù)據(jù)。TransferMode的限制和MaxReceivedMessageSize的限制等。

下面具體實現(xiàn):新建一個WCFService,接口文件的代碼如下:

[ServiceContract]  publicinterfaceIUpLoadService  {  [OperationContract(Action="UploadFile",IsOneWay=true)]  voidUploadFile(FileUploadMessagerequest);  }  [MessageContract]  publicclassFileUploadMessage  {  [MessageHeader(MustUnderstand=true)]  publicstringSavePath;  [MessageHeader(MustUnderstand=true)]  publicstringFileName;  [MessageBodyMember(Order=1)]  publicStreamFileData;  }

定義FileUploadMessage類的目的是因為第三個限制,要不然文件名和存放路徑就沒辦法傳遞給WCF了,根據(jù)第二個限制,文件數(shù)據(jù)是用System.IO.Stream來傳遞的接口方法只有一個,就是WCF上傳文件,注意方法參數(shù)是FileUploadMessage接口實現(xiàn)類文件的代碼如下:

publicclassUpLoadService:IUpLoadService  {  publicvoidUploadFile(FileUploadMessagerequest)  {  stringuploadFolder=@"C:\kkk\";  stringsavaPath=request.SavePath;  stringdateString=DateTime.Now.ToShortDateString()+@"\";  stringfileName=request.FileName;  StreamsourceStream=request.FileData;  FileStreamtargetStream=null;  if(!sourceStream.CanRead)  {  thrownewException("數(shù)據(jù)流不可讀!");  }  if(savaPath==null)savaPath=@"Photo\";  if(!savaPath.EndsWith("\\"))savaPath+="\\";   uploadFolderuploadFolder=uploadFolder+savaPath+dateString;  if(!Directory.Exists(uploadFolder))  {  Directory.CreateDirectory(uploadFolder);  }  stringfilePath=Path.Combine(uploadFolder,fileName);  using(targetStream=newFileStream(filePath,FileMode.Create,FileAccess.Write,FileShare.None))  {  //readfromtheinputstreamin4Kchunks  //andsavetooutputstream  constintbufferLen=4096;  byte[]buffer=newbyte[bufferLen];  intcount=0;  while((count=sourceStream.Read(buffer,0,bufferLen))>0)  {  targetStream.Write(buffer,0,count);  }  targetStream.Close();  sourceStream.Close();  }  }  }

實現(xiàn)的功能是到指定目錄下按照日期進行目錄劃分,然后以傳過來的文件名保存文件。這篇文章最主要的地方就是下面的Web.Config配置:

<system.serviceModel> <bindings> <basicHttpBinding> <bindingnamebindingname="FileTransferServicesBinding"maxReceivedMessageSize="9223372036854775807"  messageEncoding="Mtom"transferMode="Streamed"sendTimeout="00:10:00"/> </basicHttpBinding> </bindings> <services> <servicebehaviorConfigurationservicebehaviorConfiguration="UploadWcfService.UpLoadServiceBehavior" name="UploadWcfService.UpLoadService"> <endpointaddressendpointaddress=""binding="basicHttpBinding"bindingConfiguration="FileTransferServicesBinding"contract="UploadWcfService.IUpLoadService"> </endpoint> <endpointaddressendpointaddress="mex"binding="mexHttpBinding"contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behaviornamebehaviorname="UploadWcfService.UpLoadServiceBehavior"> <serviceMetadatahttpGetEnabledserviceMetadatahttpGetEnabled="true"/> <serviceDebugincludeExceptionDetailInFaultsserviceDebugincludeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>

看完上述內(nèi)容,你們對怎樣實現(xiàn)WCF上傳文件有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

wcf
AI