我有一个在公司内部网上运行的Blazor-Server应用程序,用户的浏览器通过我们的标准Web应用程序门户连接到服务器,它几乎不做任何事情,比如提供一个友好的URL,并负责SSO、故障转移……不幸的是,这个门户网站对WebSocket消息传递有一些限制,将有效负载限制在64KB,这 destruct 了SignalR通信,因为当页面包含大量数据(如大网格)时,服务器恰好向浏览器发送少量hundreds kb甚至Mb条消息. 当我直接连接时,它工作得很好,但我失go 了SSO,这在用户体验方面是一个很大的损失.

所以我的问题是:我如何继续使用具有友好的CNAME for HTTP的门户,并告诉Blazor使用WebSocket的真实主机名,例如:

  • Http=>http://myportal/myapp/home
  • WebSocket ws://server1234:6400/_blazor

我看到了一些如下所示的允许更改路径的JS代码,但没有找到如何映射baseurl……

<script>
    (function start() {
        Blazor.start({
            configureSignalR: builder => builder.withUrl("/_barfoo")
        });
    })()
</script>

=[编辑]基于Jason答案的完整解决方案=

浏览器代码

// in _layout.cshtml
<script>
    (function start() {
        var signalUrl = 'http://server1234:6400/_blazor'
        Blazor.start({
            configureSignalR: builder => builder.withUrl(signalUrl)
        });
    })()
</script>

CORS的服务器代码

// in Program.cs
builder.services.AddCors(options =>
{
    
    options.AddPolicy("SigRPolicy", builder =>
        builder.WithOrigin("http://server1234")
               .AllowAnyMethod()
               .AllowAnyHeader())
               .SetIsOriginAllowed(_ => true);

    // !! After app.UseRoutine (order matters)
    app.UseCors("SigRPolicy")
    // !!  before app.UseAuthentication

});

但是现在我需要通过API调用动态检索host name:port

推荐答案

你可以try 使用下面的代码里面的_Host.cshtml个文件.

<script>
    (function start() {
        var hostname = window.location.hostname;  // Get the hostname

        var signalRUrl = 'ws://' + hostname + ':6400/_blazor'; 

        Blazor.start({
            configureSignalR: builder => builder.withUrl(signalRUrl)
        });
    })();
</script>

我们需要确保您的服务器可以访问6400端口.

Csharp相关问答推荐

ASP.NET Core将SON重新序列化为派生类

Blazor:用参数创建根路径

使用GeneratedComInterfaceProperty的.NET 8 COM类对于VB 6/SYS或ALEViewer不可见

如何使用Automapper映射两个嵌套列表

AutoMapper -如何为两个不同的用例设置单个映射?

哪个nuget包含SecurityStampValidatorOptions

如何将不同类型的扩展参数的javascript函数转换成C#风格?

内部接口和类的DI解析

如何在毛伊岛应用程序中完美地同步视图模型和视图的加载?

ASP.NET核心MVC SqlException:违反主键约束';PK_USER';.无法在对象';数据库中插入重复的密钥.用户';

C#DateTime.ParseExact不使用特定日期

如何在用户在线时限制令牌生成?

什么类型的对象存储在大对象堆(LOH)中

在ASP.NET Core 8 MVC中本地化共享视图

当我将`ConcurentDictionary`转换为`IDictionary`时,出现了奇怪的并发行为

在集成测试中可以在模拟InMemory数据库中设定数据种子

为什么我的用户界面对象移动到略低于实际目标?

在.Net 8 Visual Studio 2022中启用本机AOT发布时发布失败

C#-如何将int引用获取到byte[]

根据运行时值获取泛型类型的字典