WCF通过Message Contract传输SQLFileStream

时间:2013-05-02 23:33:18

标签: wcf

在我的WCF服务中,我尝试从MS SQL表中加载一个具有FileStream列的文件,并尝试将其作为流传回

        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'。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:-1)

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

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

请参阅此处查看示例代码: https://stackoverflow.com/a/11307324/173711