使用Response.WriteFile但不使用File.Copy的ASP.NET登录失败IOException?

时间:2009-09-21 18:36:01

标签: asp.net .net

我正在尝试将文件发送到位于远程主机上的浏览器(通过UNC)。

Web应用程序在模拟下运行,而App Pool则具有对远程主机的UNC目录具有完全访问权限的用户(通过匹配的凭据)。

我可以使用System.IO对象的File.Copy读取和写入UNC路径上没有问题的文件。但是,当我尝试

  Dim file As System.IO.FileInfo = New System.IO.FileInfo([UNCFilePath])
  Response.Clear()
  Response.AddHeader("Content-Disposition", "attachment; filename=" & file.Name.Replace(" ", "_"))
  Response.AddHeader("Content-Length", file.Length.ToString())
  Response.ContentType = "application/octet-stream"
  Response.WriteFile(file.FullName)

我得到了

System.IO.IOException: Logon failure: unknown user name or bad password

如果我通过File.CopyTo将文件复制到本地目录并从那里执行写文件,则可以正常工作。

我的主要问题是,除了解决这个问题之外,为什么File.Copy工作和File.Response不起作用?他们都不是在使用System.IO吗?

3 个答案:

答案 0 :(得分:1)

我建议在目标框上启用安全事件日志记录。并不总是清楚哪些帐户在通信中发挥作用。在这种情况下,即使您使用模拟,如果ASPNET机器帐户出现在图片中,我也不会感到惊讶。

在Windows XP Pro中启用安全事件日志记录:

  1. 转到控制面板 - > 管理工具 - > 本地安全政策
  2. 展开本地政策并查看审核政策文件夹
  3. 双击此处的任何项目以指示需要记录的内容
  4. 您可以转到控制面板 - >查看安全事件日志。 管理工具分组并双击事件查看器图标。

答案 1 :(得分:1)

感谢David的帮助。这向我展示了App Pool实际上并没有在正确的凭据下运行。

我想要吸取的教训是,在通过Response.WriteFile访问远程UNC文件时,不会使用ASP模拟(web.config)。相反,它使用应用程序池标识。

答案 2 :(得分:1)

我的代码适用于win server 2003 + iis6,但不适用于新服务器iis7.5。

我能够写,列出文件夹,但不能下载,当我这样做时,我检索“拒绝访问”错误。

我解决了问题的变化

  

Response.WriteFile(f.FullName));

  

Response.BinaryWrite(File.ReadAllBytes(f.FullName));