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

Posted

技术标签:

【中文标题】为啥发布到 IIS 后我的 Blazor 服务器页面为空?【英文标题】:Why is my Blazor Server page empty after publishing to IIS?为什么发布到 IIS 后我的 Blazor 服务器页面为空? 【发布时间】:2021-07-14 00:35:47 【问题描述】:

我正在开发一个 Blazor Server 应用程序,该应用程序公开 Windows 任务计划程序任务,以通过有限的控件进行远程控制(我知道我可以远程访问服务器的任务计划程序,但这是一个让我的组织内的其他一些用户可以使用它的请求通过当地网站)。用于访问 Windows 任务计划程序的库是来自 NuGet 的 Microsoft.Win32.TaskScheduler。该应用程序非常简单,只有 1 个组件,用户通过 Windows 身份验证进行身份验证,该应用程序托管在应用程序服务器的 IIS 上。我也是 Blazor 的新手,我正在边做边学。

剃刀页面

@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>

后面的代码

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();
            );
        
    

当我在本地运行它时,所有任务都按预期显示在页面上。当我将应用程序发布到 IIS 时,该页面仅显示标题 Task Manager,其下方为空,位于同一台机器上或本地机器上。我错过了什么?

【问题讨论】:

很可能 IIS 用户没有访问任务的权限 如何添加读取任务的权限?具体针对哪个用户? 我不知道。一些谷歌搜索说您应该授予对计划任务文件夹 C:\Windows\System32\Tasks 的访问权限。需要此访问权限的用户帐户可能是 IUSR。虽然不确定 我找到了部分解决方案。在 using 语句中,如果我输入远程服务器和凭据,它将适用于该服务器,按照说明:` using (TaskService ts = new TaskService(@"\\RemoteServer", "username", "domain", "密码")) ` 如果我不传递服务器凭据(也称为本地服务),它将无法工作 不确定,但如果您使用 .net-core,dotnet run 会在 express 版本中运行应用程序吗?所以你不需要 IIS 吗? 【参考方案1】:

网页只是一个空页面,因为渲染顺序不正确。

protected override System.Threading.Tasks.Task OnInitializedAsync()

    LoadScheduleTask();
    return base.OnInitializedAsync();

改成

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

或者别的什么,永远记住 html 渲染的顺序。 Blazor 的本质是通过 WebAssembly 代码呈现 HTML。

【讨论】:

以上是关于为啥发布到 IIS 后我的 Blazor 服务器页面为空?的主要内容,如果未能解决你的问题,请参考以下文章