GVKun编程网logo

javascript – 初始加载和更新之间的SignalR(js首次加载执行)

15

以上就是给各位分享javascript–初始加载和更新之间的SignalR,其中也会对js首次加载执行进行解释,同时本文还将给你拓展asp.netcore3.1SignalR:将复杂对象从javasc

以上就是给各位分享javascript – 初始加载和更新之间的SignalR,其中也会对js首次加载执行进行解释,同时本文还将给你拓展asp.net core 3.1 SignalR:将复杂对象从javascript客户端传递到集线器、asp.net-core-signalr – SignalR Core中的SendAsync和SendCoreAsync方法之间的区别?、asp.net-mvc – 在MVC SignalR服务器和Windows服务SIgnalR客户端之间的SignalR、flash javascript之间的通讯方法小结_javascript技巧等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

javascript – 初始加载和更新之间的SignalR(js首次加载执行)

javascript – 初始加载和更新之间的SignalR(js首次加载执行)

我正在尝试用signalR构建一个应用程序.申请大纲将是:

>从数据库加载初始状态
>订阅成功的消息

我一直在寻找一套最佳实践.如果我在初始加载后订阅更新,则存在丢失更新的风险.在初始加载和订阅之间可能会有更新,我会错过更新.

其次,我可以使用某种对象状态id,然后首先订阅更新流,检索数据,然后在对象落后时应用更新.这需要相当多的代码.

有没有最好的做法来处理这个问题?

解决方法

根据您查询更新的时间,可能会出现错过.例如,假设您的后端查询某些通知并将其推送到客户端,然后用户连接(订阅)通知 – 如果在此初始化阶段发送更新并且错过了您推送的原始数据集可能是陈旧的.

作为最佳做法,我发现废弃发送任何初始数据.相反,请尽快订阅并查询成功连接的更新.例如….

var proxy = $.connection.yourHub;

$.connection.hub.start()
    .done(function () { // <--- immediately call once connected

        // define and call server hub method
        // this will query updates and immediately
        // invoke the associated client function

        proxy.server.queryUpdates();
    })
    .fail(function () {
        console.log('Could not connect!');
    });

proxy.client.serveUpdates = function(updates) {
    // here's your fetched updates on initial connect
}
// YourHub.cs
public void QueryUpdates()
{
    var updates = this.yourService.yourQueryUpdatesmethod();

    Clients.Caller.serveUpdates(updates) // this calls proxy.client.serveUpdates
}

这为您提供了建立连接,监听更新以及在连接时以一次性方式有效提供最新数据集的好处.

请注意,这不一定是SignalR特定的实现.您可以在此.done()回调中进行典型的ajax调用以检索结果,但我不明白为什么您无法重新使用集线器上已有的所有逻辑.您基本上可以通过从客户端显式调用它来调用现有的集线器方法.

asp.net core 3.1 SignalR:将复杂对象从javascript客户端传递到集线器

asp.net core 3.1 SignalR:将复杂对象从javascript客户端传递到集线器

根据您的描述,您应该在ASP.NET Core 3.0 SignalR项目中使用Newtonsoft.Json,因为asp.net核心默认情况下不使用Newtonsoft.Json。

您应该安装Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson NuGet软件包,然后如下所示修改startp.cs ConfigureServices方法:

services.AddSignalR()
    .AddNewtonsoftJsonProtocol();

更多详细信息,您可以参考此article。

asp.net-core-signalr – SignalR Core中的SendAsync和SendCoreAsync方法之间的区别?

asp.net-core-signalr – SignalR Core中的SendAsync和SendCoreAsync方法之间的区别?

当更新到最新版本的ASP Net Core和SignalR核心时,我注意到它们在向客户端发送方法时曾经有两种“发送”方法(曾经是InvokeAsync).

在查看代码注释之后,两个方法在注释中都是相同的,都继承自IClientProxy,并且都接受字符串方法,对象args和取消令牌.

这些方法有什么不同?如果有的话?什么时候应该使用?

解决方法

在 https://github.com/aspnet/SignalR/issues/2239#issuecomment-387854470引用@anurse:

简短的回答是:除非你真的知道你在做什么,否则应该忽略核心方法.

更多背景知识:

我们从SendAsync开始,它接受一组参数发送:

public void SendAsync(string method,object[] args);

Clients.All.SendAsync("Method",new object[] { arg1,arg2,arg3 });

显然,每次都必须创建一个数组是一件痛苦的事.很容易解决的问题是使用参数:

public void SendAsync(string method,params object [] args);

Clients.All.SendAsync("Method",arg1,arg3);

但是,当您确实想要将数组作为单个参数发送时,这会分崩离析

public void SendAsync(string method,params object[] args);

var arg1 = new object[] { a,b,c };

