【问题标题】:ASP.NET Core MVC 3.1 Application can not access path on Ubuntu 20.04.1ASP.NET Core MVC 3.1 应用程序无法访问 Ubuntu 20.04.1 上的路径
【发布时间】:2020-11-27 16:36:52
【问题描述】:

当我通过dotnet run 进入.sln 目录后启动项目时,此功能正常工作。如果我转到projectfolder/../bin/Release/netcoreapp3.1/publish 并使用dotnet project.dll 运行它仍然可以正常工作,但是如果我将此应用程序作为服务启动,则此功能不起作用并且catch 写下这一行:

拒绝访问路径“/home/.../projectfolder/uploaded-images/3713579a-5b47-48f7-8666-9e0b3ded3bb1.jpg”。`

private async Task<FileSaveResult> SaveImage(IFormFile imageFile)
{
    if (!Directory.Exists(IMAGEUPLOADPATH))
    {
        Directory.CreateDirectory(IMAGEUPLOADPATH);
    }
    string postedFileExtension = Path.GetExtension(imageFile.FileName);
    string newName = Guid.NewGuid().ToString() + postedFileExtension;
    string newPath = Path.Combine(IMAGEUPLOADPATH, newName);
    try
    {
        using var fileStream = new FileStream(newPath, FileMode.Create);
        await imageFile.CopyToAsync(fileStream);
        return new FileSaveResult
        {
            ContentType = imageFile.ContentType,
            PhysicalAddress = newPath,
            IsSuccess = true
        };
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        return new FileSaveResult();
    }
}

这是我初始化IMAGEUPLOADPATH的地方

public AdminController(..., IWebHostEnvironment environment,...)
{
    ...
    VIDEOUPLOADPATH = Path.Combine(environment.ContentRootPath, "uploaded-videos");
    IMAGEUPLOADPATH = Path.Combine(environment.ContentRootPath, "uploaded-images");
    ...
}

我用这个命令启动服务 sudo systemctl start myprojectname.service

这是myprojectname.service文件的内容(我一般不知道这些行的含义)。

[Unit]
Description=.....

[Service]
WorkingDirectory=/home/..../myproject
ExecStart=/usr/bin/dotnet /home/.../myproject/bin/Release/netcoreapp3.1/publish/project.dll
Restart=always
RestartSec=10
ProtectHome=off
KillSignal=SIGINT
SyslogIdentifier=myproject
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WntedBy=multi-user.target

我该如何解决这个问题?我通过 ssh 连接开始这个项目。我无法关闭命令行,因为它会杀死应用程序。

【问题讨论】:

    标签: ubuntu path asp.net-core-mvc systemctl


    【解决方案1】:

    问题

    uploaded-videosuploaded-images 文件夹需要更多权限。 NGINX 无法访问这些文件夹。但是当我们以sudo dotnetdotnet 启动它时,它可以在root 权限下使用。

    检查这是否是我们面临的问题

    1. 将目录更改为包含我们无法访问的文件夹的项目文件夹。

      cd .../.../projectfolder

    2. 使用-l 参数列出文件夹内容。添加-l 以查看长列表。我添加| grep uploaded- 以查看仅以uploaded- 开头的内容

      ls -l - grep | uploaded-

      ls -l查看全部

      打印这样的东西

    输出

    drwxr-xr-x 2 root root  4096 Nov 27 16:01 uploaded-images
    drwxr-xr-x 2 root root  4096 Nov 27 15:04 uploaded-videos
    

    我们可以看到,两个文件夹的权限都是drwxr-xr-x

    r-x 表示它有读和执行的权限,但没有写权限。

    解决方案

    当您仍在项目文件夹中时。运行这些命令以将写入权限添加到所需的文件夹。就我而言,它看起来像这样。

    sudo chmod a+rwx uploaded-videos/
    sudo chmod a+rwx uploaded-images/
    

    测试解决方案

    让我们再次尝试运行此命令

    ls -l

    输出

    drwxrwxrwx 2 root root  4096 Nov 27 16:01 uploaded-images
    drwxrwxrwx 2 root root  4096 Nov 27 15:04 uploaded-videos
    

    现在我们有 rwx 而不是 r-x。所以我们已经成功地赋予了写权限。

    我已经测试了应用程序,它可以正常工作。

    这些更改后我不必重新启动任何服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 2021-12-08
      • 2021-08-04
      • 2021-08-05
      相关资源
      最近更新 更多