415 Неподдерживаемый тип носителя в функции Azure -> Сообщение службы SignalR
Я пытаюсь отправить сообщение из функции Azure в службу Azure SignalR и возвращает 415, но не знаю, как определить причину проблемы.
У меня уже есть рабочая реализация для внешнего интерфейса приложения с пользователями и действиями, способными транслировать сообщения через службу SignalR, однако теперь мне нужна функция бэкэнда, чтобы уведомлять пользователей о завершении.
Вот пример, которому я следовал. 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);
}
Если бы кто-то мог указать мне правильное направление с этим, это было бы очень ценно.
Спасибо том
2 ответа
Спасибо за ответ - я все еще изо всех сил пытаюсь понять функциональность этого, я думаю.
Для расширения у меня есть базовая функция Azure, которая читает из очереди, и она мне нужна, чтобы получить сообщение для моей службы сигнализации.
Прочитанная очередь прямолинейна (и работает)
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, однако я знаю, что это неправильно - примеры, которые я могу найти, приходят от триггеров HTTP, а не от триггеров очереди
Я даже иду по правильному пути с этим?
Основываясь на документах, я считаю, arguments
должен быть массив сообщений для отправки вместо. Не могли бы вы подтвердить, что вы тестируете то же самое в Почтальоне?
Кроме того, вместо того, чтобы писать этот код самостоятельно, функции Azure v2 имеют привязку вывода службы Azure SignalR, которую можно использовать напрямую.