Clients.All.SendAsync("Method",arg1);

// C# 'params' expands this into the below

Clients.All.SendAsync("Method",a,c);

因此,我们不是发送一个数组a,c的单个参数,而是将每个参数作为单独的参数发送.这让用户感到困惑.

所以我们从中删除了params,而是生成了一大堆支持多个参数的扩展方法:

public void SendAsync(string method,object[] args);
public void SendAsync(string method,object arg1) => SendAsync(method,new object[] { arg1 });
public void SendAsync(string method,object arg1,object arg2) => SendAsync(method,arg2 });
// ... etc ...

但是当你有这样的代码时,仍然存在歧义:

public void SendAsync(string method,new object[] { arg1 });

var arg = new object[] { a,c }

Clients.All.SendAsync("method",arg);

同样,将选择带有object []的重载(请参阅SharpLab上的此插图).

因此,我们将一个数组重命名为SendCoreAsync:

public void SendCoreAsync(string method,object arg1) => SendCoreAsync(method,c }

// No ambiguity here!
Clients.All.SendAsync("method",arg);

asp.net-mvc – 在MVC SignalR服务器和Windows服务SIgnalR客户端之间的SignalR

asp.net-mvc – 在MVC SignalR服务器和Windows服务SIgnalR客户端之间的SignalR

我已经知道在这里,我可以在一个普通的 Windows服务中使用SignalR.我想在Windows Server作为SignalR Client和ASP.NET MVC SignalR Server之间进行通信.我用 this hubs guide,说

指定URL的服务器代码

app.MapSignalR("/signalr",new HubConfiguration());

如果我这样做,邮件将在哪里?当您做新的HubConfiguration时,集线器是什么?

它说我可以连接

NET client code that specifies the URL
 var hubConnection = new HubConnection("http://contoso.com/signalr",useDefaultUrl: false);

我会在我的Windows Server中,但是如果我在服务器上发送文本到http://myserver.com/signalr,我该如何得到它?什么中心?

还有哪里最好把它放在Windows服务中?一个很棒的例子

解决方法

这解决了这个问题

在客户端(Windows服务)上:

protected override async void OnStart(string[] args)
        {
            eventLog1.WriteEntry("In OnStart");
            try
            {
                var hubConnection = new HubConnection("http://www.savitassa.com/signalr",useDefaultUrl: false);
                IHubProxy alphaProxy = hubConnection.CreateHubProxy("AlphaHub");

                await hubConnection.Start();

                await alphaProxy.Invoke("Hello","Message from Service");
            }
            catch (Exception ex)
            {
                eventLog1.WriteEntry(ex.Message);
            }
        }

在服务器上:

public class AlphaHub : Hub
    {
        public void Hello(string message)
        {
            // We got the string from the Windows Service 
            // using SignalR. Now need to send to the clients
            Clients.All.addNewMessagetoPage(message);

            // Send message to Windows Service

        }

flash javascript之间的通讯方法小结_javascript技巧

flash javascript之间的通讯方法小结_javascript技巧

不用getURL和fsCommand方法
flash使用的actionscript跟javascript是非常相通的,下面描述如何互相调用函数:
1:javascript调用flash中的函数
在flash的脚本中增加
import flash.external.ExternalInterface;
假定要调用的函数是hello,as代码如下
function hello(){
return "hello";
}
ExternalInterface.addCallback("hello", this, hello);
//第一个参数为导出函数名,第三个参数为as的函数名,这样就可以在js中调用as的hello函数了
2:flash调用js的函数
ExternalInterface.call("hello2", "jacky");
//第一个参数是js的函数名,后面的是js函数的参数
3:如何互相调用
html代码如下:







javascript代码如下:
function callFromFlash() {
var a=thisMovie("test").hello();
alert(a);
}
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName]
}
else {
return document[movieName]
}
}
//注意,不能使用document.getElementById此类函数取得网页中的flash对象,只能使用thisMovie函数中的代码
国外看到的另一种方法:
You can''t call a function, but you can change/set a variable and use the watch() method to execute the code whenever the value is changed.
ActionScript Code:
function changeType(prop, oldval, newval) {
//do your stuff
return newval;
}
var strType = "";
this.watch("strType", changeType);

今天的关于javascript – 初始加载和更新之间的SignalRjs首次加载执行的分享已经结束,谢谢您的关注,如果想了解更多关于asp.net core 3.1 SignalR:将复杂对象从javascript客户端传递到集线器、asp.net-core-signalr – SignalR Core中的SendAsync和SendCoreAsync方法之间的区别?、asp.net-mvc – 在MVC SignalR服务器和Windows服务SIgnalR客户端之间的SignalR、flash javascript之间的通讯方法小结_javascript技巧的相关知识,请在本站进行查询。

本文标签: