2013-05-02 54 views
1

在我的WCF服務WCF數據流SQLFileStream,我嘗試加載由具有FILESTREAM字段MS SQL表的文件,我嘗試把它作爲一個流回到的消息協定

 responseMsg.DocSqlFileStream = new MemoryStream(); 

     try 
     { 
      using (FileStreamDBEntities dbEntity = new FileStreamDBEntities()) 
      { 
       ... 
       using (TransactionScope x = new TransactionScope()) 
       { 
        string sqlCmdStr = "SELECT dcraDocFile.PathName() AS InternalPath, GET_FILESTREAM_TRANSACTION_CONTEXT() AS TransactionContext FROM dcraDocument WHERE dcraDocFileID={0}"; 
        var docFileStreamInfo = dbEntity.Database.SqlQuery<DocFileStreamPath>(sqlCmdStr, new object[] { docEntity.dcraDocFileID.ToString() }).First(); 

        SqlFileStream sqlFS = new SqlFileStream(docFileStreamInfo.InternalPath, docFileStreamInfo.TransactionContext, FileAccess.Read); 
        sqlFS.CopyTo(responseMsg.DocSqlFileStream); 

        if(responseMsg.DocSqlFileStream.Length > 0) 
         responseMsg.DocSqlFileStream.Position = 0; 

        x.Complete(); 
       } 
      } 
      ... 

我想知道最好的方法是將SQLFileStream傳遞迴消息合約以利用流式傳輸。目前我將SQLFilEStream複製到內存流中,因爲我在WCF跟蹤中收到一條錯誤消息,內容如下:類型'System.Data.SqlTypes.SqlFileStream'不能被序列化。

回答

-1

您不能將SQLFileStream流式傳輸回客戶端,因爲它只能在SQL事務中讀取。我認爲你使用MemoryStream的解決方案是處理這個問題的好方法。

我有一個類似的問題,並擔心每次使用新的內存流時大對象堆。我提出了在磁盤上使用臨時文件而不是內存流的想法。我們現在在幾個項目中使用這個解決方案,它的工作非常好。

看到這裏的示例代碼: https://stackoverflow.com/a/11307324/173711

+0

感謝您的想法和分享的鏈接您的解決方案,可能是我把它看作是現在,我創建的消息合約是我IDisposable接口和Dispose方法可以幫助釋放內存流(其中ac在通話記錄中讀取後,在msg合同中流轉一個Stream)。但你的臨時文件解決方案絕對是一種方法。 – Farhad 2013-05-03 17:42:29