Tema: SQL Server filestream
Autorius: Mindaugas
Data: 2012-02-20 18:19:48
Sveiki gyvi

Yra tokia situacija: yra vienas serveris su MS Windows Server 2008 R2 
Enterprise Edition ir SQL Server 2008 R2 Expres Edition su įjungtu 
FileStream'u(Full access enabled). Yra kitas serveris su Windows Server 2003 
Standart Edition ir IIS 6.0 su 4 Framework'u. Abu serveriai yra tame pačiame 
domene.

Bandant iš antro serverio pasiekti filestream'ą, gaunu klaidą:

System.ComponentModel.Win32Exception (0x80004005): Access is denied at 
System.Data.SqlTypes.SqlFileStream.OpenSqlFileStream(String path, Byte[] 
transactionContext, FileAccess access, FileOptions options, Int64 
allocationSize) at System.Data.SqlTypes.SqlFileStream..ctor(String path, 
Byte[] transactionContext, FileAccess access, FileOptions options, Int64 
allocationSize) at System.Data.SqlTypes.SqlFileStream..ctor(String path, 
Byte[] transactionContext, FileAccess access) at isakymas.Page_Load(Object 
sender, EventArgs e) in C:\Inetpub\www\failas.aspx.vb:line 39

Kaip traukiu filestreame'ą:
sql = "select failas.PathName() as kelias, failo_vardas from vw_failai where 
failai_id = '" + id + "'"
            If con.State = ConnectionState.Closed Then
                con.Open()
            End If
            Dim sql_tran As SqlTransaction = con.BeginTransaction
            Dim cmd As New SqlCommand(sql, con, sql_tran)
            Dim dr As SqlDataReader
            Try
                dr = cmd.ExecuteReader
                If dr.HasRows Then
                    dr.Read()
                    Dim kelias As String = dr("kelias").ToString
                    Dim failo_vardas As String = dr("failo_vardas").ToString
                    dr.Close()
                    sql = "SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()"
                    cmd = New SqlCommand(sql, con, sql_tran)
                    Dim sqlcontext As Byte() = CType(cmd.ExecuteScalar, 
Byte())
                    Dim filestream As SqlFileStream = New 
SqlFileStream(kelias, sqlcontext, IO.FileAccess.Read) '39 eilute - cia 
įvyksta klaida
                    Dim buffer As Byte() = New 
Byte(CInt(filestream.Length) - 1) {}
                    filestream.Read(buffer, 0, filestream.Length)
                    filestream.Close()
                    sql_tran.Dispose()
                    Response.AddHeader("Content-disposition", "attachment; 
filename=" + failo_vardas)
                    Response.ContentType = "application/octet-stream"
                    Response.BinaryWrite(buffer)
                End If
                If Not dr.IsClosed Then
                    dr.Close()
                End If
            Catch ex As Exception
                Response.Write("<p>" + ex.ToString + "</p>")
                If Not dr.IsClosed Then
                    dr.Close()
                End If
                sql_tran.Dispose()
            End Try
            con.Close()

connection string:
connectionString="Data Source=W2008_WWW;Initial Catalog=failai_db;Integrated 
Security=SSPI"

web.config:
<authentication mode="Windows"></authentication>
  <authorization>
       <deny users="?"/>
  </authorization>
  <identity impersonate="true"/>

Viskas tas pats paleistas pirmąjame serveryje (t.y. lokaliai) veikia be 
jokių klaidų.

Kur ieškot sliekų?

Mindaugas