【问题标题】:SignalR C# (both client and Hub)-strongly typed exampleSignalR C#(客户端和集线器)- 强类型示例
【发布时间】:2021-09-30 21:10:49
【问题描述】:

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

【问题讨论】:

  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: c# signalr


【解决方案1】:

在 .NET Core Web App 中,您可以像这样注入强类型 signalR 集线器上下文

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 集线器派生自 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);  
 }  

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

 /// <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 访问服务器和客户端调用的所有方法。

显示的示例是实现的 Skelton,但它可以让您了解如何使 SignalR 成为强类型。

【讨论】:

  • 非常感谢阿西夫。您是否有机会为 ReceiveMessage 方法提供客户端的示例?
  • 我已经更新了我的答案
  • 如果我的回答解决了您的问题,那么您应该将其标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多