Signalr 客户端使用抽象模型向服务器推送
Signalr client to server push using abstract model
我已经设法使用双方的 Signalr 建立了通信。从服务器向客户端发送消息时,我使用抽象模型并且在客户端只有一种方法。
我想知道是否有可能从另一端(从客户端到服务器)进行类似的操作,因为到目前为止我无法让它工作。
我的意思是:
服务器端:
public class MyHub : Hub
{
public void HandleNotification(BaseNotification notification)
{
if(notification is NewItemNotification) {
....
} else if (notification is UpdatedItemNotification) {
....
} else if (notification is DeletedItemNotification) {
....
}
}
}
在下面的示例中,我得到一个空的 BaseNotification
对象
我认为这与 Json.Net 库(SignalR 内部使用)的工作方式有关。
当数据以 Json 格式到达服务器时,SignalR 将采用该字符串并将其转换为 BaseNotification
对象。在 Json 中定义但在 BaseNotification
类型中不存在的所有属性都将被忽略。换句话说:BaseNotification
中不存在的属性不会被反序列化。因此,除非两种类型中的 属性 名称相同,否则您的 BaseNotification
无法转换为不同的类型。
我可以为你的情况想出两种不同的解决方案:
a) 在单个对象中包含所有通知属性 Notification
,为类型添加一个(即:枚举 NotificationType
):
public void HandleNotification(Notification notification)
{
switch (notification.Type)
{
case NotificationType.NewItem:
...
case NotificationType.UpdatedItem:
...
case NotificationType.DeletedItem:
...
}
b) 为每种通知类型创建不同的处理方法:
public void HandleNewNotification(NewItemNotification notification) {}
public void HandleUpdatedNotification(UpdatedItemNotification notification) {}
public void HandleDeletedNotification(DeletedItemNotification notification) {}
我已经设法使用双方的 Signalr 建立了通信。从服务器向客户端发送消息时,我使用抽象模型并且在客户端只有一种方法。
我想知道是否有可能从另一端(从客户端到服务器)进行类似的操作,因为到目前为止我无法让它工作。
我的意思是:
服务器端:
public class MyHub : Hub
{
public void HandleNotification(BaseNotification notification)
{
if(notification is NewItemNotification) {
....
} else if (notification is UpdatedItemNotification) {
....
} else if (notification is DeletedItemNotification) {
....
}
}
}
在下面的示例中,我得到一个空的 BaseNotification
对象
我认为这与 Json.Net 库(SignalR 内部使用)的工作方式有关。
当数据以 Json 格式到达服务器时,SignalR 将采用该字符串并将其转换为 BaseNotification
对象。在 Json 中定义但在 BaseNotification
类型中不存在的所有属性都将被忽略。换句话说:BaseNotification
中不存在的属性不会被反序列化。因此,除非两种类型中的 属性 名称相同,否则您的 BaseNotification
无法转换为不同的类型。
我可以为你的情况想出两种不同的解决方案:
a) 在单个对象中包含所有通知属性 Notification
,为类型添加一个(即:枚举 NotificationType
):
public void HandleNotification(Notification notification)
{
switch (notification.Type)
{
case NotificationType.NewItem:
...
case NotificationType.UpdatedItem:
...
case NotificationType.DeletedItem:
...
}
b) 为每种通知类型创建不同的处理方法:
public void HandleNewNotification(NewItemNotification notification) {}
public void HandleUpdatedNotification(UpdatedItemNotification notification) {}
public void HandleDeletedNotification(DeletedItemNotification notification) {}