SignalR C#(客户端和Hub)-强类型示例

5

SignalR C# - 我想知道是否有一个简单的C# SignalR示例,它使用强类型调用客户端方法通过Hub(而不是传递字符串),并且不涉及JavaScript,但客户端代码是C#,最后还有一个API控制器端点暴露给外部调用Hub端。


请澄清您的具体问题或提供额外的细节,以准确突出您所需的内容。目前的描述不够清晰,很难确定您在询问什么。 - Community
1个回答

10
在.NET Core Web应用程序中,您可以像这样注入强类型信号R hub上下文。
public interface IClient
{
    Task ReceiveMessage(string message);
}

public class DevicesHub : Hub<IClient>
{
}

public class HomeController : ControllerBase
{
    private readonly IHubContext<DevicesHub, IClient> _devicesHub;

    public HomeController(IHubContext<DevicesHub, IClient> devicesHub)
    {
        _devicesHub = devicesHub;
    }       

    [HttpGet]
    public IEnumerable<string> Get()
    {
       _devicesHub.Clients
          .All
          .ReceiveMessage("Message from devices.");

       return new string[] { "value1", "value2" };
    }
}

如果您需要教程,可以使用此链接https://darchuk.net/2019/07/19/signalr-strongly-typed-hubs/

客户端和服务器之间的通信。通常的过程不允许在服务器端和客户端代码中具有强类型调用。我们将了解如何通过接口在服务器端进行强类型调用,并通过TypeScript在客户端端进行。

SignalR - 在服务器端代码上进行强类型化 由于客户端方法的特性非常动态,因此从服务器端调用这些方法的行为类似于允许任何调用。

SignalR Hubs源自Microsoft.AspNet.SignalR.Hub类,也有一个可用于遵循类型项的泛型版本。 例如:

接口是可能在客户端端接收到的调用的复制,并在服务器端代码中调用客户端方法。

/// <summary>  
 /// Client(JS) side chatting interface callbacks.  
 /// </summary>  
 public interface IChatHub  
 {  
      /// <summary>  
      /// Gets the online users.  
      /// </summary>  
      /// <param name="chattingUsers">The chatting users.</param>  
      void GetOnlineUsers(IEnumerable<ChatAvailableUserOrGroup> chattingUsers);  

      /// <summary>  
      /// Determines whether the user is typing.  
      /// </summary>  
      /// <param name="userFullName">Full name of the user.</param>  
      void IsTyping(string userFullName);  

      /// <summary>  
      /// Member initialization through login.  
      /// </summary>  
      /// <param name="isSuccess">if set to <c>true</c> success login.</param>  
      void Login(bool isSuccess);  
 }  

上述接口可以在通用的Hub继承实现。
 /// <summary>  
   /// SignalR Hub for chat application.  
   /// </summary>  
   public class ChatHub  
   : Hub<IChatHub>  
   {  
   }  

在 Hub 上实现接口后,IntelliSense 将自动出现。

Clients.Caller.IsTyping("viku"); 

这就是关于服务器端代码实现的全部内容。

在客户端进行强类型实现。

服务器和客户端回调的调用需要在接口下进行包装。这些调用将使用服务器和客户端属性进行包装。让我们来看一下这个接口。

interface SignalRExtended extends SignalR {  
         chatHub: ChatHub;  
       }  

       interface ChatHub  
         extends HubConnection {  
         client: {  // callbacks on client side through server
           GetOnlineUsers(json: string);  
           ReceiveMessage(message: Model.ChatReceiveMessage);  
           IsTyping(connectionId: string, message: string);  
           Login(): boolean;  
           UserChatHistory(chattingHistory);  
         };  
         server: {  // Calling of server side hubs
           login(): () => void;  
           sendPrivateMessage(toUserId: string, message: string);  
           chatHistory(toUserId: number);  
           groupChatHistory(toGroupId: number);  
           sendGroupMessage(toGroupId: number, message: string);  
           userTyping(targettedUserOrGroup: number, requestType: string);  
           markAsRead(messageIds: Array<number>, targetedUserOrGroup: number, requestType: ChatSourceType);  
         }  
   }  

TypeScript 可以根据上述接口创建和解析属性。
 get ChatHub(): ChatHub {  
           return <ChatHub>(<any>$.connection).chatHub;  
         }  

现在,通过上述属性,我们可以在TS的IntelliSense下访问服务器和客户端调用的所有方法。

所示示例是实现的框架,但可以给出如何使SignalR强类型化的想法。


非常感谢你,Asif。你有没有这个ReceiveMessage方法客户端的例子? - chris
1
我已经更新了我的答案。 - Asif
2
https://github.com/i-e-b/SignalR-TypeSafeClient - Asif
如果我的回答解决了你的问题,那么你应该将其标记为答案。 - Asif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接