运行在IIS上的.NET Blazor服务器返回空集合?

wnvonmuf  于 2023-01-26  发布在  .NET
关注(0)|答案(1)|浏览(130)

我正在体验与. NET Blazor服务器的绑定,并试图列出系统上可用的所有显示器。
从一个新项目开始,尽可能简单,我有一个模型:

using CommunityToolkit.Mvvm.ComponentModel;

namespace BindingTest.Data;

public class DisplayInfo : ObservableObject
{
    private string deviceName = string.Empty;
    public string DeviceName
    {
        get { return deviceName; }
        set { deviceName = value; OnPropertyChanged(nameof(DeviceName)); }
    }

    private bool primary;
    public bool Primary
    {
        get { return primary; }
        set { primary = value; OnPropertyChanged(nameof(Primary)); }
    }
}

a类:

using System.Collections.ObjectModel;
using WindowsDisplayAPI;

namespace BindingTest.Data;

public class DisplayService
{
    public ObservableCollection<DisplayInfo> ScreenCollection { get; set; } = new();

    public DisplayService()
    {
        foreach (Display display in Display.GetDisplays())
        {
            ScreenCollection.Add(new DisplayInfo
            {
                DeviceName = display.DisplayName,
                Primary = display.IsGDIPrimary,
            });
        }
    }
}

a页:

@page "/displays"
@using BindingTest.Data;
@using System.Collections.ObjectModel;

<PageTitle>Displays</PageTitle>

@inject DisplayService display

<h1>Display Service</h1>

@if (display.ScreenCollection == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <p>Total items in collection: @display.ScreenCollection.Count</p>

    <table class="table">
        <thead>
            <tr>
                <th>Device Name</th>
                <th>Primary</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var display in display.ScreenCollection)
            {
                <tr>
                    <td>@display.DeviceName</td>
                    <td>@display.Primary.ToString()</td>
                </tr>
            }
        </tbody>
    </table>
}

一个程序. cs:

using BindingTest.Data;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<DisplayService>();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseRouting();

app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();

Websocket协议已启用,站点已发布。如果满足以下任一条件,此操作将运行良好:
1-我使用iis express从visual studio内部运行
2-在publish文件夹中启动. exe文件,然后导航到提供的地址

但是,如果我使用IIS运行,则该方法不起作用,并且集合为空

GitHub回购协议:here
进程/代码有什么不对的地方吗?IIS的限制?为长时间的帖子道歉,不知道我做错了什么。也许有人也可以建议一个好的教程?

bqucvtff

bqucvtff1#

简而言之,这是预期行为,无法在代码中实现。

"为什么"

  1. WindowsDisplayAPI用于客户端应用程序,如winform和wpf。
    1.我知道它的作品在IISExpress和点击.exe文件,当在开发模式下,它也属于客户端模型。
    1.即使是在iis生产环境下也可以工作,但是这段代码没有意义。因为编译文件在服务器端,它会显示服务器端的屏幕,对吗?
  2. IIS作为Web服务器,它不允许显示更多的设备信息。

相关问题