SignalR C#(客户端和集线器)-强类型示例

chr*_*ris 6 c# signalr

SignalR C# - 检查是否有人可以将我转发到 C# SignalR 的简单示例,该示例通过集线器使用强类型调用客户端方法(不传递字符串),并且也不涉及 javascript,但客户端使用 C# 编写,最后有一个API 控制器端点公开用于对 Hub 端的外部调用。

Asi*_*sif 9

在 .NET Core Web App 中,您可以像这样注入强类型的 signalR 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" };
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想要教程,可以使用此链接 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);  
 }  
Run Code Online (Sandbox Code Playgroud)

上述接口可以在通用集线器继承上实现。

 /// <summary>  
   /// SignalR Hub for chat application.  
   /// </summary>  
   public class ChatHub  
   : Hub<IChatHub>  
   {  
   }  
Run Code Online (Sandbox Code Playgroud)

在Hub上实现一个接口后,IntelliSense会自动出现。

Clients.Caller.IsTyping("viku"); 
Run Code Online (Sandbox Code Playgroud)

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

客户端的强类型实现。

服务器端和客户端回调的调用需要包装在接口下。这些调用包含有服务器和客户端属性。我们来看看界面。

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);  
         }  
   }  
Run Code Online (Sandbox Code Playgroud)

TypeScript获取的属性可以基于上面的接口创建和解析。

 get ChatHub(): ChatHub {  
           return <ChatHub>(<any>$.connection).chatHub;  
         }  
Run Code Online (Sandbox Code Playgroud)

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

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

  • https://github.com/ieb/SignalR-TypeSafeClient (2认同)