繁体   English   中英

Blazor服务器端问题分享javascript代码

[英]Blazor server side problem share javascript code

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

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

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

我用threejs实现了具有3d场景的web页面。 如上所述,当用户“A”使用鼠标事件(mousemove,mousedown..)移动一些 object 时,如果用户“B”访问同一页面,则 B 的 3d 对象将移动到用户“A”移动的位置。 原来,当用户访问我开发的web页面时,3d对象的position应该是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 仅运行客户端。 我看不出两个 windows 会如何共享数据,更不用说两个用户了。

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

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

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

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

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

暂无
暂无

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

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