Client Function Does Not Receive SignalR Call

Controller class Where the hub is defined

public abstract class MonitoringProfileLogChartController : Croem.NotificationManager.Website.Base.BaseController.BaseController { public ActionResult Index() { BusinessLogicReturn result = new ProcessBusinessLogic.Logic().GetRegisteredContexts(); return base.TransalateToAction(result); } public ActionResult LiveMonitoringProfileLogChart() { return View(); } public ActionResult test() { return View(); } **below is rest of the code of controller where our focus should be** public JsonResult GetMonitoringProfileLogChart(string FromDate, string ToDate, int ContextId) { BusinessLogicReturn result = new ProcessBusinessLogic.Logic().GetMonitoringProfileLogChart(FromDate, ToDate, ContextId); return Json(result.Model, JsonRequestBehavior.AllowGet); } public JsonResult GetMonitoringProfileLiveLogChart(string FromTime, string ToTime, string DataMinutes) { BusinessLogicReturn result = new ProcessBusinessLogic.Logic().GetMonitoringProfileLiveLogChart(FromTime, ToTime, DataMinutes); IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); context.Clients.All.addMessage(result.Model); var hub = new MyHub(); hub.Send("", ""); return Json(result.Model, JsonRequestBehavior.AllowGet); } public JsonResult GetMonitoringProfileCombinationChart(string FromTime, string ToTime) { BusinessLogicReturn result = new ProcessBusinessLogic.Logic().GetMonitoringProfileCombinationChart(FromTime, ToTime); return Json(result.Model, JsonRequestBehavior.AllowGet); } } public class MyHub : Hub { IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); public void Send(string name, string message) { BusinessLogicReturn result = new ProcessBusinessLogic.Logic().GetMonitoringProfileLiveLogChart(null, null, null); context.Clients.All.addMessage(result.Model); } public void test() { BusinessLogicReturn result = new ProcessBusinessLogic.Logic().GetMonitoringProfileLiveLogChart(null, null, null); context.Clients.All.addMessage(result.Model); } } 

