FILESTREAM을 지원하는 SQL 데이터베이스를 설치했으며 WebAPI를 통해 SqlFileStream을 사용하여 데이터베이스에서 검색 한 파일을 브라우저로 스트리밍하려고합니다.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을 스트리밍하는 적절한 방법은 무엇입니까?
작동하는 동안 그것을 바이트 []로 읽는 것은 유혹적인 선택이 아닙니다. 그렇게하면 스트리밍의 이점을 완전히 잃어 버리며 대용량 파일을 처리 할 때 큰 문제가 발생합니다. – magnattic
TransactionScope 대신 CommitableTransaction을 사용하고 Controllers dispose 메서드에서 처리를 늦게 처리하여 문제를 해결했습니다. ("사용"블록을 사용하는 대신) 의존성 주입 솔루션에 대해 자세히 설명해 주시겠습니까? 그게 정확히 어떻게 작동할까요? 예를 들어 줄 수 있습니까? – magnattic
웹상에서 MVC 및 WebAPI 컨트롤러 생성자 주입을 사용하여 'DbContext'에 대한 제어 수명 범위의 종속성 주입/반전의 예가 많이 있습니다. 당신이 내 도움을 필요로해서는 안됩니다. – danludwig