0

시나리오 : 최근 ASP.NET MVC 응용 프로그램에 파일을 데이터베이스에 업로드 할 수있는 구성 요소를 추가했습니다. 이러한 파일의 평균 크기가 2MB를 넘기 때문에 FILESTREAM을 사용하기로 결정했습니다. HttpPostedFileBase을 임시 파일에 저장하고 비즈니스 로직을 수행 한 다음 파일을 업로드합니다. 업로드가 끝나면 브라우저에서 파일을 볼 수있는 페이지로 사용자가 리디렉션됩니다. 아름답게SQL FILESTREAM breaking

public partial class File 
{ 
    public SqlFileStream Open(DocumentEntities db, FileAccess access) 
    { 
     var path = db.Database.SqlQuery<string>(
      @"SELECT FileData.PathName() FROM [File] WHERE DocumentID = @docID", 
      new SqlParameter("docID", DocumentID)).First(); 
     var context = db.Database.SqlQuery<byte[]>(
      @"SELECT Get_FILESTREAM_TRANSACTION_CONTEXT() FROM [File] WHERE DocumentID = @docID", 
      new SqlParameter("docID", DocumentID)).First(); 

     return new SqlFileStream(path, context, access); 
    } 
} 

이전에 업로드 된 파일을보기 작품 : 여기에

var DocContext = new DocumentEntities(); 
var dbFile = new File 
{ 
    DocumentID = Guid.NewGuid(), 
    Name = fileName, 
    Type = file.ContentType 
}; 
DocContext.Document.Add(dbFile); 
DocContext.SaveChanges(); 

using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) 
using (var sqlFS = dbFile.Open(DocContext, FileAccess.Write)) 
using (var tempFS = tempFile.OpenRead()) 
{ 
    tempFS.CopyTo(sqlFS); 
    scope.Complete(); 
} 

관련보기/다운로드 코드 :

public ActionResult File(Guid? id = null) 
{ 
    if (id == null) 
     return RedirectToActionPermanent("Index"); 

    return File(DocContext.Document.Find(id.Value) as File); 
} 

private ActionResult File(File file) 
{ 
    if (file == null) 
     throw new HttpException(404, "Unknown document type"); 

    var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead }); 
    Disposing += d => { scope.Complete(); scope.Dispose(); }; 

    var fs = file.Open(DocContext, FileAccess.Read); 
    Disposing += d => fs.Dispose(); 

    return new Misc.InlineFileStreamResult(fs, file.MimeType) { FileDownloadName = file.FileName, Inline = true }; 
} 

그리고 열기 방법을 여기에 관련 업로드 코드는 . 사용자가 업로드 한 파일 (최근?)을 보면 다음과 같은 예외가 발생합니다. The transaction operation cannot be performed because there are pending requests working on this transaction.

무슨 일 이죠?

업데이트 : 나는 SQL 시스템 관리자이기 때문에 파일을 업로드하고 잘 볼 수 있다고 가정합니다.

답변

0

데이터베이스 항목이 형식 열의 확장명 대신 MIME 형식을 사용하는 경우 IIS 및 web.config를 사용하여 파일 확장명을 추론했습니다. 그러나 일반 사용자에게는 web.config을 읽을 수있는 권한이 없습니다. 따라서 비 서버 관리 사용자가 확장자 대신 MIME 유형으로 저장된 파일을 보려고하면 내 루틴에서 사용 권한 예외가 발생하여 트랜잭션 연산 예외가 발생합니다. 아무 단서도.