在我的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‘无法序列化。
发布于 2013-07-03 00:54:13
在WebApi中有PushStreamContent这样的东西,它允许将所有事务委托给异步lambda,不知道在WCF中是否有类似的东西,但以下方法可能会有所帮助:
http://weblogs.asp.net/andresv/archive/2012/12/12/asynchronous-streaming-in-asp-net-webapi.aspx
发布于 2013-05-03 16:48:40
您不能将SQLFileStream流式传输回客户端,因为它只能在SQL事务中读取。我认为你的MemoryStream解决方案是处理这个问题的好方法。
我也有类似的问题,每次使用新的内存流时,我都担心大对象堆。我想到了使用磁盘上的临时文件而不是内存流的想法。我们现在在几个项目中使用了这个解决方案,它工作得非常好。
https://stackoverflow.com/questions/16349414
复制相似问题