无法部署Razor Pages网站

时间:2018-07-17 22:24:45

标签: c# asp.net-core razor-pages

我建立了一个简单的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)

我无法理解部署版本出了什么问题。

1 个答案:

答案 0 :(得分:3)

根据错误消息,一些应用程序看不到引用视图的情况。

默认情况下,项目发布时会预先编译页面。

参考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>
     

这将导致一个Pages文件夹包含内容页面和一个   refs文件夹,其中包含应用程序所需的库

使用上述方法,尽管有更多解决方法,但您可以将丢失的视图复制到已发布的应用中,并在发布时将其使用。

修改

最后,看来 csproj 文件出现了问题,该问题在发布时不包含在页面中。

我们能够通过禁用页面预编译来确认这一点,并查看发布时未复制(考虑)有问题的页面。

清理 csproj 文件并重新编译可以解决预编译和未编译复制页面的问题。

它最初直接在项目中工作,因为在运行项目时所有必需的文件都存在。