当前位置: 首页 > 编程语言 > C#

如何在不缓冲的情况下将文件从数据库异步传输到webclient分享

时间:2023-04-10 14:11:21 C#

C#学习教程:Howtoasynchronoustransferfilesfromdatabasetowebclientwithoutbuffering我正在使用SqlDataReader.GetStream()从数据库中获取流。但是,我不确定当webapi完成从流中读取时如何连接处理/关闭数据库连接。有样品吗?您可以编写一个包装器流,它从底层流中读取数据直到它耗尽,然后处理所有相关资源(如SqlConnection)。我不是WebAPI专家,因此可能有更优雅的方法来执行此操作。但无论如何,这适用于对流的标准WebAPI支持。您可以在WebAPI中执行类似的操作。这里我使用PushStreamContent连接到数据库并检索Sql流。然后我直接将此sql流复制到响应流。在WebAPI中,当您使用PushStreamContent时,客户端将收到分块传输编码的响应,因为您没有设置响应的内容长度。如果这对您来说没问题,您可以使用下面的示例。否则我会尝试看看是否有其他更好的方法来实现这一目标。注意:这是一个基于PushStreamContent和MSDN关于从sqlserver检索二进制数据的文章的快速示例。以上就是C#学习教程的全部内容:如何在不缓冲的情况下从数据库异步传输文件到webclient。如果对你有用,需要进一步了解C#学习教程,希望你多多关注——"api/values")]publicclassValuesController:ApiController{privateconststringconnectionString=@"yourconnectionString";[Route("{id}")]publicHttpResponseMessageGetImage(intid){HttpResponseMessageresp=newHttpResponseMessage();resp.Content=newPushStreamContent(async(responseStream,content,context)=>{awaitCopyBinaryValueToResponseStream(responseStream,id);});返回响应;}//应用程序使用新的异步功能从.NET4.5中的SQLServer检索大型BLOB回复写完了。使用(responseConnectionConnql=newSql(connectionString)){等待连接。打开异步();使用(SqlCommandcommand=newSqlCommand("SELECT[bindata]FROM[Streams]WHERE[id]=@id",connection)){command.Parameters.AddWithValue("id",imageId);//需要使用SequentialAccess行为执行读取器以启用网络流//否则ReadAsync会将整个BLOB缓冲到内存中,这可能导致可伸缩性问题甚至OutOfMemoryExceptions使用(SqlDataReaderreader=awaitcommand.ExecuteAccess.Execute(Reader)awaitreader.ReadAsync()){if(!(awaitreader.IsDBNullAsync(0))){using(Streamdata=reader.GetStream(0)){//将流从服务器异步复制到响应流awaitdata.CopyToAsync(响应流);}}}}}}//关闭响应流}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: