【发布时间】:2011-02-02 14:24:13
【问题描述】:
我有一个网页,允许用户将文件上传到网络共享。当我在本地(在 VS 2008 中)运行网页并尝试上传文件时,它可以工作!但是,当我将网站部署到网络服务器并尝试通过网页上传文件时,它不起作用!
在网络服务器上返回给我的错误说“访问路径 '\05prd1\emp\test.txt' 被拒绝。所以,很明显,这是一个权限问题。
网络共享配置为允许对我(NT 身份验证)和网络服务(这是 .NET 的默认帐户以及我们在 IIS 应用程序池中设置为该网站的默认用户的帐户)进行完全访问。
我在网络服务器上尝试过模拟和不模拟,但两种方法都不起作用,但两种方法都可以在我的本地机器上工作(换句话说,无论有没有模拟都可以在我的本地机器上工作)。
上传文件的代码如下。请注意,下面的代码包括模拟,但就像我上面所说的,我尝试过模拟和不模拟,但没有任何区别。
if (fuCourses.PostedFile != null && fuCourses.PostedFile.ContentLength > 0) {
System.Security.Principal.WindowsImpersonationContext impCtx;
impCtx =
((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();
try {
lblMsg.Visible = true;
// The courses file to be uploaded
HttpPostedFile file = fuCourses.PostedFile;
string fName = file.FileName;
string uploadPath = "\\\\05prd1\\emp\\";
// Get the file name
if (fName.Contains("\\")) {
fName = fName.Substring(
fName.LastIndexOf("\\") + 1);
}
// Delete the courses file if it is already on \\05prd1\emp
FileInfo fi = new FileInfo(uploadPath + fName);
if (fi != null && fi.Exists) {
fi.Delete();
}
// Open new file stream on \\05prd1\emp and read bytes into it from file upload
FileStream fs = File.Create(uploadPath + fName, file.ContentLength);
using (Stream stream = file.InputStream) {
byte[] b = new byte[4096];
int read;
while ((read = stream.Read(b, 0, b.Length)) > 0) {
fs.Write(b, 0, read);
}
}
fs.Close();
lblMsg.Text = "File Successfully Uploaded";
lblMsg.ForeColor = System.Drawing.Color.Green;
}
catch (Exception ex) {
lblMsg.Text = ex.Message;
lblMsg.ForeColor = System.Drawing.Color.Red;
}
finally {
impCtx.Undo();
}
}
对此的任何帮助将不胜感激!
【问题讨论】:
-
我没有太多有用的补充,除了我已经尝试过多次这样做。我从来没有设法让 IIS 处理从 ASP.Net 应用程序对网络共享的访问。不过,它会在开发服务器中正常工作。
-
您使用什么来在网络服务器上托管网站? IIS6 或 IIS7 还是别的什么?您是否尝试过在 IIS 上本地运行您的网站?
-
是的,我同意你的观点。这不是我第一次尝试解决这个问题。过去,我不得不做一些愚蠢的事情,比如将二进制文件写入数据库,然后从数据库中读取存储过程并将其重写到磁盘上的文件中。但是,我知道这样做是可能的,因为我使用了一些 Telerik 控件,这些控件允许人们在某些文本中嵌入图像文件,最终 Telerik 控件所做的是将图像文件写入预定义的网络分享。
-
@David - 抱歉,我错过了你的最后一个问题。不,我没有尝试在本地 IIS 上运行它。我会假设行为与网络服务器上的行为相同。但即使它成功了,我也不确定那会证明给我什么。有什么想法吗?
-
哇...看来我把所有人都难住了。
标签: .net file-upload impersonation