简体   繁体   English

为什么我的 Blazor 服务器页面在发布到 IIS 后为空?

[英]Why is my Blazor Server page empty after publishing to IIS?

I'm developing a Blazor Server app that exposes Windows Task Scheduler tasks for remote control with limited controls (I know I can remote to the server's Task Scheduler but this is a request to make it available to some other users inside my organization via local website).我正在开发一个 Blazor 服务器应用程序,该应用程序公开了 Windows 任务计划程序任务,用于通过有限的控制进行远程控制(我知道我可以远程访问服务器的任务计划程序,但这是一个请求,通过本地网站将其提供给我组织内的其他一些用户)。 The library to access Windows Task Scheduler is Microsoft.Win32.TaskScheduler from NuGet.访问 Windows 任务计划程序的库是来自 NuGet 的Microsoft.Win32.TaskScheduler The app is pretty simple with only 1 component, user is authenticated with Windows Authentication, the app is hosted on an application server's IIS.该应用程序非常简单,只有 1 个组件,用户通过 Windows 身份验证进行身份验证,该应用程序托管在应用程序服务器的 IIS 上。 I'm also new to Blazor and I'm learning by doing it.我也是 Blazor 的新手,我正在边做边学。

Razor page Razor页面

@page "/"

<h3>Task Manager</h3>

<div>
    @if (TaskList == null)
    {
        <div class="spinner"></div>
    }
    else
    {
        @foreach (var task in TaskList)
        {
            <p>
                @task.Name -
                @task.State -
                @task.Enabled
            </p>
            <p>
                @task.LastRunTime -
                @task.NextRunTime -
                @task.LastTaskResult
            </p>
            <p>
                <input id="btnPause" type="button" disabled="@(task.Enabled ? false : true)" value="Pause" @onclick="() => DisableTask(task)" />
                <input id="btnResume" type="button" disabled="@(task.Enabled ? true : false)" value="Resume" @onclick="() => EnableTask(task)" />
                <input id="btnRun" type="button" disabled="@(task.Enabled ? false : true)" value="Run now" @onclick="() => RunTask(task)" />
                <input id="btnStop" type="button" disabled="@(task.Enabled ? false : true)" value="Stop" @onclick="() => EndTask(task)" />
            </p>
            <br />
        }
    }
</div>

Code behind背后的代码

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Win32.TaskScheduler;
using Microsoft.AspNetCore.Components;

namespace TaskSchedulerManager.Pages
{
    public partial class TaskManager: ComponentBase
    {
        public IEnumerable<Task> TaskList { get; set; }

        protected override System.Threading.Tasks.Task OnInitializedAsync()
        {
            LoadScheduleTask();
            return base.OnInitializedAsync();
        }

        private void LoadScheduleTask()
        {
            using (TaskService ts = new TaskService())
            {
                TaskFolder root = ts.RootFolder;
                TaskFolder sub = root.SubFolders["Task Scheduler Folder Name"];
                List<Task> tsList = new List<Task>();
                foreach (Task task in sub.Tasks)
                {
                    tsList.Add(task);
                }
                TaskList = new List<Task>(tsList);
            }
        }

        private void DisableTask(Task task)
        {
            task.Enabled = false;
            InvokeAsync(() =>
            {
                StateHasChanged();
            });
        }

        private void EnableTask(Task task)
        {
            task.Enabled = true;
            InvokeAsync(() =>
            {
                StateHasChanged();
            });
        }

        private void RunTask(Task task)
        {
            task.Run();
            InvokeAsync(() =>
            {
                StateHasChanged();
            });
        }

        private void EndTask(Task task)
        {
            task.Stop();
            InvokeAsync(() =>
            {
                StateHasChanged();
            });
        }
    }
}

When I run it locally, all the tasks are displayed on the page as intended.当我在本地运行它时,所有任务都按预期显示在页面上。 When I publish the app to IIS, the page only shows the header Task Manager , below that it's empty, on the same machine or from local machine.当我将应用程序发布到 IIS 时,该页面仅显示 header任务管理器,下面它是空的,在同一台机器上或本地机器上。 What did I miss?我错过了什么?

Webpage was just an empty page because the order of rendering was incorrect.网页只是一个空页面,因为呈现的顺序不正确。

protected override System.Threading.Tasks.Task OnInitializedAsync()
{
    LoadScheduleTask();
    return base.OnInitializedAsync();
}

change to改成

return base.OnInitializedAsync();
LoadScheduleTask();
// terminal task...

or something another, always remember order of HTML rendering.或者别的什么,永远记住 HTML 渲染的顺序。 Blazor's nature is render HTML by WebAssembly code. Blazor 的本质是通过 WebAssembly 代码呈现 HTML。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM