Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有具有“向服务器返回值”功能的信号器替代方案?_C#_Asp.net Core_Signalr_Ipc_Rpc - Fatal编程技术网

C# 是否有具有“向服务器返回值”功能的信号器替代方案?

C# 是否有具有“向服务器返回值”功能的信号器替代方案?,c#,asp.net-core,signalr,ipc,rpc,C#,Asp.net Core,Signalr,Ipc,Rpc,我的目标是:将数据传递给连接到服务器的特定客户机,并在不调用服务器方法的情况下获得结果 我尝试使用信号器来做这件事,因为它对我来说是一个非常简单的工具,但我现在无法得到结果,我知道为什么了。我正在使用ASP.NET Core 3.1 我的问题:在目标客户机上是否有带参数的返回值到服务器功能调用方法的signar替代方案并获得结果?signar通常用于多个客户机和客户机连接到的单个服务器的设置中。这使得客户端调用服务器并期望返回结果成为一件正常的事情。由于服务器通常并不真正关心连接的是哪些客户端,

我的目标是:将数据传递给连接到服务器的特定客户机,并在不调用服务器方法的情况下获得结果

我尝试使用信号器来做这件事,因为它对我来说是一个非常简单的工具,但我现在无法得到结果,我知道为什么了。我正在使用ASP.NET Core 3.1


我的问题:在目标客户机上是否有带参数的返回值到服务器功能调用方法的signar替代方案并获得结果?

signar通常用于多个客户机和客户机连接到的单个服务器的设置中。这使得客户端调用服务器并期望返回结果成为一件正常的事情。由于服务器通常并不真正关心连接的是哪些客户端,并且由于服务器通常向一组客户端广播(例如使用组),因此通信方向主要用于通知或广播。单目标消息是可能的,但没有用于请求/响应模式的内置机制

为了使signer能够正常工作,您需要有一种方法让客户端回调服务器。因此,您需要一个中心操作来将响应发送到

这本身并不困难,但可能需要将客户端调用与中心接收到的传入结果消息相链接。为此,您必须构建一些东西

下面是一个示例实现,让您开始学习。MyRequestClient是一个单例服务,它基本上封装了消息传递,并为您提供了一个异步方法,该方法将调用客户机,并且只有在客户机通过调用集线器上的回调方法进行响应时才能完成:

公共类MyRequestClient { 私有只读IHubContext\u hubContext; 私有ConcurrentDictionary _pendingtask=新ConcurrentDictionary; 公共MyRequestClientHubContext { _hubContext=hubContext; } 公共异步任务Squarestring连接ID,整数 { var requestId=Guid.NewGuid; var source=新任务完成源; _pendingTasks[requestId]=源; wait_hubContext.Clients.ClientconnectionId.SendAsyncSquare,nameofMyHub.SquareCallback,requestId,number; 返回等待源。任务; } public void SquareCallbackGuid requestId,int result { 如果_pendingTasks.TryRemoverequestId,则out var obj&&obj是TaskCompletionSource source.SetResultresult; } } 在集线器中,然后需要回调操作来调用请求客户端以完成任务:

