You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC电商站点商品降价用户通知方案及框架咨询

实现电商商品降价推送通知的方案

一、SignalR 实现方案

SignalR完全适配你的场景,它能实现服务器主动向在线客户端推送实时消息,具体实现步骤如下:

1. 项目集成SignalR

  • 在ASP.NET MVC项目中安装SignalR NuGet包:Install-Package Microsoft.AspNet.SignalR
  • 在Startup.cs中注册SignalR路由:
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
    

2. 定义Hub类

创建Hub类处理连接管理与消息推送逻辑:

public class PriceNotificationHub : Hub
{
    // 客户端调用此方法订阅目标商品
    public void SubscribeToProduct(int productId)
    {
        // 将当前客户端连接加入对应商品的分组
        Groups.Add(Context.ConnectionId, $"Product_{productId}");
    }

    // 供服务器端调用,向指定商品分组推送降价通知
    public static void SendPriceDropNotification(int productId, decimal newPrice, decimal oldPrice)
    {
        var hubContext = GlobalHost.ConnectionManager.GetHubContext<PriceNotificationHub>();
        hubContext.Clients.Group($"Product_{productId}").receivePriceDropNotification(new {
            ProductId = productId,
            NewPrice = newPrice,
            OldPrice = oldPrice,
            Message = $"您关注的商品已降价,原价{oldPrice:C},现价{newPrice:C}"
        });
    }
}

3. 前端客户端实现

在商品页面引入SignalR脚本,完成连接、订阅与消息接收:

<script src="~/Scripts/jquery.signalR-2.4.2.min.js"></script>
<script src="~/signalr/hubs"></script>

<script>
    $(function () {
        // 建立Hub连接
        var notificationHub = $.connection.priceNotificationHub;

        // 定义接收通知的回调方法
        notificationHub.client.receivePriceDropNotification = function (notification) {
            // 可根据需求展示通知,比如弹窗、页面消息提示
            alert(notification.Message);
            // 同步更新页面商品价格
            $("#productPrice").text(notification.NewPrice);
        };

        // 启动连接后订阅当前商品
        $.connection.hub.start().done(function () {
            var productId = @Model.ProductId; // 从MVC模型获取当前商品ID
            notificationHub.server.subscribeToProduct(productId);
        });
    });
</script>

4. 触发推送的业务逻辑

在管理员更新商品价格的后台代码中,判断价格下调后调用推送方法:

public void UpdateProductPrice(int productId, decimal newPrice)
{
    var product = _db.Products.Find(productId);
    if (product == null) return;

    decimal oldPrice = product.Price;
    if (newPrice < oldPrice)
    {
        // 价格下调时推送通知
        PriceNotificationHub.SendPriceDropNotification(productId, newPrice, oldPrice);
    }

    product.Price = newPrice;
    _db.SaveChanges();
}

二、其他备选方案

如果对实时性要求不高,或需要补充离线通知,可考虑以下方案:

  • 定时轮询方案:前端定时调用MVC接口,查询关注商品的价格变化。优点是实现简单,无需额外框架;缺点是实时性差,增加服务器请求压力。
  • 异步离线通知:结合Hangfire等后台任务框架,在商品降价时异步向关注用户发送邮件或短信,覆盖用户离线场景。
  • 原生WebSocket实现:直接使用.NET的WebSocket原生支持,但开发成本高于SignalR,SignalR已封装WebSocket、Server-Sent Events等多种传输方式,可自动适配客户端环境。

三、关键注意事项

  • 用户身份校验:在订阅商品时,通过Context.User.Identity验证当前用户是否已关注该商品,避免无效订阅。
  • 分组维护:当用户取消关注商品时,调用Groups.Remove(Context.ConnectionId, $"Product_{productId}")移除对应分组,防止推送无效消息。
  • 异常处理:处理SignalR连接断开、重连场景,确保客户端能自动重新订阅商品。

内容的提问来源于stack exchange,提问作者Ahmet Enes Söylemez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:45:25