从WCF服务返回SQLFileStream的干净方法是什么?
通过将SqlFileStream对象传回客户端,我们使用FileStream从WCF服务下载存储在SQLServer中的文档。 为此,我们将DB事务和服务中的连接保持为打开状态。 我们关闭客户端中的SqlFileStream从WCF服务返回SQLFileStream的干净方法是什么?,wcf,filestream,Wcf,Filestream,通过将SqlFileStream对象传回客户端,我们使用FileStream从WCF服务下载存储在SQLServer中的文档。 为此,我们将DB事务和服务中的连接保持为打开状态。 我们关闭客户端中的SqlFileStream 'Service Public Function GetDokumentStream(dokumentId As Integer) As System.IO.Stream Implements IDataService.GetDokumentStream Dim cnx
'Service
Public Function GetDokumentStream(dokumentId As Integer) As System.IO.Stream Implements IDataService.GetDokumentStream
Dim cnx = New SqlConnection(...)
cnx.Open()
Dim tran = cnx.BeginTransaction()
Dim cmd As New SqlCommand("Select Dokument.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() from Dokument where ID= @ID", cnx, tran)
cmd.Parameters.AddWithValue("ID", dokumentId)
Using rdr = cmd.ExecuteReader()
If rdr.Read() Then
Dim pathName = rdr(0).ToString()
Dim context = CType(rdr(1), Byte())
Dim sqlFileStream As New SqlFileStream(pathName, context, IO.FileAccess.Read)
Return sqlFileStream
Else
'...
End If
End Using
'Client
Dim sqlFileStream = _satDataService.GetDokumentStream(dokumentInfo.DokumentID)
Using fileStream As New IO.FileStream(fileName, IO.FileMode.OpenOrCreate)
sqlFileStream.CopyTo(fileStream)
sqlFileStream.Close()
End Using
我们必须实现一些东西来手动关闭服务中的连接,还是WCF基础设施会自动清理?
关闭客户端中返回的流可以吗?还是我们最好为实现IDisposable的流创建一个复杂类型
或者,我们可以将SQLFileStream复制到MemoryStrean,关闭连接并返回内存流:
Using cnx = New SqlConnection(...)
cnx.Open()
Using tran = cnx.BeginTransaction()
Dim cmd As New SqlCommand("Select Dokument.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() from Dokument where ID= @ID", cnx,
tran)
cmd.Parameters.AddWithValue("ID", dokumentId)
Using rdr = cmd.ExecuteReader()
If rdr.Read() Then
Dim pathName = rdr(0).ToString()
Dim context = CType(rdr(1), Byte())
Dim context1 = rdr(1)
Dim sqlFileStream As New SqlFileStream(pathName, context, IO.FileAccess.Read)
sqlFileStream.CopyTo(memoryStream)
_trace.InfoFormat("Returning file {0} size {1}bytes", pathName, memoryStream.Length)
memoryStream.Position = 0
Return memoryStream
Else
Throw New ApplicationException("Dokument File not found")
End If
End Using
End Using
End Using
此解决方案是否会在直接返回SqlFileStream的服务器上使用更多内存?
还是WCF在内部将SqlFileStream复制到内存中?您必须自己处理连接和事务。WCF不负责处理您的内部操作实施。作为参数传递或从操作返回的流为
第二个示例将把流中的所有数据加载到服务主机的内存中。这将破坏服务端流式处理的目的。我自己也遇到了这个问题,并围绕SqlFileStream创建了一个包装类,它使用泛型类型和反射,允许您将行映射到类型并访问FILESTREAM列 您不需要编写任何SQL语句,它都是使用映射信息在内部生成的 它还包装了连接和事务,以便在处理流之后,提交事务并处理连接,从而确保从WCF服务返回的安全性
它在上提供。好的,现在我确实知道如何处理流了。我怎样才能自己关闭连接?我的服务是InstanceContextMode.PerCall。在函数结束时关闭连接会引发错误套接字连接被中止。您可以尝试使您的服务成为一次性的,并在调用dispose时关闭连接默认实例提供程序在释放实例时关闭连接。