如何使用SQL文件流式传输win32 API并支持WCF流式传输

我正在使用Sql服务器文件流类型来在后端存储大文件。 我正在尝试使用WCf将文件传输到客户端。

我能够使用SQLFileStream(API)获取文件的句柄。 然后我尝试返回这个流。 我在客户端实现了数据分块以从流中检索数据。

我能够为常规文件流和内存流做到这一点。 此外,如果我转换然后sqlfilestream到内存也是可行的。 唯一不行的是当我尝试返回sqlfilestream时。 我究竟做错了什么。

我已经尝试使用启用流的nettcpbinding和使用MTOM编码的http绑定。

这是我得到的错误消息:


套接字连接被中止。 这可能是由处理您的消息或远程主机超出接收超时的错误或底层网络问题引起的。本地套接字timneout为00:09:59 ....

这是我的示例代码

        RemoteFileInfo info = new RemoteFileInfo();
        info.FileName = "SampleXMLFileService.xml";

        string pathName = DataAccess.GetDataSnapshotPath("DataSnapshot1");

        SqlConnection connection = DataAccess.GetConnection();            

        SqlTransaction sqlTransaction = connection.BeginTransaction("SQLSileStreamingTrans");
        SqlCommand command = new SqlCommand();
        command.Connection = connection;
        command.Transaction = sqlTransaction;
        command.CommandText = "SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()";

        byte[] transcationContext = command.ExecuteScalar() as byte[];

        SqlFileStream stream = new SqlFileStream(pathName, transcationContext, FileAccess.Read);

// byte [] bytes = new byte [stream.Length]; // stream.Read(bytes,0,(int)stream.Length);

// Stream reeturnStream = stream; // MemoryStream memoryStream = new MemoryStream(bytes);

        info.FileByteStream = stream;

        info.Length = info.FileByteStream.Length;

        connection.Close();

        return info;

    [MessageContract]
    public class RemoteFileInfo : IDisposable
    {
        [MessageHeader(MustUnderstand = true)]
        public string FileName;

        [MessageHeader(MustUnderstand = true)]
        public long Length;

        [MessageBodyMember(Order = 1)]
        public System.IO.Stream FileByteStream;

        public void Dispose()
        {
            if (FileByteStream != null)
            {
                FileByteStream.Close();
                FileByteStream = null;
            }
        }
    }

任何帮助表示赞赏


我刚刚解决了这个情况。

我的WCF服务设置为InstanceContextMode.PerCall。

当我请求流时,我必须保持事务/连接处于打开状态,直到客户端使用该对象。 它通过服务的Dispose方法完成(如果您实现了IDisposable,WCF将自动为您调用Dispose)。

对我来说就像一个魅力一样,这个流在客户端没有问题地被读取。

链接地址: http://www.djcxy.com/p/49141.html

上一篇: How to use SQL file streaming win32 API and support WCF streaming

下一篇: Submit a form with a button (HTML)