我是Angular的新手,并且有一个关于在数据库中的数据发生更改时从Web服务检索数据的问题。
我正在处理的系统有2个“部分”:一个运行前台的Windows应用程序(不是Angular)和一个在6个平板电脑上运行的Angular应用程序,位于复杂环境的各个位置。该综合设施非常小,所有系统都具有良好,稳定的网络连接。
前台应用程序(不是Angular)在总公司中运行。它用于在当前客户“签入”到组合系统中时使用当前客户的名称来更新SQL Server数据库,还用于将客户从组合中的一个位置“移动”到另一个位置和/或从中“签出”该客户。大楼。
此应用程序是Windows应用程序,它使用ADO.NET和SQL Server存储过程将数据库直接访问数据库。这是一个旧应用程序,目前无法更改。
另一部分是Angular 6应用程序,可通过网页从6个平板电脑访问它。该功能是允许用户
1)查看当前客户列表及其在综合大楼中的位置
2)将客户从一个位置“移动”到另一个位置
3)从综合大楼“签出”客户。
通过针对特定操作调用RESTful Web服务(用C#和.NET Core编写)来执行操作:
A)获取当前客户及其位置的列表,
B)将客户“移动”到其他位置
C)从复杂的系统“签出”客户
数据存储在SQL Server数据库中。
用户界面使用各种PrimeNG组件(下拉菜单,标签和表格)。
通过阅读各种文章,博客和帖子,在我看来,有一种方法可以在服务器上的数据更改时触发客户端更新,因为主要的“操作方法”示例之一是“聊天”应用程序当有人输入新消息时,它会在应用程序内更新。
我无法确定是什么原因导致客户搬家或退房时如何在平板电脑上进行更新。我曾考虑过使用计时器或刷新,但是如果刷新时在平板电脑上更新客户的位置时,该方法似乎可能会引起问题,如果不更改数据库数据,则会导致大量不必要的流量,否则刷新可能无法在正确的时间进行以显示客户的更改(刷新可以在进行更新之前进行,但是更新在下一次数据库更新之前进行)。
现在,我有一个“刷新”按钮,该按钮调用Web服务以获取客户和位置,但这需要用户手动激活它,他们可能不记得这样做,因此数据不正确。
任何指针将不胜感激。
Angular 6应用程序的结构如下:
1.客户信息(名称,日期,时间)和位置的单独界面
2.一个“数据”服务,调用Web服务以执行特定操作
3.一个“本地”服务,其中包含调用“数据”服务的逻辑,操作从“数据”服务调用返回的数据
4.一个“主”组件,用于处理UI事件,显示错误消息和Toast消息
5. HTML页面即UI
main.component.ts:
this.localService.GetCustomers().subscribe(p => this.people = p);
local.service.ts
GetCustomers(){
this.customers = this.dataService.GetCustomers();
}
data.service.ts
GetCustomers(){
return this.httpClient.get<ICustomer[]>(this.urlBase + this.urlGetCustomers);
}
答案 0 :(得分:1)
您可以使用setInterval像这样在每个时间间隔调用API
[TestFixture(Author = nameof(AuthorName.Eva)),MachineCategory.Filter]
public class FilterTests : WidiaTestSetup
{
[Test, RetryOnFailureOrException]
public void FilterCuttingDiameter()
{ ...}
}
但是,如果并发用户增加,则这种方式调用API并不是与拒绝服务相同的好解决方案。
如果后端是Java,建议您改用Web套接字来实现服务。对于实时请求,它的性能更好。
包裹https://www.npmjs.com/package/websocket
如果您的后端是ASP.NET Web API,则可以使用SignalR软件包https://www.npmjs.com/package/@aspnet/signalr
在这种情况下,我们已经在Author = TestContext.CurrentContext.Test.Properties.Get("Author").ToString()
和TestFixture
之间进行了测试,如果您使用的是WebAPI,浏览器的CPU和内存会快速增加,因此我们选择SignalR作为解决方案。
如果后端始终不变,则可以在后端使用this.interval = setInterval(() => {
this.localService.GetCustomers().subscribe(p => this.people = p);
}, 5000); // 5 second is interval to refresh page
来提高Web服务器的性能。
如果使用SQL Server,则可以使用SQL依赖关系从SQL通知最新更新(添加新客户,更新或删除客户)
有关使用Web API
和SignalR
https://techbrij.com/database-change-notifications-asp-net-signalr-sqldependency
答案 1 :(得分:0)
您可以每X秒进行一次轮询,并根据每个请求更新数据。或者您可以使用网络套接字。
对于第一种方法,请参考此答案https://stackoverflow.com/a/42920844/7179294
另外,请查看此答案以获取更多详细信息https://stackoverflow.com/a/54629027/7179294
答案 2 :(得分:0)
我们通常可以使用websocket将数据从服务器推送到浏览器。在这种情况下,数据源和数据接收方需要与同一台websocket服务器通信,其工作方式类似于发布-订阅模式。如果您无法修改前台应用程序,那么您的问题更多是关于如何触发数据更改事件的。 SQL Server本身无法做到这一点,我看到有人在讨论如何在SQL Server中监视数据更改,但是我没有经验。我认为您需要一个组件来监视数据更改并将数据发送到服务器端的websocket服务器。如果您无法做到这一点,则似乎唯一的选择就是从浏览器中轮询以提取数据。