Доступ к файлам CSV в .NET Core Project в Docker-контейнере - PullRequest
0 голосов
/ 16 мая 2018

У меня проблемы с доступом к файлам CSV в .NET Core Project в Docker Container (Linux), он отлично работает в режиме отладки, но не в режиме выпуска (с ошибкой, говорящей, что не удается найти файл). Есть идеи, что может быть не так? В проекте есть папка «Данные» с файлами CSV.

    [Route("GetTestFile")]
    [HttpGet]
    public IActionResult GetTestFile()
    {
        var fileName = "testdata.csv";
        var filePath = Path.Combine("Data", fileName);
        return new FileContentResult(File.ReadAllBytes(filePath), "text/csv") { FileDownloadName = fileName };
    }

Dockerfile

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY PVT_Matching_Algorithm/PVT_Matching_Algorithm.csproj PVT_Matching_Algorithm/
RUN dotnet restore PVT_Matching_Algorithm/PVT_Matching_Algorithm.csproj
COPY . .
WORKDIR /src/PVT_Matching_Algorithm
RUN dotnet build PVT_Matching_Algorithm.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish PVT_Matching_Algorithm.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "PVT_Matching_Algorithm.dll"]

Экран исключений выглядит следующим образом:

enter image description here

Ответы [ 2 ]

0 голосов
/ 05 августа 2019

Если я правильно понял ваш вопрос.
Вы должны ввести IHostingEnvironment appEnvironment.
И тогда вы можете сделать так:

var filePath = Path.Combine(_appEnvironment.ContentRootPath, "Data/testdata.csv");
0 голосов
/ 16 мая 2018

Настройте свой код так, чтобы он возвращал fullPath, чтобы увидеть, где он пытается прочитать файл:

[Route("GetTestFile")]
[HttpGet]
public IActionResult GetTestFile()
{
    var fileName = "testdata.csv";
    var filePath = Path.Combine("Data", fileName);
    try
    {
        return new FileContentResult(File.ReadAllBytes(filePath), "text/csv") { FileDownloadName = fileName };
    }
    catch (Exception)
    {
        // Return the error message like "File not found" instead of `fileName`. 
        // Returning the file path here is just for getting quick details.
        return new StatusCode(filePath)
        {
            StatusCode = 500
        };
    }
}

Или как готовое к производству решение:

[Route("GetTestFile")]
[HttpGet]
public IActionResult GetTestFile()
{
    var fileName = "testdata.csv";
    var filePath = Path.Combine("Data", fileName);
    try
    {
        return new FileContentResult(File.ReadAllBytes(filePath), "text/csv") { FileDownloadName = fileName };
    }
    catch (Exception exception)
    {
        var errorMessage = $"Can not read CSV file {fileName}.";
        Log(errorMessage, exception);
        return StatusCode((int)HttpStatusCode.InternalServerError, errorMessage);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...