我正在开发一个 Web 服务,该服务存储在 Windows Server 2012 虚拟机上的 Azure 云服务中,该虚拟机使用 SignalR 向连接到 Azure 网站的客户端发送消息。为了测试 SignalR 发送消息的性能,我们设计了一个特殊的端点来模拟发送到客户端的不同消息。
访问端点时,将迭代包含 400 个预定义事件对象的列表。然后将每个对象存储在数据库中,并在存储对象后向客户端发送一条消息,总共应发送 400 条消息。第一条消息到达速度很快,但随后的消息传递速度较慢,所有连接的客户端最多需要 20 分钟(我们目前仅在 Firefox 上打开网站的 5 个客户端进行测试,这对于花了这么长时间)来接收所有的消息。
为了发送消息,我在事件存储到数据库后使用的函数如下所示:
public void SendEvent(string deviceId, Events event)
{
Connection conn = new Connection(url + "/Index");
try
{
conn.Start().Wait();
DevicesDao devicesDao = new DevicesDao();
ClustersDao clustersDao = new ClustersDao();
RegionsDao regionesDao = new RegionsDao();
Devices device= devicesDao.GetDevice(deviceId);
Clusters cluster = clustersDao.GetCluster(device.ClustersClusterId);
List<Devices> devices = cluster.Devices.ToList();
Regions region = regionsDao.GetRegionsById(cluster.RegionsRegionId);
Pin pin = new Pin(device.Latitude, device.Longitude, event.CurrentDate, event.IMax, event.AMax, device.UniqueId, device.Alias, device, cluster, region);
List<Pin> list = new List<Pin>();
list .Add(pin);
var json = new JavaScriptSerializer().Serialize(list);
conn.Send(json).Wait();
}
catch (Exception ex)
{
Debug.WriteLine("Error " + ex.Message + " \n Inner Exception " + ex.InnerException + " \n Stack Trace " + ex.StackTrace);
}
}
在 Javascript 客户端中,我收到如下消息:
connection = $.connection('/Index');
connection.received(function (data) {
if (isSismosShown) {
setPoints(data);
}
});
connection.start().done({transport: 'longPolling'}, function () {
console.log('connection ready');
});
由于 Web 服务存储在 Azure 中,我不知道是否可以从 SignalR 页面尝试性能调整,我没有太多使用 Azure 的经验。我有哪些选择可以提高从 Azure 中的 Web 服务发送消息的速度?