SignalR:无法访问默认的集线器方法

时间:2019-07-31 08:07:45

标签: c# asp.net-mvc angular asp.net-core signalr

在我的Angular项目中,在我的项目中使用TypedHub接口(称为IDemoHubTypedClient),如下所示:

IDemoHubTypedClient:

router.get

但是,由于我继承自router.get('/add_to_cart/:id', (req, res)=> { //check if cart has an object otherwise pass empty object const productID = req.params.id; console.log(productID); const cart = new Cart(req.session.cart ? req.session.cart : {}); //mysql statement find product by // ID let sql ="SELECT * FROM products WHERE id = ? LIMIT 1"; let query = db.query(sql, id, (err, result)=>{ if(err) throw err; console.log(result); if(result.length){ cart.add(product, product.id); req.session.cart; console.log(req.session.cart); res.redirect("/"); } }); }); 而不是public interface IDemoHubTypedClient { Task BroadcastData(object data); Task SendMessageToClient(string title, string name, string message); } ,因此无法访问默认的中心方法,即Hub<IDemoHubTypedClient>,如下所示,只能访问{{1}中的方法},即HubSendAsync()。当我需要使用此结构来使用DI和TypedHub时,如何解决此问题?是否应在IDemoHubTypedClient中添加所有集线器方法(BroadcastData()等)?如您所知,这些方法只有在客户端使用的密封(我称SendMessageToClient()方法,而该方法实际上在客户端)。有想法吗?

DemoHub:

SendAsync()

2 个答案:

答案 0 :(得分:2)

我认为,如果要使用强类型的集线器,则必须在接口上定义所有客户端方法。 AFAIK无法在强类型集线器和普通集线器之间“混合匹配”。如果您有这样的客户:

this.connection.on('receiveMessage', (message: string) => {
    // Do things
});

this.connection.on('receiveData', (data: MyData, message: string) => {
    // Do things
});

然后,如果要使用强类型集线器,则必须使用使用相同名称和签名(方法名不区分大小写)的方法定义强类型集线器接口:

public interface IDemoClient
{
    Task ReceiveMessage(string message);
    Task ReceiveData(MyData data, string message);
}

优点是您可以写await Clients.All.ReceiveMessage("Hello from server!")而不是await Clients.All.SendAsync("ReceiveMessage", "Hello from server!")。整个要点是,您不必对客户端方法名称进行硬编码,并且可以对方法参数进行其他静态类型检查。

答案 1 :(得分:0)

这不是那么容易。您需要准备好SignalR ConnectionManager(依赖关系注入),并从那里获取键入的HubContext,然后才能访问给定的Hub的功能。 在此处查看更多信息:https://codeopinion.com/practical-asp-net-core-hubcontext/