В функции Azure, которая возвращает сообщение ServiceBus, как я могу вернуть сообщение условно? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть функция Azure, которая возвращает сообщение служебной шины. Тем не менее, я хочу условно вернуть сообщение служебной шины, вместо того, чтобы каждый раз возвращать его.

Вот пример

[FunctionName("ServiceBusOutput")]
[return: ServiceBus("myqueue", Connection = "ServiceBusConnection")]
public static string ServiceBusOutput([HttpTrigger] dynamic input, ILogger log)
{
    log.LogInformation($"C# function processed: {input.Text}");

    // check condition here, abort return completely

    // Otherwise, return

    return input.Text;
}

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

Одна идея, которая не работает, - это выбросить исключение. Однако это просто приводит к тому, что сообщение помещается в очередь DL. Я хочу полностью прервать операцию возврата сообщения на служебную шину и избежать DL.

Другая идея, которая не работает, состоит в том, чтобы просто выполнить

return;

Но это приводит к ошибке времени компиляции, которая является своего рода ожидаемым "Объект типа, преобразуемого в 'MyReturnType1'требуется "

Я могу вспомнить хак, который мне не нравится, который должен возвращать ноль и обрабатывать нуль позже в цепочке. Но это немного грязно для меня.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Вместо использования выходной привязки, доступной в функции Azure, вы можете отправить сообщение в очередь из пользовательского клиента очереди, созданного внутри функции.

Отправка сообщения на основе условия невозможна с привязками.

0 голосов
/ 06 ноября 2019

Вы можете просто связать ServiceBus как тип MessageSender, а затем использовать метод SendAsync() для отправки сообщения.

Ниже приведен мой тестовый код, если имя запроса равно "george",оно отправит имя в очередь сообщений.

public static class Function1
    {
        [FunctionName("Function1")]
        public static async System.Threading.Tasks.Task RunAsync(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            [ServiceBus("myqueue", Connection = "ServiceBusConnection")] MessageSender messagesQueue,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;
            if (name.Equals("george")) {
                byte[] bytes = Encoding.ASCII.GetBytes(name);
                Message m1 = new Message();
                m1.Body = bytes;
                await messagesQueue.SendAsync(m1);
            }
        }
    }

Предположим, это то, что вы хотите, надеюсь, это поможет вам, если у вас все еще есть другие проблемы, пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...