【问题标题】:Blazor server side problem share javascript codeBlazor 服务器端问题分享 javascript 代码
【发布时间】:2021-06-15 10:17:22
【问题描述】:

我正在使用 Blazor 服务器端开发我的项目。 在开发过程中,我使用 javascript 代码来实现 C# 难以实现的东西。

但是,我正面临一些奇怪的情况。 (我猜这是javascript的问题)

假设有 2 个用户(A,B)。当'A'用户执行一些调用javascript代码的操作时,如果'B'用户进入同一页面,'A'用户的操作会影响'B'用户。

我用threejs 实现了具有3d 场景的网页。正如我上面解释的,当用户“A”使用鼠标事件(mousemove,mousedown..)移动某个对象时,如果用户“B”访问同一页面,则 B 的 3d 对象将移动到用户“A”移动的位置。 原来,当用户访问我开发的网页时,3d对象的位置应该是0,0,0。

我的猜测

  • 我不使用原型或类(全局使用变量和函数。我是 javascript 新手..)
  • Javascript在服务器端运行(共享资源??,如果这样,我该如何解决)

我猜javascript会有问题,但是如果您有其他意见,请分享一下吗?

已编辑

我已经使用DotNetObjectReference.Create(this);解决了这个问题

C#

protected override async Task OnAfterRenderAsync(bool firstRender)
{
    if (firstRender)
    {
        //send created instance to javascript
        var dotNetObjRef = DotNetObjectReference.Create(this);
        await JSRuntime.InvokeVoidAsync("SetObjectRef", dotNetObjRef);
    }
    await base.OnAfterRenderAsync(firstRender);
}

[JSInvokable]
public async Task enableSomething(bool bEnable)
{
   var something = bEnable;
}

//== before edit
//[JSInvokable]
//public static async Task enableSomethingStatic(bool bEnable)
//{   
//    var something = bEnable;
//}

Javascript

var objectRef;
function SetObjectRef(ref) {
    objectRef = ref;
}

//call c# function
objectRef.invokeMethodAsync("enableSomething", true);

我猜这是“静态”方法的问题。 如果您将从 javascript 调用的 C# 方法声明为“静态”并且此方法更改了 UI 变量的某些内容,则此方法可能会影响其他用户。

所以我创建当前页面的实例并将其发送给 javascript,当我需要从 javascript 调用 C# 方法时,我使用创建的实例调用方法。

有什么问题或问题,请分享。 对不起我的英语不好。

【问题讨论】:

    标签: javascript asp.net-core blazor blazor-server-side


    【解决方案1】:

    JavaScript 仅在客户端运行。我看不出两个窗口(更不用说两个用户)如何共享数据了。

    几乎可以肯定,问题在于您正在注入一个单例服务——这意味着服务器将为所有用户使用一个实例。

    如果是这样,您有两个选择:

    (1) 为您的单例服务添加逻辑以合并用户。 (例如,一个字典的用户ID/属性名称作为键,一列作为值)

    (2) 转到Startup.cs 并将可疑单例服务更改为.AddScoped(),这将为每个用户创建一个新实例。

    目前,我认为后一种解决方案将立即解决您的问题。但是,不要低估 Singleton 的价值——它们对于其他事情会非常有用。

    【讨论】:

    • 感谢您的友好指导。我尝试将单例服务更改为addscoped,但没有成功。所以,我一次又一次地环顾我的代码,我发现了一个有问题的部分。我想问题是 [JSInvokable] 函数被声明为“静态”。与 IJSRuntime 不同,它在从 JavaScript 调用 C# 函数时使用。当用户尝试移动 3D 对象以将位置信息发送到 UI 时,它会被调用。从 javascript 调用“静态”函数,这可能是个问题吗?再次感谢您的回答。
    • 哦,这是一个自带变量的静态类吗?为什么不尝试删除静态,将其注册为服务并使用 Scoped 进行依赖注入?基本上——做我认为你已经在做的事情。 :D
    • 嗯..不是类,方法。 [JSInvokable] 这不是一个类,它是一个函数。这用于将 JavaScript 中使用的变量从 JavaScript 传递到 C# 区域。并且应该使用“静态”关键字声明以从 javascript 调用。例如 在 js 中 DotNet.invokeMethodAsync("ProjectName", "setCurrentState", true); 在 C# 中 [JSInvokable] public static async Task setCurrentState(bool bEnable) {... }
    • 我明白了。那么我不得不说我不知道​​为什么这个人在用户中有状态持久性。有什么想法吗?
    • 感谢您的友好回答。我已经解决了这个问题,并在我的问题中写了如何解决它已编辑
    猜你喜欢
    • 2021-02-12
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2021-06-16
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多