Console application that is used to map server URLs

 class Program { static void Main(string[] args) { string info = LoggingServer.Open(); Console.WriteLine(info); string url = "http://localhost:8080"; using (WebApp.Start<Startup>(url)) { Console.WriteLine("Server running on {0}", url); var hubs = new Croem.NotificationManager.Website.Base.Controllers.MyHub(); Console.ReadLine(); } LoggingServer.Close(); } class Startup { public void Configuration(IAppBuilder app) { // Turn cross domain on var config = new HubConfiguration { EnableCrossDomain = true }; // This will map out to http://localhost:8080/signalr by default app.MapHubs(config); } } } 

Customer Page

 <!DOCTYPE html> <html> <head> <title>SignalR Live Chat</title> </head> <body> <div class="container"> <input type="text" id="message" /> <input type="button" id="sendmessage" value="Send" /> <input type="hidden" id="displayname" /> <strong>Error Count</strong> <input type="text" id="Error_count" value="0" /> <ul id="discussion"></ul> </div> <!--Script references. --> <!--Reference the jQuery library. --> <script src="Scripts/jquery-1.7.1.min.js"></script> <!--Reference the SignalR library. --> <script src="Scripts/jquery.signalR-1.1.3.js"></script> <!--Reference the autogenerated SignalR hub script. --> <script src="http://localhost:8080/signalr/hubs"></script> <!--Add script to update the page and send messages.--> <script type="text/javascript"> var chart; var timer; $(function () { Highcharts.setOptions({ global: { useUTC: false } }); //Set the hubs URL for the connection $.connection.hub.url = "http://localhost:8080/signalr"; // Declare a proxy to reference the hub. var chat = $.connection.myHub; // Create a function that the hub can call to broadcast messages. chat.client.addMessage = function (data) { dataRecieved(data); clearInterval(timer); timer = setInterval(function () { dataNotRecieved(); }, 10000); }; $.connection.hub.logging = true; $.connection.hub.start().done(function () { $('#sendmessage').click(function () { // Call the Send method on the hub. chat.server.send($('#displayname').val(), $('#message').val()); // Clear text box and reset focus for next comment. $('#message').val('').focus(); }); }); $.ajax({ type: "GET", dataType: "json", data: { DataMinutes: 5, FromTime: null, ToTime: null }, url: "@Url.Action("GetMonitoringProfileLiveLogChart", "MonitoringProfileLogChart")", success: function (data) { chart = new Highcharts.Chart({ chart: { renderTo: 'container', type: 'spline', animation: Highcharts.svg, // don't animate in old IE marginRight: 10, }, title: { text: 'Live Profile Monitoring' }, xAxis: { type: 'datetime', tickPixelInterval: 150 }, yAxis: { title: { text: 'Value' }, plotLines: [{ value: 0, width: 1, color: '#808080' }] }, tooltip: { formatter: function () { return '<b>' + this.series.name + '</b><br/>' + Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' + Highcharts.numberFormat(this.y, 2); } }, legend: { enabled: true }, exporting: { enabled: false }, series: data.series, }); } }); timer = setInterval(function () { dataNotRecieved(); }, 10000); function dataNotRecieved() { var shift = false; for (var j = 0; j < chart.series.length; j++) { if (chart.series[j].data.length < 50) { shift = false; } else { shift = true; } chart.series[j].addPoint([new Date().getTime() - 4 * 1000 * 60 * 60, 0], true, shift); } } function dataRecieved(data) { // checking if series exsist in chart but is not in data coming from ajax call . and if it does not exsist add that series point with zero var series_name_exist = 0; var series_exist = 0; var index = 0; var shift = false; var length = chart.series.length; for (var j = 0; j < chart.series.length; j++) { for (var k = 0; k < data.series.length; k++) { if (chart.series[j].name == data.series[k].name) { series_name_exist = 1; break; } } if (series_name_exist == 0) { if (chart.series[j].data.length < 50) { shift = false; } else { shift = true; } chart.series[j].addPoint([new Date().getTime() - 4 * 1000 * 60 * 60, 0], true, shift); } else { series_name_exist = 0; } } // if series exist add point otherwise add series for (var k = 0; k < data.series.length; k++) { for (var j = 0; j < chart.series.length; j++) { if (chart.series[j].name == data.series[k].name) { series_exist = 1; index = j; break; } } if (series_exist == 1) { if (chart.series[index].data.length < 50) { shift = false; } else { shift = true; } //chart.series[index].addPoint([data.series[k].time, data.series[k].count], true, shift); chart.series[index].addPoint([new Date().getTime() - 4 * 1000 * 60 * 60, data.series[k].count], true, shift); series_exist = 0; } else { chart.addSeries({ name: '' + data.series[k].name + '', data: [] }); //chart.series[length].addPoint([data.series[k].time, data.series[k].count], true); chart.series[length].addPoint([new Date().getTime() - 4 * 1000 * 60 * 60, data.series[k].count], true); length = length + 1; } } } $('#message').focus(); // Start the connection. }); </script> <div id="container" style="min-width: 400px; height: 400px; margin: 0 auto"></div> </body> </html> 

Actual screen screen The 1st class selected is the Console application class that is used to map the server URL. The 2nd class selected is the controller class where the hub is defined. directories

I had a problem when I make a MyHub call object and call it from the controller that calls the function, but on my side nothing is displayed on my page, on the other hand, when I press the submit button on the screen, it calls the same function but the output also displayed on the page. Please tell me why this happens and how to call a function from the controller so that the output is displayed on the HTML page as well. I think that I do not specify the hub URL where it should be written, and why not calling the client side function when I send it directly from the controller class instead of calling the hub function from the client side, because the chat URL on the client side is indicated, and I think that when I call the send function from the client page, the client message is executed. I could not find a way to specify the address for the hub

When I press the submit button on the screen, this message is displayed: SignalR: Triggers the addMessage client hub event on the MyHub hub.

But when I call it directly from the controller in the GetMonitoringProfileLiveLogChart function, this registration message is not displayed.

SignalR Version 1.1.3

+4
source share
1 answer

It seems to me that nothing should be displayed on the page, this is due to the lack of the client side function for your hub connected before the launch of your hub.

Therefore, to fix your problem, simply add the " $.connection.hub.start " function to the client hub before you run $.connection.hub.start :

 chat.client.addMessage = function() {...} $.connection.hub.start().done(function() {...}); 

Then you have a few errors in your code:

  • Basically you do document.ready twice, making $(function() {....}) essentially document.ready, however you also do $(document).ready(function() {...}) inside.
  • In your hub, you send to clients through the hubs context. It works, but there is no need to do it. Your method is not static, and you should just execute Clients.All.addMessage(...) .
+12
source

Source: https://habr.com/ru/post/1497797/


All Articles