2010-05-21 82 views
3

我正在使用Sql服務器文件流類型將大型文件存儲在後端。我正在嘗試使用WCf將文件傳輸到客戶端。如何使用SQL文件流式傳輸win32 API並支持WCF流式傳輸

我能夠使用SQLFileStream(API)獲取文件的句柄。然後我嘗試返回這個流。我在客戶端實現了數據分塊以從流中檢索數據。

我可以爲常規文件流和內存流做到這一點。此外,如果我轉換然後sqlfilestream到內存也是可行的。唯一不行的是當我嘗試返回sqlfilestream時。我究竟做錯了什麼。

我已經嘗試nettcpbinding與流啓用和http綁定與MTOM編碼。

這是我的錯誤信息獲取:


Socket連接被中止。這可能是由於處理你的消息或遠程主機超出接收超時的錯誤或底層網絡問題引起的。本地套接字timneout爲00:09:59 ....

這是我的示例代碼

 RemoteFileInfo info = new RemoteFileInfo(); 
     info.FileName = "SampleXMLFileService.xml"; 

     string pathName = DataAccess.GetDataSnapshotPath("DataSnapshot1"); 

     SqlConnection connection = DataAccess.GetConnection();    

     SqlTransaction sqlTransaction = connection.BeginTransaction("SQLSileStreamingTrans"); 
     SqlCommand command = new SqlCommand(); 
     command.Connection = connection; 
     command.Transaction = sqlTransaction; 
     command.CommandText = "SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()"; 

     byte[] transcationContext = command.ExecuteScalar() as byte[]; 

     SqlFileStream stream = new SqlFileStream(pathName, transcationContext, FileAccess.Read); 

// byte [] bytes = new byte [stream.Length]; // stream.Read(bytes,0,(int)stream.Length);

// Stream reeturnStream = stream; // MemoryStream memoryStream = new MemoryStream(bytes);

 info.FileByteStream = stream; 

     info.Length = info.FileByteStream.Length; 

     connection.Close(); 

     return info; 

    [MessageContract] 
    public class RemoteFileInfo : IDisposable 
    { 
     [MessageHeader(MustUnderstand = true)] 
     public string FileName; 

     [MessageHeader(MustUnderstand = true)] 
     public long Length; 

     [MessageBodyMember(Order = 1)] 
     public System.IO.Stream FileByteStream; 

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

任何幫助表示讚賞

回答

2

我剛剛解決了這個對我的情況。

我的WCF服務設置爲InstanceContextMode.PerCall。

當我請求流時,我必須保持事務/連接處於打開狀態,直到客戶端使用該對象。它通過服務的Dispose方法完成(如果您實現了IDisposable,WCF將自動爲您調用Dispose)。

對我來說就像一個魅力,這個流在客戶端讀取沒有問題。

+0

解決了我的問題!只是爲了讓任何人都不清楚,拔出所有使用WCF流媒體示例的使用語句(以確保正確處理對象),並將它們處理到服務處理函數(實現IDisposable。 – Sam 2013-11-22 14:21:03

+0

此VB.Net示例執行什麼操作你需要 - http://petermeinl.wordpress.com/2012/02/20/managing-blobs-using-sql-server-filestream-via-ef-and-wcf-streaming/,很容易轉換爲C#,因爲我有,如果任何人需要幫助,只需給我發一條消息/評論,因爲我知道服務錯誤可以修復多麼令人沮喪! – Sam 2013-11-22 14:22:16