Bom dia, estou desenvolvendo um site para rodar no formato intranet local no IIS
. Com as tecnologias asp.net ADO
no formato WebForms
, Estou utilizando a biblioteca SignalR
para monitorar uma tabela simples no SQL Server Express
via SqlDependency
, que mostra nos clientes notificações igual do topo do site stackoverflow. Os usuários estão autenticados no site via authentication Forms
, a implementação está funcional mas ao startar o site o mesmo vai ficando lento e lento até o travamento. Imagino que o fluxo de chamadas ao banco está congestionando a rede/IIS. Vejam o código da implementação, se alguém pode apontar o que está causando a lentidão.
Classe Hub:
using Microsoft.AspNet.SignalR; using Microsoft.AspNet.SignalR.Hubs; namespace ZaniADV { [HubName("MyHub")] public class MyHub : Hub { public static void Show() { IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); context.Clients.All.displayStatus(); } } }
Classe Statup:
using Microsoft.Owin; using Owin; using Microsoft.AspNet.SignalR; [assembly: OwinStartup(typeof(ZaniADV.Startup))] namespace ZaniADV { public class Startup { public void Configuration(IAppBuilder app) { GlobalHost.Configuration.DefaultMessageBufferSize = 500; app.MapSignalR(); } } }
Global.asax
namespace ZaniADV { public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { SqlDependency.Start(ConfigurationManager.ConnectionStrings ["MyConnectionString"].ConnectionString); } protected void Application_End() { SqlDependency.Stop(ConfigurationManager.ConnectionStrings ["MyConnectionString"].ConnectionString); } } }
Code-Behind pagina MenuNotification.aspx.cs
[WebMethod] public static IEnumerable<Inbox> GetData() { using (var connection = new SqlConnection (ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString)) { connection.Open(); using (var command = new SqlCommand(@"SELECT [IndexID], [Numero] FROM [AdvogadoDB].[dbo].[IndexA] WHERE [AdvogadoID] =" + AdvogadoCRUD.ReturnAdvogadoID((Guid)Membership.GetUser().ProviderUserKey), connection)) { command.Notification = null; SqlDependency.Start( ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString); SqlDependency dependency = new SqlDependency(command); dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); if (connection.State == System.Data.ConnectionState.Closed) connection.Open(); using (var reader = command.ExecuteReader()) return reader.Cast<IDataRecord>() .Select(x => new Inbox() { Numero = x.GetInt32(1), }).ToList(); } } } private static void dependency_OnChange( object sender, SqlNotificationEventArgs e) { MyHub.Show(); } } }
Código javascript do cliente pagina MenuNotification.aspx:
<script src="Scripts/jquery-3.1.1.min.js"></script> <script src="Scripts/jquery.signalR-2.2.2.js"></script> <script src='<%= ResolveClientUrl("~/signalr/hubs") %>'></script> <script type="text/javascript"> $ (function () { var job = $ .connection.MyHub; job.client.displayStatus = function () { getData(); }; $ .connection.hub.start(); getData(); }); function getData() { var $ inbox = $ ('#inbox'); $ .ajax({ url: 'MenuNotification.aspx/GetData', contentType: "application/json; charset=utf-8", dataType: "json", type: "POST", success: function (data) { //debugger; if (data.d.length > 0) { $ inbox.empty(); var newdata = data.d; var rows = []; for (var i = 0; i < newdata.length; i++) { rows.push(newdata[i].Numero); } $ inbox.append(rows.join('')); } } }); } </script> <li class="dropdown tasks-menu" data-toggle="tooltip" data-placement="bottom" title="Últimas mensagens no inbox"> <a href="/ZaniADV/Views/Designar.aspx" target="_parent" class="dropdown-toggle" data-toggle="dropdown"> <img src="/ZaniADV/Image/inbox.png" /> <label id="inbox" class="label label-danger" style="font-size: 12px"></label> </a> </li>
Tabela BD:
ALTER DATABASE AdvogadoBD SET ENABLE_BROKER
Resultado final:
Cliente 1:
Cliente 2: