ASP.NET Core System.UnauthorizedAccessException:拒绝访问路径“C:\ ...”

时间:2017-06-13 04:37:19

标签: c# asp.net-core asp.net-core-webapi

我是ASP.NET Core的新手,所以我正在玩制作API。我正在尝试通过我的Web API上传图片。图片将保存到Web服务器上。我在Windows Server 2016 Standard Edition VPS计算机上运行API。我在机器上安装了IIS 10。我收到的错误(远程调试时):

  

{System.UnauthorizedAccessException:拒绝访问路径'C:\ HomeNET \ Houses \ 13'。      在System.IO.Win32FileStream..ctor(字符串路径,FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize,FileOptions选项,FileStream父级)      在System.IO.Win32FileSystem.Open(String fullPath,FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize,FileOptions选项,FileStream parent)      在System.IO.FileStream.Init(字符串路径,FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize,FileOptions选项)      在System.IO.FileStream..ctor(字符串路径,FileMode模式)      在HomeNetAPI.Controllers.HouseController.d__6.MoveNext()在C:\ Users \ okuhl \ Documents \ HomeNet \ Web API \ HomeNetAPI \ src \ HomeNetAPI \ Controllers \ HouseController.cs:第83行}

这很奇怪,因为目录是不存在的。以下是一些失败发生的代码:

if (resultHouse != null)
{
    if (!Directory.Exists($"C:/HomeNET/Houses/{resultHouse.HouseID}"))
    {
        Directory.CreateDirectory($"C:/HomeNET/Houses/{resultHouse.HouseID}");
    }

    String fileName = new FileInfo(imageFile.FileName).Name;
    String fileExtension = new FileInfo(imageFile.FileName).Extension;
    using (var fileStream = new FileStream($"C:/HomeNET/Houses/{resultHouse.HouseID}", 
        FileMode.Create)) //Bombs out after this line
    {
        var result = imageFile.CopyToAsync(fileStream);
        if (result.IsCompleted)
        {
            newHouse.HouseImage = Path.Combine($"C:/HomeNET/Houses/{resultHouse.HouseID}", $".{fileExtension}");
            var updateResult = await Task.Run(() =>
            {
                return houseRepository.UpdateHouse(newHouse);
            });
            if (updateResult != null)
            {
                response.DidError = false;
                response.Message = $"House {newHouse.Name} has been created successfully! Invite friends ad family to your house!";
                response.Model = newHouse;
                return Ok(response);
            }
            else
            {
                response.DidError = true;
                response.Message = "Something went wrong with creating the house. Please try again";
                response.Model = newHouse;
                return BadRequest(response);
            }
        }
        else
        {
            response.DidError = true;
            response.Message = $"Something Went wrong with creating your house. House image could not be saved onto the system. \n {result.Exception.Message}";
            response.Model = newHouse;
            return BadRequest(response);
        }
    }
}

我已尝试将该文件夹提供给所有人,但这不起作用。我也试过给我的AppPool权限来修改文件夹,但是没有用。

4 个答案:

答案 0 :(得分:2)

尝试检查正在运行应用程序池的用户(此处的说明:https://docs.microsoft.com/en-us/iis/manage/configuring-security/application-pool-identities)。

如果该用户无权访问C驱动器,则写入将失败。

(另外:尽量不要在代码中反复编码路径。将C:/HomeNET/Houses/声明为const并以这种方式引用它,或者更好的是,从web.config中读取它。

答案 1 :(得分:1)

对于我的情况(IIS 8.5),我必须将.woff2添加到应用程序文件夹中才能解决此问题

答案 2 :(得分:0)

您需要创建一个虚拟目录。以下是在IIS 7中执行此操作的方法:https://technet.microsoft.com/en-us/library/cc771804(v=ws.10).aspx。对于IIS 10,它可能类似。

答案 3 :(得分:0)

为服务正在使用的文件夹/文件提供网络服务权限

右键单击您的文件夹 -> poperty 的 -> 安全性 -> 编辑 -> 添加 -> 键入:NETWORK SERVICE -> 复选框完全控制允许 -> 按确定或应用