来自共享驱动器的 C# System.IO.File.Copy 在本地主机上工作,但在服务器上拒绝访问该路径

C# System.IO.File.Copy from shared drive works on localhost but access to the path is denied on server

我想将 pdf 从共享文件夹复制到项目文件夹。所以我使用 System.IO.File.Copy:

System.IO.File.Copy(@"\netstore\IT\SIGN2454.pdf", "C:\inetpub\wwwroot\myaspmvcwebapisite\temp2454.pdf", true);

当我 运行 在我的机器上本地应用程序时文件复制,但是当我将它发布到服务器并转到该站点时,我得到:

signature-service.ts:120 {"$id":"1","Message":"An error has occurred.","ExceptionMessage":"Access to the path '\\netstore\IT\SIGN\112454.pdf' is denied.","ExceptionType":"System.UnauthorizedAccessException","StackTrace":"   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)\r\n   at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost)\r\n   at System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite)\r\n   at api.valbruna.local.Controllers.ValShip.SignatureController.Post(Int32 id)"}

如何授予网站访问权限以访问该文件位置?

请注意:

我尝试过的:

我查看了有关堆栈溢出的其他帖子 (Access to the path is denied),但大多数答案都说要授予对 IIS_USRS 的访问权限,而我已授予每个人访问权限,所以这是行不通的。

---更新1---

@Chris Pratt 我已经根据您提供的 link 更新了我的 IIS 设置。

  1. 标识字段已从 NetworkService 更新为 ApplicationPoolIdentity。

  1. 我授予了 <domainname>\<machinename>$
  2. 的完全访问权限

---更新2---

@jp2code 我打开了网络发现,但我仍然遇到同样的错误。

---更新3---

作为使用 Impersonation class 访问共享文件夹的临时解决方法:

using (new Impersonator("username", System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName, "password"))
{
    // code that executes under the new context.
    sizingDoc.LoadFromFile(sigDocUrl);
}

您是说它在本地 IIS 或 Visual Studio (IIS Express) 中运行正常吗? IIS Express 在活动用户帐户下运行,但 IIS 在应用程序池的标识下运行。授予对 IIS_USRS 的访问权限对于本地目录就足够了,但是远程目录将需要身份验证,这意味着它将通过应用程序池的身份进行身份验证。 This article from Microsoft 可能会给你一些额外的指导,运行。

但是,无需自定义任何内容,应用程序池作为网络服务运行这一事实应该足以让您授予访问权限。网络服务通过机器账户授权(<domainname>\<machinename>$)。所以,如果你为该帐户授权网络共享,你应该是好的。