无法部署 Razor Pages 网站
Posted
技术标签:
【中文标题】无法部署 Razor Pages 网站【英文标题】:Cannot deploy Razor Pages website 【发布时间】:2018-12-25 17:19:56 【问题描述】:我构建了一个简单的 Razor Pages 网站,以便在几个数据库表上显示一些视图。
在index.cshtml.cs
我只有:
public class IndexModel : PageModel
public IActionResult OnGet()
return RedirectToPage("./Registrations/Index");
在Registrations/index.cshtml.cs
我有:
public class IndexModel : PageModel
int pageSize = 30;
private readonly RegistrationAdmin.PostgresDbContext _context;
public IndexModel(RegistrationAdmin.PostgresDbContext context)
_context = context;
public PaginatedList<Registration> Registration get; set;
public async Task OnGetAsync(int pageIndex = 1)
IQueryable<Registration> registrations = _context.Registrations
.Include(r => r.ContactPerson)
.Include(r => r.Badge)
.OrderByDescending(r => r.RegistrationId);
this.Registration = await PaginatedList<Registration>.
CreateAsync(registrations.AsNoTracking(), pageIndex, pageSize);
从 Visual Studio 测试网站很好,从项目目录运行 dotnet run
也很好。
所以我部署了网站:
dotnet publish -o ../Published/ -c release
然后使用发布目录中的dotnet MyWebsite.dll
运行它。
当我连接到 http://localhost:5000 时,出现一般错误。
查看控制台这是抛出的异常:
Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
An unhandled exception has occurred while executing the request.
System.InvalidOperationException: No page named './Registrations/Index' matches the supplied values.
at Microsoft.AspNetCore.Mvc.Infrastructure.RedirectToPageResultExecutor.ExecuteAsync(ActionContext context, RedirectToPageResult result)
at Microsoft.AspNetCore.Mvc.RedirectToPageResult.ExecuteResultAsync(ActionContext context)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultAsync(IActionResult result)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResultFilterAsync[TFilter,TFilterAsync]()
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecutedContext context)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultFilters()
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke(HttpContext context)
我不明白部署版本有什么问题。
【问题讨论】:
你为什么不给出行动的参考,像这样return RedirectToAction("Index", "Registrations");
并确保在注册控制器中创建该操作
好的,我试试。但我不明白为什么它在部署前有效,而在部署后又无效。
您是否将视图与编译的源代码一起部署?
嗯,我不知道...我只是运行publish
命令,然后运行cd
到目录,然后运行dotnet MyWebsite.dll
。我是否必须从项目目录中手动复制一些文件才能发布?
【参考方案1】:
根据错误消息,应用程序无法看到引用的视图。
默认情况下,项目发布时会预编译页面。
参考Publishing and deploying a Razor Pages application to IIS on Windows
虽然你已经表明你在 mac 上
可以跳过此步骤并发布原始 .cshtml 文件,从而产生可以以类似于 php 的方式更新的页面, 经典的 ASP 或 ASP.NET 网页框架。换句话说,你 可以对 .cshtml 文件进行更改,然后将它们复制到网络上 服务器在应用程序运行时,并且新内容将占用 立即生效。
如果您想采用这种方法,请添加
MvcCompileOnPublish
节点到你的 .csproj 文件,值设置为false
:<PropertyGroup> <TargetFramework>netcoreapp2.0</TargetFramework> <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish> </PropertyGroup>
这将产生一个页面文件夹,其中包含内容页面和一个 refs 文件夹包含应用程序所需的库
使用上述方法,虽然更多的解决方法可以让您将丢失的视图复制到已发布的应用程序中,并在发布时使它们可用。
编辑:
所以最后看起来 csproj 文件存在问题,该文件在发布时排除了页面。
我们能够通过禁用页面预编译来确认问题页面在发布时没有被复制(考虑)。
清理 csproj 文件并重新编译解决了预编译和未编译复制页面的问题。
它最初直接在项目中工作,因为在项目运行时所有必要的文件都存在。
【讨论】:
以上是关于无法部署 Razor Pages 网站的主要内容,如果未能解决你的问题,请参考以下文章
Vue 项目部署到GitHub Pages并同步到Gitee Pages
部署在 github.pages 上的 Flutter Web 应用程序无法访问某些资产