我正在Blazor服务器端开发我的项目。在开发过程中,我使用javascript代码来实现C#难以实现的东西。
然而,我面临着一些奇怪的情况。(我想这是javascript的问题(
假设有2个用户(A,B(。当‘A’用户执行某些调用javascript代码的操作时,如果‘B’用户进入同一页面,‘A’的用户操作会影响到‘B’的用户。
我用三个js实现了具有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#方法声明为"static",并且此方法更改了某些UI变量,则此方法可能会影响其他用户。
所以我创建当前页面的实例并将其发送给javascript,当我需要从javascript调用C#方法时,我使用创建的实例调用方法。
如果有任何问题或问题,请分享。抱歉我英语不好。
JavaScript仅运行客户端。我看不出两个窗口,更不用说两个用户,会如何共享数据。
几乎可以肯定的是,问题在于注入了一个单例服务——这意味着服务器将为所有用户使用一个实例。
如果是这样,你有两个选择:
(1( 向您的单例服务添加逻辑以合并用户。(例如,关键字为UserID/Property名称的字典,值为列(
(2( 转到Startup.cs
,将可疑的单例服务更改为.AddScoped((,这将为每个用户创建一个新实例。
目前,我认为后一种解决方案会立即解决你的问题。然而,不要低估辛格尔顿的价值——它们对其他事情非常有用。