ASP.NET:System.UnauthorizedAccessException - 拒绝访问路径

时间:2008-12-02 10:29:19

标签: asp.net excel

我有一个ASP.NET Web应用程序,它执行以下操作:

  1. 读取Excel文件。
  2. excel文件中会有一个指向互联网某处的图片网址。
  3. 程序读取每个图像URL并将其存储在Web服务器的临时文件夹中。
  4. 然后,应用程序会调整图像的大小(更改宽度和高度)。
  5. 最后,应用程序会将该图像保存到另一个文件夹。

    我收到以下异常:

  6.   

    System.Net.WebException:一个例外   在WebClient请求期间发生。   ---> System.UnauthorizedAccessException的:   访问路径   '\ abcserver \ target03 \ 3111 \ 35644 \ www.testing.com \网络\内容\影像\ TempStorage \ tempImage.jpg'   被拒绝。在   System.IO .__ Error.WinIOError(的Int32   errorCode,String maybeFullPath)at   System.IO.FileStream.Init(String path,   FileMode模式,FileAccess访问,   Int32权限,布尔值使用权限,   FileShare共享,Int32 bufferSize,   FileOptions选项,   SECURITY_ATTRIBUTES secAttrs,String   msgPath,布尔bFromProxy)at   System.IO.FileStream..ctor(字符串   path,FileMode模式,FileAccess   访问)   System.Net.WebClient.DownloadFile(URI   address,String fileName)---结束   内部异常堆栈跟踪---
      at ProcessImage.GetFileFromUrl(String   imageFileUrl,String newFileName)
      在   uploadexceldata.UploadExcelData(字符串   文件名)

     foreach (DataRow dr in dt.Rows) // Reading each excel row
                {
    
                    if (dr[0].ToString() != "")
                    {
                        id= "";
                        path = "";
                        manuId = "";
    
    
                        id= dr[0].ToString();
                        path = dr[1].ToString();
                        fileNameOnly = iProImg.GetFileNameOnly(path);
                        objDb.openConnection();
                        strSqlGroupInfo = "select ManufacturerID from  manufacturers where id='" + id+ "'";
    
                        dTblManu = objDb.BuildDT(strSqlGroupInfo); // To Fill data to Datatable
                        objDb.closeConnection();
                        if (dTblManu.Rows.Count > 0)
                        {
                            manuId = dTblManu.Rows[0][0].ToString();
                        }
    
                        if (manuId != "")
                        {
                            tempUploadPath = "images/TempStorage/";
                            tempUploadPath = Server.MapPath(tempUploadPath);
                            if (!Directory.Exists(tempUploadPath))
                            {
                                Directory.CreateDirectory(tempUploadPath);
                            }
                            tempFilePath = tempUploadPath + "\\tempImage.jpg";
                            tempFilePath = tempFilePath.Replace("/", "\\");
    
                            previewPath = Server.MapPath("images/previews/" + manuId);
                            thumbNailPath = Server.MapPath("images/thumbnails/" + manuId);
    
                            if (!Directory.Exists(previewPath))
                            {
                                Directory.CreateDirectory(previewPath);
                            }
                            if (!Directory.Exists(thumbNailPath))
                            {
                                Directory.CreateDirectory(thumbNailPath);
                            }
                            fileNameOnly = "\\preview" + id+ ".jpg";
                            fileNameOnly = fileNameOnly.Replace("/", "\\");
                            previewPath = previewPath + fileNameOnly;
                            tempPartialPathP = "images\\previews\\" + manuId + fileNameOnly;
    
                            fileNameOnly = "\\thumbnail" + id+ ".jpg";
                            thumbNailPath = thumbNailPath + fileNameOnly;
                            tempPartialPathT = "images\\thumbnails\\" + manuId + fileNameOnly;
    
    
                            try
                            {
    
                                iProImg.GetFileFromUrl(path, tempFilePath);
                                rowCounter++;
                                iProImg.ReSizeImage(tempFilePath, previewPath, previewSize);
                                iProImg.ReSizeImage(previewPath, thumbNailPath, thumbNailSize);
    
                            }
                            catch (Exception ec)
                            {
    
                                errorRowCount++;
                                iLog.LogErrorToFile("uploadExcel", ec.ToString(), "path : " + path + ",tempFilePath :" + tempFilePath);
    
    
                            }
                            finally
                            {
                                if(File.Exists(tempFilePath))
                                {
                                File.Delete(tempFilePath);
                                }
                            }
                        } // If manuid!=""
                    }  //if (dr[0].ToString() != "")
    

    有人对如何修复此异常有任何建议吗?

10 个答案:

答案 0 :(得分:8)

尝试为您正在阅读/保存文件的.Net用户设置“完全控制”的访问权限。

答案 1 :(得分:4)

世界上没有任何答案为我解决了这个问题,直到我偶然发现了自己的答案:

UN-ENCRYPT THE FILE

您可以向整个硬盘驱动器上的每个人授予完全权限,但仍然不允许ASP.NET解密文件。

如果您确定文件未加密,则只需将ASPNET帐户添加到要访问的文件或文件夹即可。但请确保它先没有加密!

答案 2 :(得分:3)

确保ASP.NET帐户对您要写入的文件夹具有读/写权限(基本Windows安全性) 如何: http://www.microsoft.com/windowsxp/using/networking/security/permissions.mspx
(前4个步骤,选中复选框并单击OK

[编辑]
您需要使用远程服务器上已知的帐户对自己进行身份验证。您可能已授予远程服务器上本地ASP.NET帐户的权限,这不起作用,因为您不是用户(从Web服务器)访问该文件夹的用户。
[/编辑]

答案 3 :(得分:3)

回复所说的内容:“这是一个远程服务器,该文件夹具有完全读/写权限授予。仍无法正常工作”

确保.Net用户/计算机帐户用户具有该文件夹的完全权限。

另外,添加<身份/>到您的配置文件

答案 4 :(得分:3)

以上所有内容,以及您可能需要添加此标记:

<identity impersonate="true" userName="accountname" password="password" />

阅读此KB article,如果您要从浏览器转到iis到文件共享,则计为两跳,现在需要配置Kerberos委派。比我更聪明的系统管理员试图配置kerberos delegation并且失败了。移动您的图像或IIS实例,以便它们位于同一台计算机上。

答案 5 :(得分:3)

首先,通过在该特定路径上临时授予Everyone完全权限来缩小您的问题范围。如果它有效,那么你知道这是一个简单的权限问题,你只需要确定哪个acct需要适当的权限。可能是匿名用户帐户(在IIS Admin中仔细检查此设置)而不是ASP.NET帐户。 (别忘了给每个人取消许可)

如果您需要,我相信您可以使用FileMon查看哪个帐户正在尝试访问特定文件。可能是错的,我暂时没有使用过这个工具。

最后一件事......是文件上设置的只读标志吗? :)

答案 6 :(得分:3)

今天我遇到了同样的问题。花了好几个小时试图找出造成问题的原因后,我发现正在写入的文件夹的权限不正确。从本质上讲,该文件夹只是从用户创建文件的角度来阅读。

尝试对相关文件夹执行以下操作:

  1. 右键单击文件夹并选择属性
  2. 单击“共享”选项卡,然后单击“权限”按钮
  3. 确保将要写入的任何用户添加到文件夹权限中
  4. 返回属性页面,单击“安全”选项卡
  5. 确保将要写入的任何用户添加到文件夹权限
  6. 看到这个问题是在6个月前被问到的,我假设你已经解决了这个问题......但我只是想我会记录我的解决方案以防万一它对未来的其他人有用因为他们试图弄清楚如何解决这个UnauthorizedAccessException。

答案 7 :(得分:1)

检查您写入tempStorage的图像文件(jpg)是否具有对webuser帐户(aspnet或iis_wpg)的适当权限。您可以设置TempStorage目录以替换所有子对象上的权限条目。

  1. 右键单击TempStorage文件夹并选择属性
  2. 选择安全选项卡(确保正确的读/写/修改权限在此处)
  3. 单击“高级”按钮
  4. 选中第二个复选框 - 使用此处显示的适用于子对象的条目替换所有子对象上的权限条目。
  5. 现在,您添加到TempStoreage文件夹的所有文件都将继承允许您使用webuser帐户读取jpg文件的权限。

答案 8 :(得分:1)

不是向ASPNET用户授予权限,而是向NETWORK SERVICE用户授予权限。修改文件夹中的权限应该足够,不需要提供完全权限(没有理由提供超出需要的权限)

了解更多详情阅读论坛:http://forums.asp.net/t/1013434.aspx/1

答案 9 :(得分:0)

错误是非常明显的访问路径&#39; bin \ myprojname.pdb \&#39;被拒绝。 Web控制台进程正在运行的用户(不是您在web控制台中创建的用户,实际的Windows用户),很可能是&#34;网络服务&#34;没有该文件夹的权限。

您可以 - 右键单击​​该文件夹,转到权限并添加&#34;网络服务&#34; user - 右键单击​​该文件夹,转到权限并添加&#34; Everyone&#34;用户

应该解决这个问题。