Signal R 多个 Web API 请求
Signal R multiple Web API requests
您好有人可以帮助解决我在 SignalR 中的问题我已经创建了一个示例实时数据库我在更改数据库中的某些数据时遇到问题我在 API 中收到多个请求这样可以吗?或者它有性能问题。
enter image description here
我从 API 收到了 1278 个请求,我只更改了数据库中数据的一个值。
我的Sql代码
public IEnumerable<Vehicles> Read(OnChangeEventHandler dependency)
{
var list = new List<Vehicles>();
using (Con)
{
Con.Open();
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.CommandText = _proc.ReadVehicle;
Cmd.Notification = null;
var sqlDependency = new SqlDependency(Cmd);
sqlDependency.OnChange += new OnChangeEventHandler(dependency);
if (Con.State == ConnectionState.Closed)
{
Con.Open();
}
using (var reader = Cmd.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
list.Add(new Vehicles
{
Id = Convert.ToInt16(reader["Id"]),
Car = reader["Car"].ToString(),
Brand = reader["Brand"].ToString(),
Company = reader["Company"].ToString(),
Image = reader["Image"].ToString(),
LifeTime = Convert.ToInt16(reader["LifeTime"]),
Price = Convert.ToDecimal(reader["Price"]),
Type = reader["Type"].ToString(),
Year = reader["Year"].ToString()
});
}
}
}
}
return list;
}
这是我的 API 控制器
[HttpGet]
[Route("")]
public IHttpActionResult Get()
{
var list = this._service.ReadVehicles((e, sqlNotif) =>
{
if (sqlNotif.Type == SqlNotificationType.Change)
{
var hub = new VehicleHub();
hub.GetVehicles();
}
});
return Ok(list);
}
我的 Signal R Hub
[HubName("VehicleHub")]
public class VehicleHub : Hub
{
[HubMethodName("getAllVehicles")]
public void GetVehicles()
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<VehicleHub>();
context.Clients.All.getAllVehicles();
}
}
我的客户端脚本
$(function () {
var vehicles = $.connection.VehicleHub;
vehicles.client.getAllVehicles = function () {
getVehicles()
};
$.connection.hub.start();
getVehicles()
});
function getVehicles() {
var tbl = $('#carTable');
$.ajax({
url: 'http://localhost:62734/api/vehicle',
contentType: 'application/html ; charset:utf-8',
type: 'GET',
dataType: 'json',
success: function (result) {
tbl.empty();
$.each(result, function (key, value) {
tbl.append('<tr>' +
'<td>' + value.Id + '</td>' +
'<td>' + value.Car + '</td>' +
'<td>' + value.Brand + '</td>' +
'<td>' + value.Type + '</td>' +
'</tr>');
}
)
}
});
}
是的,没关系,它显示多个请求的原因是,它使用长池而不是 Web 套接字,在您的本地测试中看起来您没有在 IIS Express 中启用 Web 套接字。
在 Web Sockets 中,一个连接保持打开状态,服务器和客户端可以定期相互 ping 以确保两者都已连接。
长轮询以这种方式工作,打开http连接,客户端等待更新,如果服务器有任何更新,它将向客户端发送更新,或者它最终会关闭并允许客户端重新打开连接以确保他们都还活着。由于服务器无法在长轮询中从客户端接收 ping,因此服务器关闭并客户端重新打开逻辑上用作 ping 以确保两者都已连接的连接。
从 Windows 功能中,您可以为 IIS Express 安装 Web Sockets 支持,这些多连接将被 Web Sockets 取代,您将不会看到很多请求。
您好有人可以帮助解决我在 SignalR 中的问题我已经创建了一个示例实时数据库我在更改数据库中的某些数据时遇到问题我在 API 中收到多个请求这样可以吗?或者它有性能问题。
enter image description here 我从 API 收到了 1278 个请求,我只更改了数据库中数据的一个值。
我的Sql代码
public IEnumerable<Vehicles> Read(OnChangeEventHandler dependency)
{
var list = new List<Vehicles>();
using (Con)
{
Con.Open();
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.CommandText = _proc.ReadVehicle;
Cmd.Notification = null;
var sqlDependency = new SqlDependency(Cmd);
sqlDependency.OnChange += new OnChangeEventHandler(dependency);
if (Con.State == ConnectionState.Closed)
{
Con.Open();
}
using (var reader = Cmd.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
list.Add(new Vehicles
{
Id = Convert.ToInt16(reader["Id"]),
Car = reader["Car"].ToString(),
Brand = reader["Brand"].ToString(),
Company = reader["Company"].ToString(),
Image = reader["Image"].ToString(),
LifeTime = Convert.ToInt16(reader["LifeTime"]),
Price = Convert.ToDecimal(reader["Price"]),
Type = reader["Type"].ToString(),
Year = reader["Year"].ToString()
});
}
}
}
}
return list;
}
这是我的 API 控制器
[HttpGet]
[Route("")]
public IHttpActionResult Get()
{
var list = this._service.ReadVehicles((e, sqlNotif) =>
{
if (sqlNotif.Type == SqlNotificationType.Change)
{
var hub = new VehicleHub();
hub.GetVehicles();
}
});
return Ok(list);
}
我的 Signal R Hub
[HubName("VehicleHub")]
public class VehicleHub : Hub
{
[HubMethodName("getAllVehicles")]
public void GetVehicles()
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<VehicleHub>();
context.Clients.All.getAllVehicles();
}
}
我的客户端脚本
$(function () {
var vehicles = $.connection.VehicleHub;
vehicles.client.getAllVehicles = function () {
getVehicles()
};
$.connection.hub.start();
getVehicles()
});
function getVehicles() {
var tbl = $('#carTable');
$.ajax({
url: 'http://localhost:62734/api/vehicle',
contentType: 'application/html ; charset:utf-8',
type: 'GET',
dataType: 'json',
success: function (result) {
tbl.empty();
$.each(result, function (key, value) {
tbl.append('<tr>' +
'<td>' + value.Id + '</td>' +
'<td>' + value.Car + '</td>' +
'<td>' + value.Brand + '</td>' +
'<td>' + value.Type + '</td>' +
'</tr>');
}
)
}
});
}
是的,没关系,它显示多个请求的原因是,它使用长池而不是 Web 套接字,在您的本地测试中看起来您没有在 IIS Express 中启用 Web 套接字。
在 Web Sockets 中,一个连接保持打开状态,服务器和客户端可以定期相互 ping 以确保两者都已连接。
长轮询以这种方式工作,打开http连接,客户端等待更新,如果服务器有任何更新,它将向客户端发送更新,或者它最终会关闭并允许客户端重新打开连接以确保他们都还活着。由于服务器无法在长轮询中从客户端接收 ping,因此服务器关闭并客户端重新打开逻辑上用作 ping 以确保两者都已连接的连接。
从 Windows 功能中,您可以为 IIS Express 安装 Web Sockets 支持,这些多连接将被 Web Sockets 取代,您将不会看到很多请求。