我是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权限来修改文件夹,但是没有用。
答案 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 -> 复选框完全控制允许 -> 按确定或应用