Как отправить данные на служебную шину Topi c с функциями Azure? - PullRequest
3 голосов
/ 09 марта 2020

У меня здесь используется HTTP-триггер по умолчанию на основе C#, и я sh отправляю данные "Hello Name" на служебную шину Topi c (уже создана). Я пишу код на портале.

Как это сделать, привязка вывода служебной шины?

Это не работает. Любая помощь доступна?

- Отсутствует ссылка для обработки служебной шины?

- Как определить подключение служебной шины? Где функции. json

-Как отправить сообщение на служебную шину?

//This FunctionApp get triggered by HTTP and send message to Azure Service Bus

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace Company.Function

{
    public static class HttpTriggerCSharp1
{
    [FunctionName("HttpTriggerCSharp1")]
    [return: ServiceBus("myqueue", Connection = "ServiceBusConnection")] // I added this for SB Output. Where to define.

    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        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;
        string responseMessage = string.IsNullOrEmpty(name)
            ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
            : $"Hello, {name}. This HTTP triggered function executed successfully.";
        return new OkObjectResult(responseMessage);
        // I added this for SB Output
        return responseMessage;
    }
}

}

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Во-первых, есть две привязки для отправки данных на служебную шину. Во-первых, то, что вы показываете, используя привязку return, после установки двух пакетов Microsoft.Azure.WebJobs.Extensions.ServiceBus и WindowsAzure.ServiceBus, затем вы сможете отправлять данные. И вы не могли этого сделать, потому что тип вашей функции IActionResult и вы пытаетесь вернуть string (responseMessage).

Так что если вы хотите отправить все responseMessage, просто return new OkObjectResult(responseMessage);, это будет работать. И результат будет выглядеть примерно так: pi c.

enter image description here

И если вы хотите использовать return responseMessage;, следует изменить тип метода на строку, это будет public static async Task<string> RunAsync, а результат будет ниже.

enter image description here

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

[FunctionName("Function1")]
        [return: ServiceBus("myqueue", Connection = "ServiceBusConnection")]
        public static async 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;

            string responseMessage = string.IsNullOrEmpty(name)
                ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
                : $"Hello, {name}. This HTTP triggered function executed successfully.";

            byte[] bytes = Encoding.ASCII.GetBytes(responseMessage);
            Message m1 = new Message(bytes);
            await messagesQueue.SendAsync(m1);

        }

Как определить подключение сервисной шины? Где это функции. json

В локальном вы должны определить соединение в local.settings.jon, вы можете использовать любое имя с соединением, тогда в привязке значение Connection должно быть имя, указанное в файле json. И поскольку вы используете c#, поэтому вы не можете изменить файл function.json, в папке отладки будет файл. json. Таким образом, вы можете изменить только привязку в коде.

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

1 голос
/ 10 марта 2020

Убедитесь, что вы сначала установили Microsoft. Azure .WebJobs.Extensions.ServiceBus Пакет NuGet. Затем убедитесь, что вы используете его в своем проекте:

using Microsoft.Azure.WebJobs.Extensions.ServiceBus;

Убедитесь, что вы очистили и собрали проект, чтобы избежать ошибок.

Затем вам нужно убедиться, что в вашем файле local.settings.json есть строка соединения "ServiceBusConnection":

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "ServiceBusConnection": "Endpoint=sb://...",
  }
}

, которую вы можете получить, если вы go до Azure portal -> Пространство имен служебной шины -> Политики общего доступа -> RootManageSharedAccessKey -> Основная строка подключения . Скопируйте и вставьте эту строку подключения внутрь "ServiceBusConnection". Вы также можете использовать Дополнительную строку подключения .

Примечание: Очереди / темы служебной шины также имеют общие политики доступа. Поэтому, если вы не хотите использовать политики доступа на уровне пространства имен служебной шины, вы можете создать их на уровне очереди / topi c, чтобы ваше функциональное приложение имело доступ только к очереди / topi c, определенной в вашем пространстве имен .

Также, если вы решите опубликовать sh своего функционального приложения, вам необходимо убедиться, что вы создали параметр приложения конфигурации для "ServiceBusConnection", поскольку local.settings.json используется только для локального тестирования.

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