docker - 在 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;该项目没有。
解决方案
我一直在坐立不安,最后我只是抓住了生成的文件并将其作为响应返回。
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);
}
推荐阅读
- azure-data-lake - 如何组合不同的模式
- spring - Netflix Ribbon 抛出 No instances available for MY-MICROSERVICE 异常
- python - 如何使用 python 更新现有的 excel 文件
- chef-infra - 如何在用户资源中创建用户和组
- google-apps-script - 更改单元格值时触发 Google Sheet Script onChange
- javascript - sinon spy 检查是否调用了 func 总是返回 false 虽然函数
- math - 找到垂直于其他两个点的点的算法
- amazon-web-services - API 网关返回具有特定文件大小的 502 错误
- php - PHP $_GET 用于带加号的参数
- java - 使用 Java 访问嵌套 JSON 对象的最佳方式