使用ASP.NET网站中的File.CreateFile将文件插入Sql Server 2012 FileTable时访问被拒绝

我有一个ASP.NET网站。 我想将文件上传到网站并将其保存到SqlServer 2012中的FileTable中。

上传后,我的网站代码有一个Stream对象,我想用它来保存

System.IO.File.Create() 

我去的时候可以在Windows资源管理器中访问FileTable

 \\ComputerName\FileStremShareName\FileStreamDirectoryName\FileTableName 

我可以使用Windows资源管理器在此文件夹中手动创建文件。 我也可以使用SQL将文件插入到File表中。 在这两种情况下,Windows资源管理器和SQL Server都按预期显示文件。

但是,如果我尝试使用System.IO.File.CreateFile在路径中创建文件,例如

 File.Create(\\\\ComputerName\FileStremShareName\FileStreamDirectoryName\FileTableName\myfile.jpg) 

我收到消息“访问路径'[路径]’被拒绝”

我假设这是因为我的IIS应用程序池标识无权读取/写入此位置。

通常,我会进入NTFS权限并分配对身份帐户的读/写访问权限,但我无法执行此操作,因为基础文件夹对我来说是隐藏的。

我已经考虑将我的Stream对象转换为字节数组并使用SQL将其插入到FileTable中,但这似乎效率低下,因为我必须首先将流转换为字节数组,然后将其传递给SQL。 这似乎是我解析我的文件数据两次以保存它一次。

是否可以使用File.Create或类似的内容在ASP.NET网站中写入文件表。 如果是这样,我该怎么做?

这是权限问题。 但是,权限不是通过NTFS授予的,而是通过SQL Server授予的。

默认情况下,应用程序池标识对您的数据库没有任何权限,因此必须更改。

  1. 为您的网站添加用于应用程序池标识的SQL Server登录。 例如“IIS APPPool \ MyAppPool”

    使用[主人]
    走
    使用DEFAULT_DATABASE = [MyDatabase]从WINDOWS创建登录[IIS APPPOOL \ myapppoolname]
    走
    
  2. 将用户添加到此登录将使用的数据库中

    使用[MyDatabase]
     CREATE USER [MyUserName] FOR LOGIN [IIS APPPool \ myapppoolname]
    
  3. 授予用户与数据库相关的权限

    使用[MyDatabase]
     GRANT INSERT TO [MyUserName]
     GRANT SELECT TO [MyUserName]
    授予[MyUserName]更新权限
    

我不确定这是否是所需的完整权限集,但我发现它足以让我能够保存新文件。

认可的答案对我不起作用。 这个链接的答案确实如此。

我的IIS服务器与sql数据库不在同一台服务器上,所以我必须确保IIS的应用程序池用户在sql server上作为windows用户存在,他们有相同的密码并且有一个sql窗口该帐户的用户。

我遇到过同样的问题。 以下答案适合我。

  1. 使用相同的密码在两台服务器上创建一个新帐户。
  2. 配置该帐户以运行IIS应用程序
  3. 在具有相应权限的该帐户的SQL Server中创建登录。