c# - 从 MVC Web 应用程序访问共享文件夹被拒绝

标签 c# asp.net-mvc excel iis file-io

我有一个 MVC Web 应用程序,它使用模板 .xlt 和 .rpt 生成 Excel 和 PDF 报告(使用 Crystal),当我将模板放入 Web 服务器本身时,它会毫无故障地生成报告,但一旦我放置模板在远程位置,然后我收到“访问被拒绝”错误,这是我通过进程监视器发现的,下面的屏幕截图

enter image description here

当我通过服务器上的资源管理器手动浏览远程文件夹时,一切正常,我可以打开我需要的文件,它只是在服务器读取文件时引发访问被拒绝错误。我的 Web 应用程序正在使用集成管道中的 ApplicationPoolIdentity。身份验证是通过模拟和 Windows 身份验证进行的。甚至令人困惑的是,运行 Excel 模板的用户是我自己,但访问被拒绝,而用于生成 PDF 的用户是 IIS Apppool。

有谁知道如何解决访问被拒绝的问题,我已经尝试让所有用户完全访问该文件夹,但仍然不起作用。

其他信息

我使用的是 IIS 7.5,我还检查了共享所在的文件服务器,在事件日志中注册的用户不是我,但具有以下详细信息

An account was successfully logged on.

Subject:
    Security ID:        NULL SID
    Account Name:       -
    Account Domain:     -
    Logon ID:       0x0

Logon Type:         3

New Logon:
    Security ID:        ANONYMOUS LOGON
    Account Name:       ANONYMOUS LOGON
    Account Domain:     NT AUTHORITY
    Logon ID:       0x90eb7c7
    Logon GUID:     {00000000-0000-0000-0000-000000000000}

Process Information:
    Process ID:     0x0
    Process Name:       -

Network Information:
    Workstation Name:   MYWEBSERVER
    Source Network Address: 10.10.10.01
    Source Port:        00000

Detailed Authentication Information:
    Logon Process:      NtLmSsp 
    Authentication Package: NTLM
    Transited Services: -
    Package Name (NTLM only):   NTLM V1
    Key Length:     128

更新

我需要在这种情况下使用ApplicationPoolIdentity,因此我正在寻找仍然可以使用ApplicationPoolIdentity的解决方案。

另一个更新

我尝试了下面的@Davids 建议,现在我收到了相同的错误消息

System.Runtime.InteropServices.COMException (0x800A03EC): Microsoft Excel cannot access the file '\MyServer\Templates\MyTemplate.xlt'. There are several possible reasons:

• The file name or path does not exist. • The file is being used by another program. • The workbook you are trying to save has the same name as a currently open workbook. at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad) at Ci.Infrastructure.Reporting.ReportProviderExcel.RunReport()

最佳答案

我相信您的问题是因为应用程序池需要配置为作为域帐户或网络服务帐户运行。

如果您选择后者,您需要向 '<domainname>\<machinename>$' 授予权限。如果您选择作为特定帐户运行,那么您需要向该用户授予权限。

您已经授予每个人访问权限,因此这应该只是更改应用程序池用户的情况,但一旦您使其正常工作,我建议您将其限制为特定帐户。

以下链接将为您提供更多信息:

http://www.iis.net/learn/manage/configuring-security/application-pool-identities

关于c# - 从 MVC Web 应用程序访问共享文件夹被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13168268/

相关文章:

javascript - 从 Javascript 发布到 ASP.NET 中的 Controller 的 DateTime 结果为 null (01/01/0001)

c# - MVC 路由 .net 核心

string - 应该是VBA中的简单循环程序

c# - 将 POCO 对象类和 DBContext 从 Entity Framework 6 模型中分离出来

c# - 在下游生成新的 Windows 窗体时如何使用 DI?

asp.net-mvc - 使用 TFS 和 MSBuild 自动发布构建,无需调试文件和 Web.config 转换

excel - 如何将分配为字符串的答案转换回 VBA 中的长变量?

c# - 使用 NPOI 将 Excel 单元格区域格式化为表格

c# - 如何在win窗体中设置垂直滚动条

c# - 制作独立于客户端平台的网络服务