- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经设置了一个支持 FILESTREAM 的 SQL 数据库,并且正在尝试通过 WebAPI 将使用 SqlFileStream 从数据库中检索到的文件流式传输到浏览器。
由于某种原因它不起作用,但我没有收到正确的错误消息。浏览器只是中止了连接,Fiddler 也没有显示任何有用的信息,而且在 VS 中似乎没有抛出任何错误。
public HttpResponseMessage Get(Guid id)
{
if(id == null || id == Guid.Empty)
return Request.CreateResponse(HttpStatusCode.BadRequest);
try
{
FileStreamContext fsc = null;
Document document = null;
using(var transaction = new TransactionScope())
using (var db = new MyEntities())
{
try
{
fsc = db.Database.SqlQuery<FileStreamContext>("SELECT [File].PathName() AS InternalPath, GET_FILESTREAM_TRANSACTION_CONTEXT() AS TransactionContext FROM Document WHERE id={0}", id).First();
}
catch (Exception e)
{
Debug.Print(e.ToString());
}
document = db.Documents.Where(doc => doc.ID == id).Single();
var fileStream = new SqlFileStream(fsc.InternalPath, fsc.TransactionContext, FileAccess.Read);
HttpResponseMessage response = new HttpResponseMessage();
response.Content = new StreamContent(fileStream);
//response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
//response.Content.Headers.ContentDisposition.FileName = document.FileName;
response.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(document.ContentType);
return response;
}
}
catch (Exception e)
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
}
我怀疑 TransactionScope 提前关闭可能是个问题?不确定为什么我没有收到任何错误消息。
通过 WebApi 流式传输 SqlFileStream 的正确方法是什么?
最佳答案
不是将内容设置为 StreamContent
,您是否尝试读取 Controller 中的 fileStream
,将其放入 byte
数组中,然后使用 ByteArrayContent
设置内容?
var fileStream = new SqlFileStream(fsc.InternalPath, fsc.TransactionContext, FileAccess.Read);
byte[] fileContent = fileStream.ReadFully(); // you will need to implement ReadFully
HttpResponseMessage response = new HttpResponseMessage();
response.Content = new ByteArrayContent(fileContent);
对于 ReadFully
实现,here is a link to a Jon Skeet method我用过的。
而且我怀疑您关于过早关闭连接的说法是正确的。您将 DbContext
/ObjectContext
很好地包裹在 using
block 中,但我认为这就是问题所在。该上下文在 Controller 返回 HttpResponseMessage
后被释放,但响应只能访问流——它仍然需要读取流并将其转换为 byte[]
在传递回浏览器或客户端之前。当您使用 MemoryStream
等时,这通常会自动发生,因为框架仍然可以访问流以读取其内容。但在这种情况下,您将在读取流之前处理 SQL 连接。
另一种解决方案是为您的 DbContext
使用依赖注入(inject),而不是在操作方法中更新它。如果您将 IoC 容器设置为在 HTTP 请求结束时自动处理上下文,那么当框架将 StreamContent
转换为 时,它应该仍然可用(未处理) byte[]
并通过网络将其推回。
关于asp.net - 通过 WebAPI 流式传输 SqlFileStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18129311/
我正在使用 SqlFileStream 将文件存储在数据库中,但是在插入新记录时我遇到了一个我似乎无法解决的小问题!问题在于我需要在插入记录时创建一个临时文件以提供将实际文件数据流式传输到的文件路径。
我将 Filestream 文档保存在 NTFS 中。每次我尝试使用下面的 block 访问它们时,我都会在 Image.FromStream 行上收到“参数无效”错误消息。这与FS文件夹中存储的文件
我正在提取 SQL 文件表中文件的内容。如果我不使用并行,则以下代码有效。 同时(并行)读取 sql 文件流时出现以下异常。 The process cannot access the file sp
我已经设置了一个支持 FILESTREAM 的 SQL 数据库,并且正在尝试通过 WebAPI 将使用 SqlFileStream 从数据库中检索到的文件流式传输到浏览器。 由于某种原因它不起作用,但
我正在尝试将文件插入到使用 SQL 文件流的数据库中。当我尝试初始化将插入的 SqlFileStream 对象时,我收到一个文件异常,指出找不到网络路径。 有问题的代码如下: using (SqlFi
我有一个 WCF 服务,用户可以从中请求大型数据文件(存储在启用了 FileStream 的 SQL 数据库中)。这些文件应该被流式传输,而不是在发送之前加载到内存中。 所以我有以下方法应该返回一个流
我遇到了这个异常: An invalid parameter was passed to the function 尝试从 SqlFileStream 创建新实例时。代码: var fileStrea
我在 Windows 7(版本 6.1 Build 7601:Service Pack 1)和 Visual Studio 2010 上安装了 SQL Server Express 2008 SP1。
我有以下场景: 我已经使用 FILESTREAM 成功地将我的文件(各种扩展名)保存到我的 sql server 数据库中。这些可以是任何东西,从图像到 word 文档、pdf 等。 现在我想检索它们
我正在尝试使用 WCF 服务中的 SqlFileStream 对象来获取 SQL Server 2012 FileTable 中特定文件的句柄。使用这段代码,我能够像您期望的那样获得路径和事务上下文,
我注意到 .NET Core 不支持 SqlFileStream。但是然后阅读它可能在 3.0 中可用?我在 .NET 经典中有一些示例代码。 基本上,我试图以某种方式将数据从 C# 中的 SQL 命
我是一名优秀的程序员,十分优秀!