【发布时间】:2021-09-26 08:43:49
【问题描述】:
我正在尝试构建一个测试应用程序,以便我的 HTML 页面可以通过 SignalR 向 Azure 函数上的长时间运行方法发送消息,并且长时间运行的函数可以使用 SignalR 将进度报告回 HTML 页面。
有人知道怎么做吗?我在无服务器模式下将 .NET Core 3.1 用于该功能和 Azure SignalR 服务。我在网上四处查看,但似乎都是关于聊天,而我认为这是一个很常见的要求。
这就是我目前所拥有的......
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
namespace AzureSignalRFunctionTest
{
public static class Function1
{
// Input Binding
[FunctionName("negotiate")]
public static SignalRConnectionInfo Negotiate(
[HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequest req,
[SignalRConnectionInfo(HubName = "TestHub")] SignalRConnectionInfo connectionInfo)
{
return connectionInfo;
}
// Trigger Binding
[FunctionName("longrunningtask")]
public static void LongRunningTask([SignalRTrigger("longrunningtask", "messages", "SendMessage")] InvocationContext invocationContext, [SignalRParameter] string message, ILogger logger)
{
logger.LogInformation($"Receive {message} from {invocationContext.ConnectionId}.");
// what to put here?
//var clients = invocationContext.GetClientsAsync().Result;
//ReportProgress(invocationContext.ConnectionId, "Progress", ...);
// Simulate Long running task
System.Threading.Thread.Sleep(30000);
// ReportProgress etc
}
// Output Binding
[FunctionName("reportprogress")]
public static Task ReportProgress(string connectionId, string message,
[SignalR(HubName = "TestHub")] IAsyncCollector<SignalRMessage> signalRMessages)
{
return signalRMessages.AddAsync(
new SignalRMessage
{
ConnectionId = connectionId,
Target = "reportProgress",
Arguments = new[] { message }
});
}
}
}
【问题讨论】:
标签: signalr azure-signalr