當前位置:首頁 » 文件管理 » wcf非同步文件上傳

wcf非同步文件上傳

發布時間: 2023-01-31 11:00:16

『壹』 c#wcf的channelfactory<t>是經過動態編譯實現的么

WCF在跨域傳輸使用了兩種模型的方法調用:一種是同步模型,這種模型顯然對那些需要大量操作時間的方法調用(如從資料庫中獲取大量數據時)是一種痛苦的選擇。另一種是非同步模型的方法調用,這種模型是一種非阻塞方法,其方法調用期間並不等到方法調用結束獲得結果才返回,而是方法調用一經開始就馬上返回,程序可以繼續向前執行,被調用方法和主程序同時執行,在調用方法結束才返回結果。顯然這種模型給了我們很好的編程和使用體驗。
基於WCF在普通的編碼是以文本編碼方式在信道之間傳輸信息的,這種編碼會把所有的二進制信息以位元組數組的形式存儲,並以Base64進行編碼,而Base64則是用三個位元組來儲存4 個字元信息。使得數據量增大約30%以上。在WCF中引入了一種專門針對數據流進行優化編碼的MTOM模型。下面我們使用編碼模型和調用模型三種方式來改寫文件流的傳輸,以提高WCF應用程序的性能。
1、 MTOM模型:
這模型在於將SOAP消息編碼成SOAP MT OM(消息傳輸優化機制)編碼。這種編碼是為那些包含大量的二進制數據的SOAP消息而做的,它是把數據流作為SOAP消息的附件而添加的。所以利用這種編碼在傳輸信道之間傳輸可以顯著提高傳輸性能。在WCF中MTOM模型的操作契約中只能使用單個Stream對象作為參數或者返回類型。
這種模型的特點如圖所示:
1.1實現服務契約
服務契約是服務所支持的操作、使用的消息交換模式和每一則消息的格式,它控制消息被格式化的方式,在這里由於要使用MTOM編碼消息,所以在操作契約中必須要以單一的Stream對象為輸入輸出參數。所以這兒我們把服務定義為如下的形式:

[ServiceContract]
public interface ISendStreamService
{
[OperationContract]
void SendStream(Stream stream);
//這個方法的是為了傳遞文件的參數而設的
[OperationContract]
void FileNameSetting(string filename, string destinationpath);
}
另外我們還定義了一個傳輸文件路徑的名稱的輔助方法:FileNameSetting();
1.2實現伺服器方法
在上面定義了公共的介面後,接下來我們就實現介面的方法,主要的方法的目的是為了傳輸Stream對象,由於Stream是一個抽象類,所以這兒以文件流為操作對象來使用SendStream()這個方法。

1.3客戶通過介面調用伺服器方法
客戶端調用伺服器方法至少有三種,這里我們選擇工廠方法來實現,System.ServiceMode.Channel.ChannelFactory<T>類是這個信道工廠類,它的方法CreateChannel()可以創建T的實例。
ISendStreamService proxy=new
ChannelFactory<ISendStreamService>(「WSHttpBinding_ISendStreamService」).Create-
Channel();
proxy.FileNameSetting(file.Substring (file.LastIndexOf ("\\")+1), filePath);
proxy.SendStream(inStream);
1.4伺服器和客戶端的配置信息
配置信息定義了雙方通信的終結點、綁定、契約行為及其他的配置如安全,可靠性等。伺服器的配置如:
<service behaviorConfiguration="SendStreamServiceBehavior"
name="SendStreamService">
<endpoint address=" http://localhost:5504/WebSite2/ISendStreamService "
binding="wsHttpBinding" bindingConfiguration="MTMOBinding"
contract="ISendStreamService">
</endpoint>
<bindings>
<wsHttpBinding>
<binding name="MTMOBinding" messageEncoding="Mtom">
</wsHttpBinding>
</bindings>
</service>

『貳』 WCF中使用MTOM方式傳送文件的問題

應該不需要!~~~

因為上傳控制項是伺服器控制項 所有操作都在伺服器端進行 客戶端只是上付給一個上傳的地址而已!

