我已经成功地从两侧使用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中,并为该类型添加一个(即Enum 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) {}

10-04 13:42