簡體   English   中英

SignalR客戶端接收來自儀表板客戶端的呼叫,但不接收來自電子商務客戶端的呼叫

[英]SignalR client side receives calls from dashboard client but not ecommerce client

我有2個共享相同后端服務器(ASP.NET Core)的Vue.js客戶端。 其中一個客戶端是電子商務站點,另一個客戶端是管理訂單的管理儀表板。

我已實現SignalR以允許在訂單儀表板表上實時更新訂單。 當我在管理儀表板上更新訂單狀態時,例如,當從瀏覽器1上的“從交貨中”更新為“已交付”時,當前更新實時工作,而無需刷新瀏覽器,瀏覽器2無需更改即可立即顯示更改刷新頁面。

通過儀表板更新訂單,收到SignalR事件

但是,當我從電子商務網站創建新訂單時,即使我已檢查代碼是否已進入Hub方法以向所有客戶廣播事件和新訂單詳細信息,訂單顯示板仍不會更新/刷新,並且當我檢查開發工具時,它也不會收到任何事件。 我希望在這個問題上有所幫助。

Mounted()中的集線器方法

    // Establish hub connection
    this.connection = await OrderHub.connectToOrderHub();

    // Establish hub methods
    this.connection.on("OneOrder", order => {
      console.log("OneOrder called");
      console.log(order);
      this.getAllOrders();
    });

    this.connection.on("MultipleOrders", orders => {
      console.log("MultipleOrders called");
      console.log(orders);
      this.getAllOrders();
    });

    // start the connection
    this.connection
      .start()
      .then(() => {
        console.log("Connection to hub started");
      })
      .catch(err => console.log(err));

orderHub.js

const signalR = require("@aspnet/signalr");

class OrderHub {
  async connectToOrderHub() {
    return new signalR.HubConnectionBuilder()
      .withUrl("https://localhost:44393/order-hub")
      .configureLogging(signalR.LogLevel.Error)
      .build();
  }
}
export default new OrderHub();

服務器端的OrderHub.cs

public interface IOrderHub
    {
        Task NotifyOneChange(Order newOrder);
        Task NotifyMultipleChanges(List<Order> newOrders);
    }

    public class OrderHub : Hub, IOrderHub
    {
        private readonly IHubContext<OrderHub> _hubContext;

        public OrderHub(IHubContext<OrderHub> hubContext)
        {
            _hubContext = hubContext;
        }

        public async Task NotifyOneChange(Order newOrder)
        {
            await _hubContext.Clients.All.SendAsync("OneOrder", newOrder);
        }

        public async Task NotifyMultipleChanges(List<Order> newOrders)
        {
            await _hubContext.Clients.All.SendAsync("MultipleOrders", newOrders);
        }
    }

創建訂單方法

public async Task<Order> Create(Order order)
        {
            Order newOrder;
            try
            {
                List<string> imgKeys = new List<string>();
                foreach (OrderItem item in order.OrderItems)
                {
                    imgKeys.Add(item.OrderImageKey);
                }

                // make images on s3 permanent
                List<string> imgUrls = await _s3Service.CopyImagesAsync(imgKeys);

                // put the new images url into object
                for (int i = 0; i < order.OrderItems.Count; i++)
                {
                    order.OrderItems.ElementAt(i).OrderImageUrl = imgUrls.ElementAt(i);
                }

                // create new order object to be added
                newOrder = new Order()
                {
                    CreatedAt = DateTime.Now,
                    UpdatedAt = DateTime.Now,
                    OrderSubtotal = decimal.Parse(order.OrderSubtotal.ToString()),
                    OrderTotal = decimal.Parse(order.OrderTotal.ToString()),
                    ReferenceNo = order.ReferenceNo,
                    Request = order.Request,
                    Email = EncryptString(order.EmailString, encryptionKey),
                    UpdatedById = order.UpdatedById,
                    DeliveryTypeId = order.DeliveryTypeId,
                    Address = order.Address,
                    StatusId = 1,
                    OrderItems = order.OrderItems
                };

                // add to database
                await _context.Orders.AddAsync(newOrder);
                await _context.SaveChangesAsync();
            }
            catch (Exception ex)
            {
                throw new AppException("Unable to create product record.", new { message = ex.Message });
            }
            await _orderHub.NotifyOneChange(newOrder); // it steps inside & executes the method, but client side does not receive any events
            // returns product once done
            return newOrder;
        }

我設法弄清了這個問題的原因。 當消息超過一定大小時,SignalR似乎會中斷, 此處引用此問題。 為了解決這個問題,我決定傳遞訂單的ID而不是整個訂單對象,並執行另一個GET調用以在單獨的API調用中檢索詳細信息,以使SignalR消息保持較小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM