首页 > 解决方案 > 在 Docker 上使用 MVC 获取生成的视图

问题描述

我有一个授权的 dotnet 核心应用程序。因为公司政策不允许在前端存储 Bearer 令牌,所以我想通过 MVC 控制器运行它。但是,我正在使用生成的 Vue.js 运行 SPA。所以我必须从Controller返回生成的index.cshtml。这在 Kestrel 本地工作,但是一旦我将它部署到 Docker 容器,它就不再工作了——我想这与 MVC 期望文件在某个地方的方式有关,这与 Docker 处理它的方式不匹配。

我尝试了各种方法来查找 pod 上的文件。该应用程序在 /app 中运行标准;SPA 最初部署到 /app/wwwroot。我找不到让 MVC 控制器从该文件夹中读取的方法。我更改了 vue.js webpack 以在 /app/View/[ControllerName] 下创建一个 Index.cshtml 和所有必需的资产,但这也不起作用。

Dockerfile:

FROM microsoft/dotnet:2.2-aspnetcore-runtime

EXPOSE 80

# Create app directory
WORKDIR /app

# Copy files from the artifact staging folder on agent
COPY <ProjectName>/out .

RUN apt-get update -y && apt-get install ca-certificates -y && rm -rf /var/lib/apt/lists/*
ADD certificate.crt
ADD certificate2.crt
ADD certificate3.crt
RUN update-ca-certificates

ENTRYPOINT ["dotnet", "<ProjectName>.dll"]

预期结果:SPA 加载。实际结果:经常出现MVC错误,在各个位置找不到index.cshtml文件。它总是在寻找错误的位置,即使我试图将它指向正确的方向。那是试图指向 /app/wwwroot 下的 vue.js;在 /Views/[ControllerName] 下生成 SPA 时,似乎构建服务器没有正确构建它以将其放置在那里,并且发生了其他奇怪的事情。有一次,它显然生成了一个 HomeController;该项目没有。

标签: dockervue.jsmodel-view-controller.net-core

解决方案


我一直在坐立不安,最后我只是抓住了生成的文件并将其作为响应返回。

public ActionResult Index()
{
    try
    {
        var fileStream = new FileStream("/app/wwwroot/index.html", FileMode.Open);
        return File(fileStream, "text/html; charset=utf-8");
    }
    catch (Exception ex)
    {
        _logger.LogError($"Kon /app/wwwroot/index.html niet openen", ex);
    }  

    return StatusCode(500);
 }

推荐阅读