公共类MyHub:Hub { 专用只读ILogger\u记录器; 私有只读MyRequestClient\u requestClient; 公共MyHubILogger记录器,MyRequestClient { _记录器=记录器; _requestClient=requestClient; } 公共任务SquareCallbackGuid请求ID,整数 { _requestClient.SquareCallbackrequestId,编号; 返回Task.CompletedTask; } //只是为了演示的目的 公共任务启动 { var connectionId=Context.connectionId; _=Task.Runasync=> { var数=42; _logger.LogInformationStarting Square:{Number},Number; var result=await _requestClient.SquareconnectionId,number; _logger.LogInformationSquare返回:{Result},Result; }; 返回Task.CompletedTask; } } 启动集线器操作仅用于演示目的,以便使用有效的连接id启动此操作

在客户端上,然后需要实现客户端方法,并让它在完成后调用指定的回调方法:

connection.on'Square',callbackMethod,requestId,number=>{ 常量结果=编号*编号; connection.invokecallbackMethod,requestId,result; }; 最后,您可以通过客户端调用Start操作来尝试:

调用'Start';
当然,这个实现是非常基本的,需要一些东西,比如正确的错误处理和支持,以便在客户机没有正确响应时超时任务。还可以扩展此功能以支持任意调用,而无需手动创建所有这些方法,例如,在集线器上使用一个能够完成任何任务的回调方法。

Signal通常用于多个客户端和客户端连接到的单台服务器的设置中。这使得客户端调用服务器并期望返回结果成为一件正常的事情。由于服务器通常并不真正关心连接的是哪些客户端,并且由于服务器通常向一组客户端广播(例如使用组),因此通信方向主要用于通知或广播。单目标消息是可能的,但没有用于请求/响应模式的内置机制

为了使这项工作与信号,你将需要有 e客户端回调服务器的方法。因此,您需要一个中心操作来将响应发送到

这本身并不困难,但可能需要将客户端调用与中心接收到的传入结果消息相链接。为此,您必须构建一些东西

下面是一个示例实现,让您开始学习。MyRequestClient是一个单例服务,它基本上封装了消息传递,并为您提供了一个异步方法,该方法将调用客户机,并且只有在客户机通过调用集线器上的回调方法进行响应时才能完成:

公共类MyRequestClient { 私有只读IHubContext\u hubContext; 私有ConcurrentDictionary _pendingtask=新ConcurrentDictionary; 公共MyRequestClientHubContext { _hubContext=hubContext; } 公共异步任务Squarestring连接ID,整数 { var requestId=Guid.NewGuid; var source=新任务完成源; _pendingTasks[requestId]=源; wait_hubContext.Clients.ClientconnectionId.SendAsyncSquare,nameofMyHub.SquareCallback,requestId,number; 返回等待源。任务; } public void SquareCallbackGuid requestId,int result { 如果_pendingTasks.TryRemoverequestId,则out var obj&&obj是TaskCompletionSource source.SetResultresult; } } 在集线器中,然后需要回调操作来调用请求客户端以完成任务:

公共类MyHub:Hub { 专用只读ILogger\u记录器; 私有只读MyRequestClient\u requestClient; 公共MyHubILogger记录器,MyRequestClient { _记录器=记录器; _requestClient=requestClient; } 公共任务SquareCallbackGuid请求ID,整数 { _requestClient.SquareCallbackrequestId,编号; 返回Task.CompletedTask; } //只是为了演示的目的 公共任务启动 { var connectionId=Context.connectionId; _=Task.Runasync=> { var数=42; _logger.LogInformationStarting Square:{Number},Number; var result=await _requestClient.SquareconnectionId,number; _logger.LogInformationSquare返回:{Result},Result; }; 返回Task.CompletedTask; } } 启动集线器操作仅用于演示目的,以便使用有效的连接id启动此操作

在客户端上,然后需要实现客户端方法,并让它在完成后调用指定的回调方法:

connection.on'Square',callbackMethod,requestId,number=>{ 常量结果=编号*编号; connection.invokecallbackMethod,requestId,result; }; 最后,您可以通过客户端调用Start操作来尝试:

调用'Start';
当然,这个实现是非常基本的,需要一些东西,比如正确的错误处理和支持,以便在客户机没有正确响应时超时任务。还可以扩展此功能以支持任意调用,而无需手动创建所有这些方法,例如,在集线器上有一个能够完成任何任务的回调方法。

确保这很容易存档。您只需使用数据调用客户端方法,然后执行所需操作,最后调用服务器方法来传递响应。你的问题到底是什么?如何实现?你是说服务器向特定客户端发起请求什么?客户端应该返回结果?你需要调用客户端从服务器向客户端发送数据,然后在前端执行一些操作并返回结果,对吗?我无法运行其他方法,因为我在特定客户端上调用了方法,通过Web API我的视图仅使用REST API它与Core 2.0一起工作吗?确保这很容易存档。您只需使用数据调用客户端方法,然后执行所需操作,最后调用服务器方法来传递响应。你的问题到底是什么?如何实现?你是说服务器向特定客户端发起请求什么?客户端应该返回结果?你需要调用客户端从服务器向客户端发送数据,然后在前端执行一些操作并返回结果,对吗?我无法运行其他方法,因为我在特定客户端上调用了方法,通过Web API我的视图仅使用REST API它与Core 2.0一起工作吗?回答很好,但OP特别要求信号机备选方案回答很好,但OP特别要求信号机备选方案