我正在尝试将文件发送到位于远程主机上的浏览器(通过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吗?
答案 0 :(得分:1)
我建议在目标框上启用安全事件日志记录。并不总是清楚哪些帐户在通信中发挥作用。在这种情况下,即使您使用模拟,如果ASPNET机器帐户出现在图片中,我也不会感到惊讶。
在Windows XP Pro中启用安全事件日志记录:
您可以转到控制面板 - >查看安全事件日志。 管理工具分组并双击事件查看器图标。
答案 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));