signalR 调用服务器方法,该方法在集线器外部调用回调方法。如何从该方法调用客户端函数?
signalR calls a server method and that method calls a callback method ,outside the hub. How can I call client function from that method?
我想处理数据流并需要近乎实时地显示处理后的数据。为此,我创建了一个集线器 class
public class AzureGuidanceEventHubReceiver : Hub
{
EventProcessorHost eventProcessorHost;
public async void ProcessEvents()
{
//Do some code here
eventProcessorHost.RegisterEventProcessorAsync<SimpleEventProcessor>();
}
}
而处理数据的 class 是,
public class SimpleEventProcessor : IEventProcessor
{
public async Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> events)
{
foreach (EventData eventData in events)
{
int data;
var newData = this.DeserializeEventData(eventData);
//how to display newData in the browser????????????????????????????????
}
}
我的客户端代码是
<script type="text/javascript">
$(function () {
var receiverHub= $.connection.azureGuidanceEventHubReceiver;
receiverHub.client.displayMessage = function (data) {
var encodedData = $('<div />').text(data).html();
// Add the message to the page.
$('#discussion').append('<li><strong>' + encodedData + '</li>');
};
//// Start the connection.
$.connection.hub.start().done(function () {
$('#sendmessage').click(function () {
receiverHub.server.processEvents();
});
});
});
在这里,我调用了 Hub class 中的 ProcessEvents 方法并注册了 SimpleEventProcessor。因此执行进入 SimpleEventProcessor 中的 ProcessEventsAsync。从这个 ProcessEventsAsync 方法中,我需要调用客户端代码来显示数据。我是否需要将 SimpleEventProcessor 也作为集线器 class?
您可以使用以下代码获取 HubContext,它允许您从集线器外部调用客户端方法:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<AzureGuidanceEventHubReceiver>();
hubContext.Clients.All.displayMessage(dataToDisplay);
这里我遇到了客户端方法DisplayMessage不是每次都执行的问题。我需要显示消息流。但是当我把调试器放在客户端代码中时,它执行 everytime.Here is my client code.
chat.client.displayMessage = function (data) {
// Html encode display data
debugger;
var encodedData = $('<div />').text(data.GPSPosition).html();
var data = encodedData.split("\n");
var varlat = data[0].replace("Latitude:","").trim();
var varlong = data[1].replace("Longitude:", "").trim();
ShowInGoogleMap(varlat, varlong);
};
如何显示消息流?为什么它只适用于调试器?
我想处理数据流并需要近乎实时地显示处理后的数据。为此,我创建了一个集线器 class
public class AzureGuidanceEventHubReceiver : Hub
{
EventProcessorHost eventProcessorHost;
public async void ProcessEvents()
{
//Do some code here
eventProcessorHost.RegisterEventProcessorAsync<SimpleEventProcessor>();
}
}
而处理数据的 class 是,
public class SimpleEventProcessor : IEventProcessor
{
public async Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> events)
{
foreach (EventData eventData in events)
{
int data;
var newData = this.DeserializeEventData(eventData);
//how to display newData in the browser????????????????????????????????
}
}
我的客户端代码是
<script type="text/javascript">
$(function () {
var receiverHub= $.connection.azureGuidanceEventHubReceiver;
receiverHub.client.displayMessage = function (data) {
var encodedData = $('<div />').text(data).html();
// Add the message to the page.
$('#discussion').append('<li><strong>' + encodedData + '</li>');
};
//// Start the connection.
$.connection.hub.start().done(function () {
$('#sendmessage').click(function () {
receiverHub.server.processEvents();
});
});
});
在这里,我调用了 Hub class 中的 ProcessEvents 方法并注册了 SimpleEventProcessor。因此执行进入 SimpleEventProcessor 中的 ProcessEventsAsync。从这个 ProcessEventsAsync 方法中,我需要调用客户端代码来显示数据。我是否需要将 SimpleEventProcessor 也作为集线器 class?
您可以使用以下代码获取 HubContext,它允许您从集线器外部调用客户端方法:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<AzureGuidanceEventHubReceiver>();
hubContext.Clients.All.displayMessage(dataToDisplay);
这里我遇到了客户端方法DisplayMessage不是每次都执行的问题。我需要显示消息流。但是当我把调试器放在客户端代码中时,它执行 everytime.Here is my client code.
chat.client.displayMessage = function (data) {
// Html encode display data
debugger;
var encodedData = $('<div />').text(data.GPSPosition).html();
var data = encodedData.split("\n");
var varlat = data[0].replace("Latitude:","").trim();
var varlong = data[1].replace("Longitude:", "").trim();
ShowInGoogleMap(varlat, varlong);
};
如何显示消息流?为什么它只适用于调试器?