【发布时间】:2021-09-30 21:10:49
【问题描述】:
SignalR C# - 检查是否有人可以将我转发到 C# SignalR 的简单示例,该示例通过集线器使用强类型调用客户端方法(不传递字符串),并且不涉及 javascript,但客户端在 C# 和最后有一个 API 控制器端点暴露给 Hub 端的外部调用。
【问题讨论】:
-
请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
SignalR C# - 检查是否有人可以将我转发到 C# SignalR 的简单示例,该示例通过集线器使用强类型调用客户端方法(不传递字符串),并且不涉及 javascript,但客户端在 C# 和最后有一个 API 控制器端点暴露给 Hub 端的外部调用。
【问题讨论】:
在 .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 成为强类型。
【讨论】: