1

在我的 WCF 服务中,我尝试从具有 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”。

4

2 回答 2

0

在 WebApi 中有这样的东西,PushStreamContent它允许将所有事务的东西委托给异步 lambda,不知道 WCF 中是否有类似的东西,但以下方法可能会有所帮助:

http://weblogs.asp.net/andresv/archive/2012/12/12/asynchronous-streaming-in-asp-net-webapi.aspx

于 2013-07-02T16:54:13.043 回答
-1

您不能将 SQLFileStream 流式传输回客户端,因为它只能在 SQL 事务中读取。我认为您使用 MemoryStream 的解决方案是解决问题的好方法。

我有一个类似的问题,每次使用新的内存流时都担心大对象堆。我想出了在磁盘上使用临时文件而不是内存流的想法。我们现在在几个项目中使用这个解决方案,效果非常好。

有关示例代码,请参见此处: https ://stackoverflow.com/a/11307324/173711

于 2013-05-03T08:48:40.137 回答