『叄』 wcf技術能否支持大批量文件傳輸

支持,只要幫定的協議恰當,對封包大小限制合理,就可以大批量傳問題和傳大容量文件.
而且WCF支持Stream傳輸文件.

『肆』 WCF文件傳輸出錯解決方法怎麼解決

nfo不是安裝文件.nfo全稱是information(信息)
是一個向readme.txt的說明文檔
實際上他的歷史要比readme要久遠的多
一般是游戲製作商或代理商發的,裡面有一些基本的信息,還有一些有趣的文字元號拼圖
好多東西都有nfo文檔,像電影...
你要玩游戲的話,跟那個沒多大關系的.
你要想看下一個叫做DAMN_NFO_Viewer_的軟體看.
還有win7好多游戲不兼容啊,用win7要放棄好多優秀的游戲啊

『伍』 silverlight將數據傳到WCF,由WCF將數據導入到word、excel,,然後將文件傳回到客戶端,求高手啊

代碼已發送到你的郵箱,請採納,謝謝!

『陸』 Silverlight+WCF 如何實現文件上傳和下載功能

WCF上傳一次只能傳16K,速度不理想,理想的方案是使用HTTP上傳,可以參照這個開源項目:http://slfileupload.codeplex.com/

『柒』 C# WCF與資料庫如何連接到winform程序上

wcf 30rmb幫寫 私信

『捌』 Web Service和WCF的到底有什麼區別

Web Service是早期的技術實現了,也是soap的東西,採用的主要是http協議,假如是在C#上開發的話,需要寄宿在IIS上來實現。

WCF的話是相對較新的技術,裡面的basichttpbinding可以跟以前的ws進行通信,並且集成了大部分的通信協議(幾種http協議的實現以及net.Tcp實現、msmq、命名管道等實現),另外寄宿的宿主可以是命令行控制台、IIS、桌面程序等。

