SignalR C# - 我想知道是否有一个简单的C# SignalR示例,它使用强类型调用客户端方法通过Hub(而不是传递字符串),并且不涉及JavaScript,但客户端代码是C#,最后还有一个API控制器端点暴露给外部调用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);
}
/// <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);
}
}
get ChatHub(): ChatHub {
return <ChatHub>(<any>$.connection).chatHub;
}
现在,通过上述属性,我们可以在TS的IntelliSense下访问服务器和客户端调用的所有方法。
所示示例是实现的框架,但可以给出如何使SignalR强类型化的想法。