在我的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'。
答案 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