415 Неподдерживаемый тип носителя в функции Azure -> Сообщение службы SignalR - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь отправить сообщение из функции 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 ]

0 голосов
/ 15 апреля 2019

Спасибо за ответ - я все еще изо всех сил пытаюсь разобраться с функциональностью для этого, я думаю.

Чтобы расширить, у меня есть базовая функция 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 }
      });
}

Я передаю "null" в SendMessage, однако я знаю, что это неправильно - примеры, которые я могу найти, приходят от триггеров HTTP, а не от триггеров очереди

Я даже иду по правильному пути с этим?

0 голосов
/ 15 апреля 2019

Основываясь на документах , я считаю, arguments должен быть массивом сообщений для отправки.Не могли бы вы подтвердить, что вы тестируете то же самое в Postman.

Кроме того, вместо написания этого кода самостоятельно, Azure Functions v2 имеет привязку вывода службы Azure SignalR , которую можно использовать напрямую.

...