差別的話,感覺有這以下幾點[針對C#來說的]。

  1. ws的話,編程模型沒有wcf的那麼好,具體的實現差別建議網路下,個人覺得wcf比較好。wcf可以用契約的介面方式來進行實現,而ws的話主要是通過繼承WebService的類來實現的,方法上添加WebMethod特性,WCF的話是通過服務契約來聲明(可以是介面也可以是類對象)

  2. ws的話通用性比較強,跟java等ws也可以進行互相通信,然後假如是wcf發布的服務,除了basicHttpBinding這種綁定之外,其餘的幾種綁定基本上不能作為互相通信。例如命名管道跟net.Tcp都是,值得說的是這里的net.Tcp跟原生的tcp是不一樣的,內部實現上參考tcp的可靠連接機制進行了應用層的一套實現。

  3. 另外一點就是服務引用跟web引用上的,這個嚴格來說不能屬於兩者的區別,只是.net版本的區別,主要是針對客戶端對服務端發布好的服務進行的引用,服務引用生成的時候,會在配置文件上存在一份配置項,可以進行ABC終結點的配置,假如是web引用的話,會在setting中添加上一個硬編碼的地址。建議用服務引用。

  4. 還有一個就是客戶端調用服務端開發的時候,webservice的話,基本上只能通過服務端發布的地址來進行引用[應用的方式可以參考點3],或者通過服務端提供的wsdl文件來進行引用(該種方式一般比較少,因為需要提供文件,而不是通過公開的方式來進行介面的提供,無法應對服務變更後發布問題,但是確實有這個情況的存在)。而wcf的話,還存在可以通過提供契約文件(就是聲明了ServiceContract的那個介面文件)來進行服務的調用。

  5. 在介面層面的話,凡是IList<class T>以及IDictionary<class T>這一類的泛型實現都會在進行服務引用的時候,都會轉換為數組的,例如void F(IList<int>)會在引用後成為void F(int[])這種方式,而才用點4提供的契約文件的話就能保持方法的原始聲明。

個人建議的話,假如是新開發的系統基本上都才用wcf比較好,一個是介面的思想,一個是假如需要轉換為其他協議的話可以比較方便,只需要通過配置文件修改下就可以[當前前提是沒有用到特定協議的特定屬性,例如服務回調,有些協議是不支持雙向通信的]。而且也需要考慮發布的服務是否需要公開給別的語言進行通信。


另外樓上說的性能在下降的話,我大概說明下:

基本上針對應用的開發都是基於socket的開發,傳統的socket開發的話,是需要自己去實現整個通信框架的,包括多線程處理,IOCP等的實現[基本上.net的非同步通信模型在內部實現都會綁定好,IOCP是一個非同步模型,自行網路],二進制流的編碼處理[網路傳輸都是通過二進制的,例如utf8到二進制的轉換],tcp無邊界消息的處理[udp的話沒有這個,但是包體的大小也是有限制],通信協議的約定處理[例如ws跟wcf是採用soap這種,各種ws的約定,例如多少個位元組表示數據流的長度、數據的檢驗,還是數據加密位,也包括數據的位移處理],數據上拋模型跟數據回復模型[接受到數據後是需要上拋給業務層去進行處理的,然後也需要回復給客戶端,不過也不一定是這樣,看需求],還有各種針對性的處理,例如客戶端socket的保存[有可能對長期不適用的套接字要進行自動斷開的業務]。類似wcf這種東西的話,還有序列化跟反序列化的情況[序列化跟反序列化是性能開銷比較大的,例如序列化是通過反射來實現的,反射又是跟程序集的元數據有關的,屬於運行時行為],假如是自己實現tcp通信模型,就不一定會有序列化跟反序列化的通信模型了,而且wcf為了讓通信跟本地調用那樣以及標準的方面,位元組流都是比較大的,這里也會增加通信的帶寬【好比自定義的協議4個位元組的數據包長度+1個位元組的加密壓縮位+N個數據包位+X個位元組的檢驗位,這種的話實際用到的位元組就比較少了,因為在數據包裡面,可以會用2個位元組表示協議頭,例如ox0A表示登錄介面,再用4個位元組表示登錄名,4個位元組表示密碼等】。以上是簡單的對socket跟wcfws等協議的差別說明。socket跟wcfws對比的話,socket性能是最高的,高並發高響應的時候,這里是有差距的,技術上的話,socket需要更加多的技術支持[開發周期長,對人員要求高],而wcf在應用層面上基本無難度,就是一些配置,出現問題也大部分可以通過網路來處理。另外一個就是託管語言本身的問題,GC這塊的,GC回收的時候,是需要掛起堆棧上的線程的,而且GC的線程優先順序比你所能創建的所有線程的優先順序都要高,等GC執行完畢的時候才能去執行你的線程,wcf在堆對象上申請的空間也會更加多,自然導致GC會受到的概率也會更加大,這里也會可能導致wcf性能不如socket。基本上來說,C#的類都是引用對象,都是堆申請的,在引用計數超出的時候,都會被下一個GC[]操作去回收,真是個奇葩的事情。


總之,在ws跟wcf之間選擇的話,個人覺得優先選擇wcf好點。

如果是對性能要求較高[高並發等],或者是長連接再或者是需要用到UDP這種的話,就基本上無法用wcf跟ws這種了,wcf是沒有udp協議的,http協議也只是在tcp協議下的上層協議,底層發送的數據包跟實作是不通的。另外對於長連接,雖然wcf提供了類似回調這種情況機制,只是個人不推薦使用在這種長連接的場合下。


純手打,哎,晚上睡不著。。。。 樓主採納了吧

『玖』 基於TCP協議的WCF傳輸大文件怎麼出現進度條

基於TCP協議的WCF傳輸大文件如何出現進度條
RT.
比如傳輸50M的文件,
我能顯示個進度條 2000Kb of 5000Kb 已傳輸40%.
有回復了加分.

------解決方案--------------------
不建議用WCF做文件傳輸
參考以下代碼(VS2008下測試通過)
Service端:
C# codeusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.IO;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
namespace FSDownloadService
{
[MessageContract]
public class MyFileInfo
{
[MessageHeader]
public string FileName;
[MessageHeader]
public long FileSize;
[MessageBodyMember]
public Stream Stream;
public MyFileInfo() { }
public MyFileInfo(Stream stream, string fileName, long fileSize)
{
this.Stream = stream;
this.FileSize = fileSize;
this.FileName = fileName;
}
}

[MessageContract]
public class DownloadFileRequest
{
[MessageBodyMember]
public readonly string FileName;
public DownloadFileRequest() { }
public DownloadFileRequest(string fileName)
{
this.FileName = fileName;
}
}
[ServiceContract]
public interface IFileManager
{
[OperationContract]
MyFileInfo DownloadFile(DownloadFileRequest request);
}
[ServiceBehavior( = true)]
public class MyService : IFileManager
{
public MyFileInfo DownloadFile(DownloadFileRequest request)
{
FileInfo fi = new FileInfo(request.FileName);
MyFileInfo result = new MyFileInfo(File.OpenRead(request.FileName), request.FileName, fi.Length);
return result;
}
}

public class MyHost
{
static ServiceHost host = null;
public static void Open()
{
string baseAddress = "net.tcp://localhost:2008/FileService";
host = new ServiceHost(typeof(MyService), new Uri(baseAddress));
host.AddServiceEndpoint(typeof(IFileManager), GetTcpBinding(), "");
host.Open();
}
public static void Close()
{
if (host != null && host.State == CommunicationState.Opened)
{
host.Close();
}
host = null;
}
public static Binding GetTcpBinding()
{
NetTcpBinding binding = new NetTcpBinding();
binding.TransferMode = TransferMode.Streamed;
binding.MaxReceivedMessageSize = int.MaxValue;
return binding;
}
}
}

『拾』 如何將WCF服務發布到IIS中去VS2010版

第一步,我們在剛剛創建完的解決方案里,再添加一個WebApplication的項目取名叫做「WebServicePerson」

第二步,給WebServicePerson這個項目添加一個.SVC的文件,取名叫做「PersonService」

接下來呢,將創建項目時自帶的文件夾和.aspx文件都刪除掉(如下圖)然後打開 PersonService.svc 文件,我們需要將文件修改如下。

<% @ ServiceHost Language = "C#" Debug = "true" Service = "WCFService_Library2010.PersonService" %>

Service = "WCFService_Library2010.PersonService"是需要自己定義的,服務指向那個WCF的服務庫

第三步,非常重要絕對不能忽略,就是要將WCF服務引用到當前的項目中來。

第四步,經過上面三步的操作項目基本已成成型了,接下來只需要最後一步了,那就是配置Web.Config. 自己手寫去配置Web.config是非常痛苦的,所幸微軟給我我們提供了非常便捷的配置功能「Edit WCF Configuration」

進入配置界面後,我們發現Services下面並沒有任何節點,需要我們自己去新建一個,可以點擊「Create a New Service...」去創建
去選擇,我們剛剛創建的 WCF Service Library的服務。


一路next往下。
這一步很重要的,因為之前我們已經添加了一個.svc的文件PersonService並且已經配置好了Service的內容,所以系統自動已經在Service Behaviors下面創建了一個PersonService的節點。

熱點內容
機械硬碟的存儲速度優於固態硬碟 發布:2024-04-26 16:02:13 瀏覽:117
訊捷壓縮器 發布:2024-04-26 16:02:08 瀏覽:268
安卓藍牙耳機丟了如何找回 發布:2024-04-26 15:36:13 瀏覽:540
win7最近打開文件夾 發布:2024-04-26 15:23:00 瀏覽:555
演算法筆談 發布:2024-04-26 15:14:34 瀏覽:284
技算計編程 發布:2024-04-26 14:43:42 瀏覽:140
開普票密碼區和備注是什麼意思 發布:2024-04-26 14:43:31 瀏覽:852
吃雞安卓和蘋果如何加好友 發布:2024-04-26 14:39:10 瀏覽:836
centos編譯命令 發布:2024-04-26 14:18:04 瀏覽:654
網路編程畢設 發布:2024-04-26 14:13:10 瀏覽:208