我正在尝试将消息从Azure函数发送到Azure SignalR服务,并返回415,但是我不确定如何确定问题的原因。
我已经为用户的应用程序前端提供了一个可行的实现,并且用户可以通过SignalR Service广播消息,但是现在我需要一个后端功能来在完成时通知用户。
我遵循的示例是这里的示例; https://github.com/Microsoft/MTC_WhackAMole.NET/blob/master/MoleDeploy.SignalR/AzureSignalR.cs
执行该函数时,它会成功完成SendAsync()函数,但实际上不会触发任何操作。
var payload = new PayloadMessage()
{
Target = methodName,
Arguments = args
};
var url = $"{endpoint}/api/v1/hubs/{hubName}";
var bearer = GenerateJwtBearer(null, url, null, DateTime.UtcNow.AddMinutes(30), accessKey);
await PostJsonAsync(url, payload, bearer);
只有在Postman中尝试相同的请求时,我才收到415错误。
在邮递员中,我要发布到以下网址;
https://xxxxxx.service.signalr.net/api/v1/hubs/{hubName}
使用承载身份验证令牌(据我所知,更改令牌会生成401,与415相对应)
它发送以下有效负载;
{"Target":"hubFunctionName","Arguments":"message to broadcast"}
我不确定是发布的正文。目标应该是集线器中的功能,参数应该是要发送的消息吗?
查看在PostJsonAsync()中发送的有效负载,它显示为;
payload {AzureFunctionName.AzureSignalR.PayloadMessage}
--Arguments {object[1]}
----[0] "message to broadcast"
--Target "hubFunctionName"
集线器中的功能是最基本的;
public void Send(string messageText)
{
Clients.All.broadcastMessage(messageText);
}
如果有人可以为此指出正确的方向,
谢谢, 汤姆
答案 0 :(得分:0)
基于docs,我认为arguments
必须是要发送的一组消息。您能确认要在Postman中进行相同的测试吗?
Azure Functions v2拥有一个Azure SignalR Service Output Binding,您可以直接使用它,而不是自己编写此代码。
答案 1 :(得分:0)
感谢您的回应-我仍在努力争取实现这一功能。
要扩展,我有一个从队列读取的基本Azure函数,我需要它才能将消息发送到我的Signalr服务。
读取队列很简单(并且可行)
public static void Run([QueueTrigger("signalr-messages", Connection = "Azure.Storage.Main")]string myQueueItem, ILogger log)
{
<Deserialise>
SendMessage(message, null);
}
我的SendMessage函数看起来像;
public static Task SendMessage(Message message, [SignalR(HubName = "baseHub")]IAsyncCollector<SignalRMessage> signalRMessages)
{
return signalRMessages.AddAsync(
new SignalRMessage
{
Target = "sendMessage",
Arguments = new[] { message }
});
}
我在SendMessage中传递了“ null”,但是我知道这是错误的-我可以找到的示例来自HTTP触发器而不是队列触发器
我什至会沿着正确的道路走吗?