SignalR服务输出绑定在隔离进程中不起作用



我创建了一个基于ServiceBusTrigger的Azure函数。我想做的是使用触发器并为我的Blazor Server应用程序生成SignalR消息。因此,我创建了以下代码(大致基于此示例(:

public static class InspectionPackageImport
{
[Function("SignalRFunction")]
[SignalROutput(HubName = "import")]
public static MyMessage Run([ServiceBusTrigger("import-request")] string json,
[SignalRConnectionInfoInput(HubName = "import")] MyConnectionInfo connectionInfo,
FunctionContext context)
{
var logger = context.GetLogger("SignalRFunction");
logger.LogInformation(json);
logger.LogInformation($"Connection URL = {connectionInfo.Url}");
var message = $"Output message created at {DateTime.Now}";
return new MyMessage()
{
Target = "Broadcast",
Arguments = new[] { message }
};
}
public class MyConnectionInfo
{
public string Url { get; set; }
public string AccessToken { get; set; }
}
public class MyMessage
{
public string Target { get; set; }
public object[] Arguments { get; set; }
}
}

触发器按预期触发,功能成功完成。但是,似乎没有发送任何消息。我目前正在Azure门户中使用实时跟踪工具(SignalR->诊断设置->打开实时跟踪工具-我已选择连接和消息(。我单击了"捕获",但没有看到任何活动。

我正在使用func start在本地运行我的Azure功能。以下是一些示例输出:

[2021-05-24T05:09:39.149Z] Worker process started and initialized.
[2021-05-24T05:09:43.686Z] Host lock lease acquired by instance ID '00000000000000000000000076775097'.
[2021-05-24T05:09:45.034Z] Executing 'Functions.RequestImport' (Reason='This function was programmatically called via the host APIs.', Id=2fe2d9d1-15dc-425b-852f-31e8227586af)
[2021-05-24T05:09:45.131Z] C# HTTP trigger function processed a request.
[2021-05-24T05:09:45.780Z] Executed 'Functions.RequestImport' (Succeeded, Id=2fe2d9d1-15dc-425b-852f-31e8227586af, Duration=773ms)
[2021-05-24T05:09:45.793Z] Executing 'Functions.SignalRFunction' (Reason='(null)', Id=94c0182d-dc5e-426e-8b91-c21bf62793d6)
[2021-05-24T05:09:45.796Z] Trigger Details: MessageId: c2bbaac3f15447c6b5b43598627f5012, SequenceNumber: 72, DeliveryCount: 1, EnqueuedTimeUtc: 2021-05-24T05:09:45.7390000Z, LockedUntilUtc: 2021-05-24T05:10:15.7390000Z, SessionId: (null)
[2021-05-24T05:09:46.157Z] {
[2021-05-24T05:09:46.160Z]   "Id": "64df027d-92ff-424f-9a04-bd2bf7dbbdda",
[2021-05-24T05:09:46.162Z]   "Name": "Level 2: 'First Graduate - FG0186'"
[2021-05-24T05:09:46.163Z] }
[2021-05-24T05:09:46.166Z] Connection URL = https://xxxx.service.signalr.net/client/?hub=import
[2021-05-24T05:09:46.517Z] Executed 'Functions.SignalRFunction' (Succeeded, Id=94c0182d-dc5e-426e-8b91-c21bf62793d6, Duration=736ms)

首先,我使用了我的Blazor服务器所基于的SignalR实例;"无服务器";模式,以防万一。我唯一没有配置的是上行URL模式。我尽量避免——因为我对ServiceBusTrigger比对SignalRTrigger更感兴趣。

我好像错过了什么?例如,我是否需要一个";协商";作用文件目前还不太清楚。

更多测试

我刚刚在一个独立的过程中创建了一个不是.net 5/的测试函数应用程序。带有广播样本代码的副本:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
namespace FunctionTest
{
public static class Function3
{
[FunctionName("SendMessage")]
public static Task SendMessage(
[HttpTrigger(AuthorizationLevel.Anonymous, "post")] object message,
[SignalR(HubName = "import")] IAsyncCollector<SignalRMessage> signalRMessages)
{
return signalRMessages.AddAsync(
new SignalRMessage
{
Target = "newMessage",
Arguments = new[] { message }
});
}
}
}

通过邮差打电话后,我得到了同样的结果。该功能执行成功,但Live Trace Tool中没有显示任何消息,也没有消息失败的迹象。我不认为这与Azure函数的新版本有关,只有我!我做错了什么?

我缺少的是,我需要将Function App视为SignalR集线器。我调整了我的Blazor应用程序以进行以下连接:

// The url to my local/debug Azure Functions instance:
_hubUrl = "http://localhost:7071/api";
_hubConnection = new HubConnectionBuilder()
.WithUrl(_hubUrl)
.Build();
_hubConnection.On<string, string>("newMessage", BroadcastMessage);
await _hubConnection.StartAsync();

然后我开始接收来自Azure功能的消息。

这意味着我的Blazor应用程序现在正在处理两个SignalR服务。一个用于Blazor服务器(处于"默认"模式(,另一个用于Azure功能(处于"无服务器"模式(。

我想知道是否有一种方法可以共享运行在";默认";模式但这是一个不同的问题

最新更新