2010-10-07 75 views
2

我通過WCF發送大文件,並且我正在使用transferMode =「Streamed」以使其正常工作,並且工作正常。如何在使用WCF流式傳輸大文件時顯示反饋

事情有時候這些文件太大了,我想給客戶一些關於進度的反饋。

有沒有人有關於如何實現這一目標的解決方案/想法?

編輯:我不命令在任何一方(客戶端或服務器)讀取文件,如果我做了,我只能給流的讀取功能提供反饋。

EDIT2:我的代碼的一部分,以幫助別人瞭解我的問題

這裏的合同我

[OperationContract] 
    FileTransfer Update(FileTransfer request); 

和這裏的文件傳輸的定義

[System.ServiceModel.MessageContractAttribute(WrapperName = "FileTransfer", WrapperNamespace = "http://tempuri.org/", IsWrapped = true)] 
public class FileTransfer : IDisposable 
{ 
    [System.ServiceModel.MessageBodyMemberAttribute(Namespace = "dummy", Order = 0)] 
    public Stream FileByteStream; 

    public void Dispose() 
    { 
     if (FileByteStream != null) 
     { 
      FileByteStream.Close(); 
      FileByteStream = null; 
     } 
    } 

} 

所以,在我的服務(託管在IIS上)我只是有這樣的事情:

request.FileByteStream; 

和WCF本身讀取流,對吧?

我希望這有助於人們搞明白我的問題...請讓我知道如果你需要進一步的信息

+0

你怎麼不能命令閱讀? WCF將不會自己讀取流,您是否使用第三方組件? – 2010-10-08 13:05:00

回答

0

約增加總流大小定製SOAP頭(使用MessageContracts)什麼。然後你可以在客戶端處理數據流(例如在循環中讀取到已定義大小的緩衝區),並且可以在每個數據塊中通知客戶端預期大小情況下的處理增量。

+0

我喜歡這聽起來如何,但是,我不能做任何流操作... WCF照顧,我的服務開始處理(我猜)整個文件在服務器上後 – sebagomez 2010-10-07 20:34:32

+0

在這種情況下,我的解決方案不管用。它可用於下載流而不用於上傳。 – 2010-10-08 07:04:09

0

我現在看到的唯一方法是創建另一個操作,報告流操作讀取的字節數。這需要在服務器端激活會話和多線程,並實現來自客戶端的異步調用以及對「進度報告」操作的調用。

客戶端知道流的大小(假設客戶端是發件人),它可以從已知的總大小和服務器報告的大小中提取進度百分比。

編輯: 我的意見是在假設客戶端正在上傳數據的情況下工作的。所以服務器知道它已經從流中讀取了很多數據,而客戶端知道數據的大小。 如果服務器公開一個操作來報告迄今已讀取的數據量,則客戶端將能夠通過調用此操作來計算進度百分比。

+0

從@Ladislav回答。我沒有看到服務器如何告訴進度......這是我的問題的全部,它可能不是一個清晰的想法:( – sebagomez 2010-10-08 12:28:54

+0

我應該在中間添加一個新的行爲還是什麼? – sebagomez 2010-10-08 12:29:30

+0

服務器並沒有說明進展情況,它報告了迄今爲止通過另一項操作從客戶端讀取了多少內容。我相應地編輯了我的答案。 – 2010-10-08 13:02:26