【问题标题】:System.UnauthorizedAccessException when attempting to write a file from an asp.net application尝试从 asp.net 应用程序写入文件时出现 System.UnauthorizedAccessException
【发布时间】:2013-12-13 20:25:56
【问题描述】:

编辑:我找到了解决方案。我原以为在尝试写入要比较的文件时会产生错误,实际上是在我尝试读取要比较的文件时产生错误。我在为比较可执行文件调用的命令中出现语法错误,导致未生成结果文件。当我试图读取一个不存在的文件时,我看到了访问冲突(是的,我应该检查文件是否存在)。我在让 BC 生成比较时遇到问题(出于某种原因,完全相同的命令可以在命令提示符下工作,但在从 C# 运行时不起作用),但如有必要,我会作为一个单独的问题提出。

我正在开发一个 .net 应用程序,用于比较构建之间的代码更改。

我尝试添加的应用程序的一部分利用了 compare 来生成两个代码块的 html 比较。

为了做到这一点,我从代码生成文件(请注意,我知道文件名会对多个用户产生冲突问题,我稍后会解决这个问题),然后从命令行调用超越比较可执行文件。我使用以下代码生成文件:

//write the code to a local disk file
            System.IO.File.WriteAllText(@workingFolder + "\\File1.txt", (String)dataRow["OldMethodCode"]);
            System.IO.File.WriteAllText(@workingFolder + "\\File2.txt", (String)dataRow["NewMethodCode"]);

workingFolder 的值是:"C:\inetpub\wwwroot"

我遇到的问题是,当运行此代码并尝试创建这些文件时,我得到以下异常:

[UnauthorizedAccessException: 访问路径 'C:\inetpub\wwwroot' 被拒绝。] System.IO.__Error.WinIOError(Int32 errorCode, String 也许FullPath)+216 System.IO.FileStream.Init(字符串路径,文件模式 模式、FileAccess 访问、Int32 权限、Boolean userRights、FileShare 共享,Int32 bufferSize,FileOptions 选项,SECURITY_ATTRIBUTES secAttrs,字符串 msgPath,布尔 bFromProxy,布尔 useLongPath, Boolean checkHost) +1430 System.IO.FileStream..ctor(字符串路径, FileMode 模式、FileAccess 访问、FileShare 共享、Int32 bufferSize、 FileOptions 选项、String msgPath、Boolean bFromProxy、Boolean useLongPath, Boolean checkHost) +214
System.IO.StreamReader..ctor(字符串路径,编码编码,布尔值 detectEncodingFromByteOrderMarks, Int32 bufferSize, Boolean checkHost) +187 System.IO.File.InternalReadAllText(字符串路径,编码编码,布尔校验主机)+90
_Default.gridView_SelectedIndexChanged(Object _sender, EventArgs e) +1024 System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean CauseValidation, String validationGroup) +1241
System.Web.UI.Page.ProcessRequestMain(布尔值 includeStagesBeforeAsyncPoint,布尔型 includeStagesAfterAsyncPoint) +3804

我已经尝试了很多方法来解决这个问题。与任何问题一样,您可能会忘记所有选择,但以下是我认为最有可能成功的选择(但没有奏效):

  • 将 networkService 添加为 wwwroot 文件夹的完全权限
  • 将具有完全权限的所有人添加到 wwwroot 文件夹
  • 将应用程序池管理的管道模式更改为经典
  • 将应用程序池设置为与自定义用户一起运行,并授予该用户对该文件夹的完全权限
  • 授予几乎所有其他似乎与该文件夹相关的完全权限的用户
  • 将文件夹移动到 wwwroot 之外的另一个本地目录并指向该目录,然后使用该文件夹尝试上述所有操作。

在所有情况下,我似乎都无法创建文件,更不用说访问它来运行比较了。

是否有人对如何解决此问题提供建议,或提供不需要创建文件的替代/更好的比较方法?

谢谢!

【问题讨论】:

  • 是否需要将文件存放在 C:\inetpub\wwwroot 下?您可以尝试将其放在子文件夹中吗?
  • 对不起,我应该在我的原始帖子中包含这个。我已经尝试将它放在一个子文件夹以及一个完全在结构之外的文件夹中。两种情况下的结果相同。

标签: c# asp.net .net iis permissions


【解决方案1】:

产生你的错误...

使用以下代码创建了一个 Web 应用程序并写入主机目录“C:\inetpub\wwwroot\”中的文件

 string WorkingFolder = System.Configuration.ConfigurationManager.AppSettings["FolderPath"];
    protected void Page_Load(object sender, EventArgs e)
    {
        string s = "abcdefghijklmnopqrstuvwxyz";
        System.IO.File.WriteAllText(WorkingFolder + @"\File1.txt", s);
    }

我在默认应用程序池下发布和部署应用程序。我的默认应用程序池使用 域用户\IIS_IUSRS 帐户。默认情况下,我只有“C:\inetpub\wwwroot\”文件夹的读取和执行权限。我收到以下错误..,

Source Error: 

第 14 行:{ 第 15 行:字符串 s = "abcdefghijklmnopqrstuvwxyz"; 第 16 行:System.IO.File.WriteAllText(WorkingFolder + @"\File1.txt", s); 第 17 行:} 第 18 行:}

Source File: D:\Working Samples\IISCheck\IISCheck\Default.aspx.cs    Line: 16 

堆栈跟踪:

[UnauthorizedAccessException: Access to the path 'C:\inetpub\wwwroot\File1.txt' is    denied.]
  System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +10555843
System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights,  Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options,  SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) +2580
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) +138
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) +98
System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize) +139
System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding) +17 
System.IO.File.WriteAllText(String path, String contents, Encoding encoding) +60IISCheck._Default.Page_Load(Object sender, EventArgs e) in D:\Working Samples\IISCheck\IISCheck\Default.aspx.cs:16
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +42
System.Web.UI.Control.OnLoad(EventArgs e) +132
System.Web.UI.Control.LoadRecursive() +66
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2428

现在我向 IIS_IUSRS 授予“C:\Inetpub\wwwroot”目录的完全控制权限...。 它可以工作并且可以写入文件....

仔细检查文件夹访问权限。绝对可以写。。 我正在使用 IIS7.5

【讨论】:

  • 抱歉耽搁了。我已经给了 IIS_IUSRS 完全权限,不幸的是它没有工作......同样的错误。我们的服务器配置之间会不会有区别?我不确定在哪里检查这个。
【解决方案2】:

好的,这实际上是后来在代码中引起的。当我尝试读取报告时触发了该错误,该报告实际上并未生成。

我在从 C# 运行时让 BC 生成报告时遇到问题(在命令提示符下可以使用完全相同的命令),但如有必要,我会就此提出一个单独的问题。

【讨论】:

    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 2011-02-02
    • 2016-02-05
    相关资源
    最近更新 更多