我正在尝试从Azure Function EventHub触发器向Azure SignalR服务发送消息。
我没有异常,甚至没有输出窗口上的信息,我在做什么错了?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.EventHubs;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
using Microsoft.Extensions.Logging;
namespace AzureFunction_EventHubToSignalR
{
public static class Function1
{
[FunctionName("Function1")]
public static async Task Run([EventHubTrigger("dio", Connection = "EventHubSharedAccessPolicyConnectionString")] EventData[] events,
[SignalR(HubName = "%AzureSignalRHubName%")] IAsyncCollector<SignalRMessage> signalRMessages,
ILogger log)
{
var exceptions = new List<Exception>();
foreach (EventData eventData in events)
{
try
{
string messageBody = Encoding.UTF8.GetString(eventData.Body.Array, eventData.Body.Offset, eventData.Body.Count);
await signalRMessages.AddAsync(
new SignalRMessage
{
Target = "BroadcastMessage",
Arguments = new[] { messageBody }
});
await signalRMessages.FlushAsync();
// Replace these two lines with your processing logic.
log.LogInformation($"C# Event Hub trigger function processed a message: {messageBody}");
await Task.Yield();
}
catch (Exception e)
{
log.LogError($"Event Hub trigger failed to process or send a message: {e}");
// We need to keep processing the rest of the batch - capture this exception and continue.
// Also, consider capturing details of the message that failed processing so it can be processed again later.
exceptions.Add(e);
}
}
// Once processing of the batch is complete, if any messages in the batch failed processing throw an exception so that there is a record of the failure.
if (exceptions.Count > 1)
throw new AggregateException(exceptions);
if (exceptions.Count == 1)
throw exceptions.Single();
}
}
}
答案 0 :(得分:0)
由于某种原因,我无法使用SignalR扩展使其工作,而是最终使用了原始SignalR软件包( Microsoft.AspNetCore.SignalR.Client,Microsoft.AspNetCore.SignalR.Client.Core )将消息发送到Azure SignalR服务。
[FunctionName("Function1")]
public static async Task Run([EventHubTrigger("dio", Connection = "EventHubSharedAccessPolicyConnectionString")] EventData[] events,
[SignalRConnectionInfo(HubName = "%AzureSignalRHubName%")] SignalRConnectionInfo connectionInfo,
ILogger log)
{
....
//Build connection with token
HubConnection _connection = new HubConnectionBuilder()
.WithUrl(connectionInfo.Url, option =>
{
option.Headers.Add("Authorization", $"Bearer {connectionInfo.AccessToken}");
})
.Build();
//Start the hub connection
await _connection.StartAsync();
//My Hub has a BroadcastMessage method that receives 2 arguments
await _connection.SendAsync("BroadcastMessage", "test", "test", default);
...
}