Бөлісу құралы:


Справочник разработчика скрипта C# (CSX) по решению "Функции Azure"

В этой статье содержатся общие сведения о разработке функций Azure с помощью скрипта C# (CSX).

Внимание

Скрипт C# поддерживается в первую очередь, чтобы обеспечить удобный интерфейс на портале, чтобы быстро приступить к созданию и запуску функций C#. Для рабочих приложений следует вместо этого разрабатывать функции C# локально в качестве скомпилированного проекта библиотеки классов C#. Сведения о переносе проекта скрипта C# в проект библиотеки классов C# (изолированной рабочей роли) см. в статье "Преобразование приложения скрипта C# в проект C#".

Функции Azure позволяет разрабатывать функции с помощью C# одним из следующих способов:

Тип Процесс выполнения Расширение кода Среда разработки Справочные материалы
C# (язык сценариев) in-process CSX Портал
Основные инструменты
Эта статья
Библиотека классов C# (изолированная рабочая роль) изолированный рабочий процесс .cs Visual Studio
Visual Studio Code
Основные инструменты
Функции изолированного рабочего процесса .NET
Библиотека классов C# (внутрипроцессная) in-process .cs Visual Studio
Visual Studio Code
Основные инструменты
Функции библиотеки классов C# в процессе

Как работает формат CSX

Данные поступают в функцию C# через аргументы метода. Имена аргументов указываются в файле function.json. Есть предварительно определенные имена для доступа к таким объектам, как средство ведения журнала функций и маркеры отмены.

Формат CSX позволяет писать меньше стандартного кода и сосредоточиться на написании только функции C#. а затем вместо помещения всего кода в пространство имен и класс просто определите метод Run. Как обычно, укажите ссылки на необходимые сборки и пространства имен в начале файла,

Файлы CSX приложения-функции компилируются при инициализации экземпляра. Этот этап компиляции означает, что такие операции, как холодный запуск, могут занимать больше времени при использовании функций скрипта C#, по сравнению с библиотеками классов C#. Этот шаг компиляции также позволяет изменять функции скриптов C# в портал Azure, а библиотеки классов C# не являются.

Структура папок

Структура папок для проекта скрипта C# выглядит следующим образом:

FunctionsProject
 | - MyFirstFunction
 | | - run.csx
 | | - function.json
 | | - function.proj
 | - MySecondFunction
 | | - run.csx
 | | - function.json
 | | - function.proj
 | - host.json
 | - extensions.csproj
 | - bin

Существует общий файл host.json, который можно использовать для настройки приложения-функции. У каждой функции есть собственный файл кода (.csx) и файлом конфигурации привязки (function.json).

Расширения привязки, необходимые в версии 2.x и более поздних среды выполнения функций, определены в файле extensions.csproj с фактическими файлами библиотеки в папке bin. При локальной разработке необходимо зарегистрировать расширения привязки. При разработке функций в портал Azure эта регистрация выполняется для вас.

Привязка к аргументам

Входные или выходные данные привязываются к параметру функции скрипта C# прпи помощи свойства name в файле конфигурации function.json. В следующем примере представлены файлы function.json и run.csx для функции, срабатывающей по запросу. Параметр для получения данных из сообщения очереди называется myQueueItem, так как это значение свойства name.

{
    "disabled": false,
    "bindings": [
        {
            "type": "queueTrigger",
            "direction": "in",
            "name": "myQueueItem",
            "queueName": "myqueue-items",
            "connection":"MyStorageConnectionAppSetting"
        }
    ]
}
#r "Microsoft.WindowsAzure.Storage"

using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Queue;
using System;

public static void Run(CloudQueueMessage myQueueItem, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem.AsString}");
}

Оператор #r описан далее в этой статье.

Поддерживаемые типы для привязок

Для каждой привязки есть собственные поддерживаемые типы. Например, триггер больших двоичных объектов можно использовать со строковым параметром, параметрами POCO, CloudBlockBlob или любым из нескольких других поддерживаемых типов. В справочной статье о привязках для больших двоичных объектов содержится список всех поддерживаемых типов параметров для триггеров больших двоичных объектов. Дополнительные сведения см. в статье о триггерах и привязках и в справочной документации по каждому типу привязки.

Совет

Если вы планируете использовать привязки HTTP или веб-перехватчика, спланируйте работу так, чтобы избежать нехватки портов, которая может возникнуть в результате неправильной установки HttpClient. См. дополнительные сведения об управлении подключениями в службе "Функции Azure".

Ссылки на пользовательские классы

Если нужно использовать пользовательский класс простых старых объектов CLR (POCO), вы можете включить определении класса в тот же файл или поместить его в отдельный файл.

В следующем примере показан пример файла run.csx, содержащего определение класса POCO.

public static void Run(string myBlob, out MyClass myQueueItem)
{
    log.Verbose($"C# Blob trigger function processed: {myBlob}");
    myQueueItem = new MyClass() { Id = "myid" };
}

public class MyClass
{
    public string Id { get; set; }
}

Для каждого свойства класса POCO нужно определить методы получения и задания.

Повторное использование кода CSX

В файле run.csx можно использовать классы и методы, определенные в других CSX-файлах. Для этого используйте директивы #load в файле run.csx. В следующем примере к процедуре ведения журнала с именем MyLogger предоставляется общий доступ в файле myLogger.csx, а также она загружается в файл run.csx. Для этого используется директива #load:

Пример run.csx:

#load "mylogger.csx"

using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, ILogger log)
{
    log.LogInformation($"Log by run.csx: {DateTime.Now}");
    MyLogger(log, $"Log by MyLogger: {DateTime.Now}");
}

Пример mylogger.csx:

public static void MyLogger(ILogger log, string logtext)
{
    log.LogInformation(logtext);
}

Обычно для задания строго типизированных данных, передаваемых между функциями с использованием объекта POCO, применяется общий файл с расширением CSX. В указанном ниже упрощенном примере триггер HTTP и очереди совместно используют объект POCO с именем Order для задания строго типизированных данных о заказах.

Пример файла run.csx для триггера HTTP:

#load "..\shared\order.csx"

using System.Net;
using Microsoft.Extensions.Logging;

public static async Task<HttpResponseMessage> Run(Order req, IAsyncCollector<Order> outputQueueItem, ILogger log)
{
    log.LogInformation("C# HTTP trigger function received an order.");
    log.LogInformation(req.ToString());
    log.LogInformation("Submitting to processing queue.");

    if (req.orderId == null)
    {
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    }
    else
    {
        await outputQueueItem.AddAsync(req);
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
}

Пример файла run.csx для триггера очереди:

#load "..\shared\order.csx"

using System;
using Microsoft.Extensions.Logging;

public static void Run(Order myQueueItem, out Order outputQueueItem, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed order...");
    log.LogInformation(myQueueItem.ToString());

    outputQueueItem = myQueueItem;
}

Пример файла order.csx:

public class Order
{
    public string orderId {get; set; }
    public string custName {get; set;}
    public string custAddress {get; set;}
    public string custEmail {get; set;}
    public string cartId {get; set; }

    public override String ToString()
    {
        return "\n{\n\torderId : " + orderId +
                  "\n\tcustName : " + custName +
                  "\n\tcustAddress : " + custAddress +
                  "\n\tcustEmail : " + custEmail +
                  "\n\tcartId : " + cartId + "\n}";
    }
}

В директиве #load можно использовать относительный путь:

  • #load "mylogger.csx" загружает файл, расположенный в папке функции.
  • #load "loadedfiles\mylogger.csx" загружает файл, расположенный в папке, которая содержится в папке функции.
  • #load "..\shared\mylogger.csx" загружает файл, расположенный в папке на том же уровне, что и папка функции, то есть непосредственно в разделе wwwroot.

Директива #load работает только с CSX-файлами, но не с CS-файлами.

Привязка к возвращаемому значению метода

Используйте возвращаемое значение метода для выходной привязки, указав имя $return в function.json.

{
    "name": "$return",
    "type": "blob",
    "direction": "out",
    "path": "output-container/{id}"
}

Ниже приведен код скрипта C# с помощью возвращаемого значения, за которым следует асинхронный пример:

public static string Run(WorkItem input, ILogger log)
{
    string json = string.Format("{{ \"id\": \"{0}\" }}", input.Id);
    log.LogInformation($"C# script processed queue message. Item={json}");
    return json;
}
public static Task<string> Run(WorkItem input, ILogger log)
{
    string json = string.Format("{{ \"id\": \"{0}\" }}", input.Id);
    log.LogInformation($"C# script processed queue message. Item={json}");
    return Task.FromResult(json);
}

Используйте возвращаемое значение, только если в результате успешного выполнения функции всегда возвращается значение для передачи в привязку для вывода. В противном случае используйте ICollector или IAsyncCollector, как указано в следующем разделе.

Написание нескольких значений выходных данных

Чтобы записать несколько значений в привязку для вывода или если после успешного вызова функции не возвращается значение для передачи в привязку для вывода, используйте типы ICollector или IAsyncCollector. Эти типы представляют собой доступные только для записи коллекции, записываемые в выходную привязку по завершении метода.

В следующем примере записываются несколько сообщений очереди в ту же очередь с помощью ICollector:

public static void Run(ICollector<string> myQueue, ILogger log)
{
    myQueue.Add("Hello");
    myQueue.Add("World!");
}

Ведение журнала

Для записи выходных данных в потоковые журналы в C# включите аргумент с типом ILogger. Рекомендуем присвоить ему имя log. Не используйте Console.Write в Функциях Azure.

public static void Run(string myBlob, ILogger log)
{
    log.LogInformation($"C# Blob trigger function processed: {myBlob}");
}

Примечание.

Дополнительные сведения о новой платформе ведения журналов, которую можно использовать вместо TraceWriter, см. в документации по ILogger в руководстве разработчика библиотеки классов .NET.

Запись в журнал пользовательских метрик

Вы можете использовать метод расширения LogMetric для ILogger, чтобы создать пользовательские метрики в Application Insights. Ниже приведен пример вызова метода.

logger.LogMetric("TestMetric", 1234);

Этот пример кода действует так же, как вызов TrackMetric с использованием API Application Insights для .NET.

Асинхронная

Чтобы сделать функцию асинхронной, используйте ключевое слово async и верните объект Task.

public async static Task ProcessQueueMessageAsync(
        string blobName,
        Stream blobInput,
        Stream blobOutput)
{
    await blobInput.CopyToAsync(blobOutput, 4096);
}

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

Токены отмены

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

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

using System;
using System.IO;
using System.Threading;

public static void Run(
    string inputText,
    TextWriter logger,
    CancellationToken token)
{
    for (int i = 0; i < 100; i++)
    {
        if (token.IsCancellationRequested)
        {
            logger.WriteLine("Function was cancelled at iteration {0}", i);
            break;
        }
        Thread.Sleep(5000);
        logger.WriteLine("Normal processing for queue message={0}", inputText);
    }
}

Импорт пространств имен

Если требуется импортировать пространства имен, это можно сделать как обычно — с помощью предложения using .

using System.Net;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

public static Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger log)

Следующие пространства имен импортируются автоматически и поэтому являются необязательными:

  • System
  • System.Collections.Generic
  • System.IO
  • System.Linq
  • System.Net.Http
  • System.Threading.Tasks
  • Microsoft.Azure.WebJobs
  • Microsoft.Azure.WebJobs.Host

Ссылки на внешние сборки

Для сборок платформы добавьте ссылки с помощью директивы #r "AssemblyName" .

#r "System.Web.Http"

using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

public static Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger log)

Следующие сборки автоматически добавляются средой внешнего размещения Функций Azure:

  • mscorlib
  • System
  • System.Core
  • System.Xml
  • System.Net.Http
  • Microsoft.Azure.WebJobs
  • Microsoft.Azure.WebJobs.Host
  • Microsoft.Azure.WebJobs.Extensions
  • System.Web.Http
  • System.Net.Http.Formatting

На следующие сборки можно ссылаться по простому имени по версии среды выполнения:

  • Newtonsoft.Json
  • Microsoft.WindowsAzure.Storage*

*Удалено в среде выполнения версии 4.x.

В коде сборки ссылаются следующим образом:

#r "AssemblyName"

Ссылки на пользовательские сборки

Чтобы указать ссылку на пользовательские сборки, можно использовать общую или закрытую сборку.

  • Общие сборки совместно используют все функции в приложении-функции. Чтобы ссылаться на пользовательскую сборку, отправьте сборку в папку с именем bin в корневой папке (wwwroot) приложения-функции.

  • Закрытые сборки входят в контекст указанной функции и поддерживают загрузку неопубликованных приложений разных версий. Закрытые сборки необходимо отправить в папку bin в каталоге функции. Укажите ссылки на сборки, используя имя файла, например #r "MyAssembly.dll".

Дополнительные сведения о передаче файлов в папку функции см. в разделе об управлении пакетами.

Каталоги отслеживания

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

Использование пакетов NuGet

Способ добавления пакетов расширений привязки и других пакетов NuGet в приложение-функцию зависит от целевой версии среды выполнения Функций.

По умолчанию поддерживаемый набор NuGet-пакетов расширений Функций предоставляется приложению-функции скрипта C# через пакеты расширений. Дополнительные сведения см. в разделе Пакеты расширений.

Если по какой-либо причине использовать пакеты расширений в проекте нельзя, вы также можете установить расширения на основе привязок, определенных в файлах function.json вашего приложения, с помощью инструментов Azure Functions Core Tools. При использовании Core Tools для регистрации расширений не забывайте о параметре --csx. Дополнительные сведения см. в статье об установке расширений func.

По умолчанию Core Tools считывает файлы function.json и добавляет необходимые пакеты в файл проекта библиотеки классов C# extensions.csproj в корне файловой системы приложения-функции (wwwroot). Так как Core Tools использует dotnet.exe, вы можете добавить в этот файл расширений ссылку на любой пакет NuGet. Во время установки Core Tools создает файл extensions.csproj для установки необходимых библиотек. Ниже приведен пример файла extensions.csproj , который добавляет ссылку на Microsoft.ProjectOxford.Face версии 1.1.0:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.ProjectOxford.Face" Version="1.1.0" />
    </ItemGroup>
</Project>

Примечание.

Для скрипта C# (CSX) необходимо задать TargetFramework значение netstandard2.0. Другие целевые платформы, например net6.0, не поддерживаются.

Чтобы использовать настраиваемый веб-канал NuGet, укажите этот канал в файле Nuget.Config в корневой папке приложения-функции. Дополнительные сведения см. в статье Configuring NuGet behavior (Настройка поведения NuGet).

Если вы работаете над проектом только на портале, необходимо вручную создать файл extensions.csproj или файл Nuget.Config непосредственно на сайте. Дополнительные сведения см. в статье Установка расширений вручную.

Переменные среды

Чтобы получить значение переменной среды или значение параметра приложения, используйте System.Environment.GetEnvironmentVariable, как показано в следующем примере кода.

public static void Run(TimerInfo myTimer, ILogger log)
{
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
    log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
    log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
}

public static string GetEnvironmentVariable(string name)
{
    return name + ": " +
        System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
}

политики повтора;

Функции поддерживают две встроенные политики повторных попыток. Дополнительные сведения см. в разделе Политики повтора.

Политика повтора в файле function.json:

{
    "disabled": false,
    "bindings": [
        {
            ....
        }
    ],
    "retry": {
        "strategy": "fixedDelay",
        "maxRetryCount": 4,
        "delayInterval": "00:00:10"
    }
}
Свойство в function.json Description
бизнеса Используйте fixedDelay.
maxRetryCount Обязательный. Максимальное количество повторных попыток для каждой функции. -1 указывает на неограниченное число попыток.
delayInterval Задержка, используемая между повторными попытками. Укажите его в виде строки с форматом HH:mm:ss.

Привязка во время выполнения

Для C# и других языков .NET можно использовать шаблон императивной привязки, которая отличается от декларативной привязки в файле function.json. Императивную привязку удобно использовать, когда параметры привязки должны вычисляться не при проектировании, а во время выполнения. С использованием такого шаблона можно моментально выполнить привязку к поддерживаемым входным и выходным привязкам в коде функции.

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

  • Не добавляйте запись для нужных императивных привязок в файл function.json.
  • Передайте входной параметр Binder binder или IBinder binder.
  • Используйте следующий шаблон C# для привязки данных,
using (var output = await binder.BindAsync<T>(new BindingTypeAttribute(...)))
{
    ...
}

где BindingTypeAttribute — атрибут .NET, определяющий пользовательскую привязку, а T — входной или выходной тип, поддерживаемый этим типом привязки. T не может быть типом out параметра (например out JObject, ). Например, выходная привязка таблицы мобильных приложений поддерживает шесть выходных типов, но для T можно использовать только ICollector<T> или IAsyncCollector<T>.

Пример с одним атрибутом

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

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;

public static async Task Run(string input, Binder binder)
{
    using (var writer = await binder.BindAsync<TextWriter>(new BlobAttribute("samples-output/path")))
    {
        writer.Write("Hello World!!");
    }
}

BlobAttribute определяет входную или выходную привязку большого двоичного объекта службы хранилища, а TextWriter представляет собой поддерживаемый тип выходной привязки.

Пример с несколькими атрибутами

В предыдущем примере код получает параметр приложения для строки подключения основной учетной записи хранения приложения-функции (т. е. AzureWebJobsStorage). Вы можете указать пользовательский параметр приложения, который следует использовать для учетной записи хранения. Для этого добавьте StorageAccountAttribute и передайте массив атрибутов в BindAsync<T>(). Используйте параметр Binder, а не IBinder. Например:

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;

public static async Task Run(string input, Binder binder)
{
    var attributes = new Attribute[]
    {
        new BlobAttribute("samples-output/path"),
        new StorageAccountAttribute("MyStorageAccount")
    };

    using (var writer = await binder.BindAsync<TextWriter>(attributes))
    {
        writer.Write("Hello World!");
    }
}

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

Привязка Атрибут Добавление ссылки
Azure Cosmos DB Microsoft.Azure.WebJobs.DocumentDBAttribute #r "Microsoft.Azure.WebJobs.Extensions.CosmosDB"
Event Hubs Microsoft.Azure.WebJobs.ServiceBus.EventHubAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttribute #r "Microsoft.Azure.Jobs.ServiceBus"
Мобильные приложения Microsoft.Azure.WebJobs.MobileTableAttribute #r "Microsoft.Azure.WebJobs.Extensions.MobileApps"
Центры уведомлений Microsoft.Azure.WebJobs.NotificationHubAttribute #r "Microsoft.Azure.WebJobs.Extensions.NotificationHubs"
Cлужебная шина Microsoft.Azure.WebJobs.ServiceBusAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttribute #r "Microsoft.Azure.WebJobs.ServiceBus"
Очередь службы хранилища Microsoft.Azure.WebJobs.QueueAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
Большой двоичный объект службы хранилища Microsoft.Azure.WebJobs.BlobAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
Таблица службы хранилища Microsoft.Azure.WebJobs.TableAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
Twilio Microsoft.Azure.WebJobs.TwilioSmsAttribute #r "Microsoft.Azure.WebJobs.Extensions.Twilio"

Преобразование приложения скрипта C# в проект C#

Самый простой способ преобразовать приложение-функцию скрипта C# в скомпилированный проект библиотеки классов C# — начать работу с новым проектом. Затем для каждой функции можно перенести код и конфигурацию из каждого файла run.csx и function.json файла в папке функции в один новый файл кода библиотеки классов .cs. Например, если у вас есть функция скрипта C# с именем HelloWorld два файла: HelloWorld/run.csx и HelloWorld/function.json. Для этой функции создается файл кода с именем HelloWorld.cs в новом проекте библиотеки классов.

Если вы используете скрипты C# для редактирования портала, вы можете скачать содержимое приложения на локальный компьютер. Выберите параметр "Содержимое сайта" вместо проекта Content и Visual Studio. Вам не нужно создавать проект и не включать параметры приложения в скачивание. Вы определяете новую среду разработки, и эта среда не должна иметь те же разрешения, что и среда размещенного приложения.

В этих инструкциях показано, как преобразовать функции скрипта C# (которые выполняются в процессе с узлом функций) в функции библиотеки классов C#, которые выполняются в изолированном рабочем процессе.

  1. Заполните раздел проекта приложения функций из предпочтительного краткого руководства.


  1. Если исходный extensions.csproj код скрипта C# содержит файл или файлы function.proj , скопируйте ссылки на пакет из этого файла и добавьте их в файл нового проекта .csproj в том же случае ItemGroup с основными зависимостями функций.

    Совет

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

  2. Скопируйте содержимое исходного host.json файла в файл нового проекта host.json , за исключением extensionBundles раздела (скомпилированные проекты C# не используют пакеты расширений, и необходимо явно добавить ссылки на все расширения, используемые вашими функциями). При слиянии host.json файлов помните, что host.json схема имеет версию, при этом большинство приложений используют версию 2.0. Содержимое extensions раздела может отличаться в зависимости от определенных версий расширений привязки, используемых вашими функциями. Ознакомьтесь с отдельными справочными статьями по расширению, чтобы узнать, как правильно настроить host.json для конкретных версий.

  3. Для всех общих файлов, на которые ссылается директива#load, создайте новый .cs файл для каждой из этих общих ссылок. Проще всего создать новый .cs файл для каждого определения общего класса. Если есть статические методы без класса, необходимо определить новые классы для этих методов.

  4. Выполните следующие задачи для каждой <FUNCTION_NAME> папки в исходном проекте:

    1. Создайте новый файл с именем <FUNCTION_NAME>.cs, заменив <FUNCTION_NAME> именем папки, которая определила функцию скрипта C#. Вы можете создать файл кода функции из одного из шаблонов триггера следующим образом:

      func new --name <FUNCTION_NAME> Используя команду и выбрав правильный шаблон триггера в командной строке.

    2. using Скопируйте инструкции из run.csx файла и добавьте их в новый файл. Вам не нужны никакие #r директивы.

    3. Для любой #load инструкции в run.csx файле добавьте новую using инструкцию для пространства имен, используемого для общего кода.

    4. В новом файле определите класс для функции в пространстве имен, используемом для проекта.

    5. Создайте новый метод с именем RunHandler или что-то подобное. Этот новый метод служит новой точкой входа для функции.

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

    7. Для каждой привязки function.json в файле добавьте соответствующий атрибут в новый метод. Чтобы быстро найти примеры привязки, см. статью "Вручную добавлять привязки на основе примеров".

    8. Добавьте все пакеты расширений, необходимые привязками к проекту, если вы еще этого не сделали.

  5. Повторно создайте все параметры приложения, необходимые приложению в Values коллекции файла local.settings.json.

  6. Убедитесь, что проект выполняется локально:

    Используется func start для запуска приложения из командной строки. Дополнительные сведения см. в разделе "Локальное выполнение функций".

  7. Опубликуйте проект в новом приложении-функции в Azure:

    Создайте ресурсы Azure и разверните проект кода в Azure с помощью func azure functionapp publish <APP_NAME> команды. Дополнительные сведения см. в разделе Развертывание файлов проекта.

Пример преобразования функций

В этом разделе показан пример миграции для одной функции.

Исходная функция в скриптах C# содержит два файла:

  • HelloWorld/function.json
  • HelloWorld/run.csx

Файл HelloWorld/function.json имеет следующее содержимое:

{
  "bindings": [
    {
      "authLevel": "FUNCTION",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    }
  ]
}

Файл HelloWorld/run.csx имеет следующее содержимое:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(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);
}

После миграции в изолированную рабочую модель с интеграцией ASP.NET Core они заменяются одним HelloWorld.cs:

using System.Net;
using Microsoft.Azure.Functions.Worker;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

namespace MyFunctionApp
{
    public class HelloWorld
    {
        private readonly ILogger _logger;

        public HelloWorld(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<HelloWorld>();
        }

        [Function("HelloWorld")]
        public async Task<IActionResult> RunHandler([HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req)
        {
            return await Run(req, _logger);
        }

        // From run.csx
        public static async Task<IActionResult> Run(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);
        }
    }
}

Конфигурация привязки и примеры

В этом разделе содержатся ссылки и примеры для определения триггеров и привязок в скрипте C#.

Триггер BLOB-объектов

В следующей таблице описываются свойства конфигурации привязки для скрипта C#, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеblobTrigger. Это свойство задается автоматически при создании триггера на портале Azure.
direction Должен иметь значениеin. Это свойство задается автоматически при создании триггера на портале Azure.
name Имя переменной, представляющей большой двоичный объект в коде функции.
path Контейнер для мониторинга. Может быть шаблоном имени большого двоичного объекта.
Подключение Имя параметра или коллекции параметров приложения, указывающих, как подключиться к BLOB-объектам Azure. См. раздел Подключения.

В следующем примере показано определение триггера BLOB-объектов в файле function.json и коде, использующем привязку. Функция делает запись в журнал при добавлении или обновлении большого двоичного объекта в контейнереsamples-workitems.

Данные привязки в файле function.json:

{
    "disabled": false,
    "bindings": [
        {
            "name": "myBlob",
            "type": "blobTrigger",
            "direction": "in",
            "path": "samples-workitems/{name}",
            "connection":"MyStorageAccountAppSetting"
        }
    ]
}

Строка {name} в пути триггера большого двоичного объекта samples-workitems/{name} создает выражение привязки, которое можно использовать в коде функции для получения доступа к имени файла большого двоичного объекта, запускающего триггер. Дополнительные сведения см . в шаблонах имен BLOB-объектов.

Ниже приведен код скрипта C#, который выполняет привязку к Stream.

public static void Run(Stream myBlob, string name, ILogger log)
{
   log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}

Ниже приведен код скрипта C#, который выполняет привязку к CloudBlockBlob.

#r "Microsoft.WindowsAzure.Storage"

using Microsoft.WindowsAzure.Storage.Blob;

public static void Run(CloudBlockBlob myBlob, string name, ILogger log)
{
    log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name}\nURI:{myBlob.StorageUri}");
}

Входные данные BLOB-объектов

В следующей таблице описываются свойства конфигурации привязки для скрипта C#, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеblob.
direction Должен иметь значениеin.
name Имя переменной, представляющей большой двоичный объект в коде функции.
path Путь к BLOB-объекту.
Подключение Имя параметра или коллекции параметров приложения, указывающих, как подключиться к BLOB-объектам Azure. См. раздел Подключения.

В следующем примере показаны входные и выходные привязки больших двоичных объектов в файле function.json и коде скрипта C#, использующем привязки. Функция копирует большой двоичный объект. Она активируется сообщением очереди, содержащим имя копируемого большого двоичного объекта. Новый большой двоичный объект получает имя {originalblobname}-Copy.

В файле function.json свойство метаданных queueTrigger используется для указания имени большого двоичного объекта в свойствах path:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "myOutputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}-Copy",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false
}

Ниже приведен код скрипта C#.

public static void Run(string myQueueItem, string myInputBlob, out string myOutputBlob, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    myOutputBlob = myInputBlob;
}

Выходные данные BLOB-объектов

В следующей таблице описываются свойства конфигурации привязки для скрипта C#, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеblob.
direction Должен иметь значениеout.
name Имя переменной, представляющей большой двоичный объект в коде функции.
path Путь к BLOB-объекту.
Подключение Имя параметра или коллекции параметров приложения, указывающих, как подключиться к BLOB-объектам Azure. См. раздел Подключения.

В следующем примере показаны входные и выходные привязки больших двоичных объектов в файле function.json и коде скрипта C#, использующем привязки. Функция копирует большой двоичный объект. Она активируется сообщением очереди, содержащим имя копируемого большого двоичного объекта. Новый большой двоичный объект получает имя {originalblobname}-Copy.

В файле function.json свойство метаданных queueTrigger используется для указания имени большого двоичного объекта в свойствах path:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "myOutputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}-Copy",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false
}

Ниже приведен код скрипта C#.

public static void Run(string myQueueItem, string myInputBlob, out string myOutputBlob, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    myOutputBlob = myInputBlob;
}

Триггер RabbitMQ

В примере ниже показаны привязка триггера RabbitMQ в файле function.json и функция скрипта C#, которая ее использует. Функция считывает и записывает сообщение RabbitMQ в журнал.

Данные привязки в файле function.json:

{​​
    "bindings": [
        {​​
            "name": "myQueueItem",
            "type": "rabbitMQTrigger",
            "direction": "in",
            "queueName": "queue",
            "connectionStringSetting": "rabbitMQConnectionAppSetting"
        }​​
    ]
}​​

Ниже приведен код скрипта C#.

using System;

public static void Run(string myQueueItem, ILogger log)
{​​
    log.LogInformation($"C# Script RabbitMQ trigger function processed: {​​myQueueItem}​​");
}​​

Триггер очереди

В следующей таблице описываются свойства конфигурации привязки для скрипта C#, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеqueueTrigger. Это свойство задается автоматически при создании триггера на портале Azure.
direction Только в файле function.json. Должен иметь значениеin. Это свойство задается автоматически при создании триггера на портале Azure.
name Имя переменной, содержащей полезные данные элемента очереди в коде функции.
queueName Имя очереди для опроса.
Подключение Имя параметра или коллекции параметров приложения, указывающих, как подключиться к очередям Azure. См. раздел Подключения.

В следующем примере показана привязка триггера очереди в файле function.json и коде скрипта C#, использующем привязку. Эта функция выполняет опрос очереди myqueue-items, а затем делает запись в журнал при каждой обработке элемента очереди.

Ниже показан файл function.json.

{
    "disabled": false,
    "bindings": [
        {
            "type": "queueTrigger",
            "direction": "in",
            "name": "myQueueItem",
            "queueName": "myqueue-items",
            "connection":"MyStorageConnectionAppSetting"
        }
    ]
}

Ниже приведен код скрипта C#.

#r "Microsoft.WindowsAzure.Storage"

using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Queue;
using System;

public static void Run(CloudQueueMessage myQueueItem, 
    DateTimeOffset expirationTime, 
    DateTimeOffset insertionTime, 
    DateTimeOffset nextVisibleTime,
    string queueTrigger,
    string id,
    string popReceipt,
    int dequeueCount,
    ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem.AsString}\n" +
        $"queueTrigger={queueTrigger}\n" +
        $"expirationTime={expirationTime}\n" +
        $"insertionTime={insertionTime}\n" +
        $"nextVisibleTime={nextVisibleTime}\n" +
        $"id={id}\n" +
        $"popReceipt={popReceipt}\n" + 
        $"dequeueCount={dequeueCount}");
}

Выходные данные очереди

В следующей таблице описываются свойства конфигурации привязки для скрипта C#, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеqueue. Это свойство задается автоматически при создании триггера на портале Azure.
direction Должен иметь значениеout. Это свойство задается автоматически при создании триггера на портале Azure.
name Имя переменной, представляющей очередь в коде функции. Задайте значение $return, ссылающееся на возвращаемое значение функции.
queueName Имя очереди.
Подключение Имя параметра или коллекции параметров приложения, указывающих, как подключиться к очередям Azure. См. раздел Подключения.

В следующем примере показана привязка триггера HTTP в файле function.json и коде скрипта C#, использующем привязку. Функция создает элемент очереди с полезными данными объекта CustomQueueMessage для каждого полученного HTTP-запроса.

Ниже показан файл function.json.

{
  "bindings": [
    {
      "type": "httpTrigger",
      "direction": "in",
      "authLevel": "function",
      "name": "input"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "$return",
      "queueName": "outqueue",
      "connection": "MyStorageConnectionAppSetting"
    }
  ]
}

Ниже приведен код скрипта C#, который создает одно сообщение очереди.

public class CustomQueueMessage
{
    public string PersonName { get; set; }
    public string Title { get; set; }
}

public static CustomQueueMessage Run(CustomQueueMessage input, ILogger log)
{
    return input;
}

За один раз можно отправить несколько сообщений с помощью параметра ICollector или IAsyncCollector. Ниже приведен код скрипта C#, который отправляет несколько сообщений (одно — с данными HTTP-запроса, а другое — с кодовыми значениями).

public static void Run(
    CustomQueueMessage input, 
    ICollector<CustomQueueMessage> myQueueItems, 
    ILogger log)
{
    myQueueItems.Add(input);
    myQueueItems.Add(new CustomQueueMessage { PersonName = "You", Title = "None" });
}

Входные данные таблицы

В этом разделе описана поддержка только версии API таблиц расширения .

В следующей таблице описываются свойства конфигурации привязки для скрипта C#, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеtable. Это свойство задается автоматически при создании привязки на портале Azure.
direction Должен иметь значениеin. Это свойство задается автоматически при создании привязки на портале Azure.
name Имя переменной, представляющей таблицу или сущность в коде функции.
tableName Название таблицы.
partitionKey Необязательно. Ключ раздела сущности таблицы, которую нужно считать.
rowKey Необязательно. Ключ строки сущности таблицы, которую нужно считать. Не может использоваться с take или filter.
take Необязательно. Максимальное количество возвращаемых сущностей. Не может использоваться с rowKey.
filter Необязательно. Выражение фильтра OData для сущностей, возвращаемых из таблицы. Не может использоваться с rowKey.
Подключение Имя параметра или коллекции параметров приложения, указывающих, как подключиться к службе таблицы. См. раздел Подключения.

В следующем примере показана входная привязка таблицы в файле function.json и коде скрипта C#, использующем привязку. Функция использует триггер очереди для чтения одной строки таблицы.

Файл function.json определяет partitionKey и rowKey. rowKeyЗначение{queueTrigger} указывает, что ключ строки получен из строки сообщения очереди.

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "personEntity",
      "type": "table",
      "tableName": "Person",
      "partitionKey": "Test",
      "rowKey": "{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    }
  ],
  "disabled": false
}

Ниже приведен код скрипта C#.

#r "Azure.Data.Tables"
using Microsoft.Extensions.Logging;
using Azure.Data.Tables;

public static void Run(string myQueueItem, Person personEntity, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    log.LogInformation($"Name in Person entity: {personEntity.Name}");
}

public class Person : ITableEntity
{
    public string Name { get; set; }

    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public DateTimeOffset? Timestamp { get; set; }
    public ETag ETag { get; set; }
}

Выходные данные таблицы

В этом разделе описана поддержка только версии API таблиц расширения .

В следующей таблице описываются свойства конфигурации привязки для скрипта C#, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеtable. Это свойство задается автоматически при создании привязки на портале Azure.
direction Должен иметь значениеout. Это свойство задается автоматически при создании привязки на портале Azure.
name Имя переменной, используемое в функции кода, которая представляет таблицу или сущность. Задайте значение $return, ссылающееся на возвращаемое значение функции.
tableName Имя таблицы, в которую нужно записать.
partitionKey Ключ раздела сущности таблицы, которую нужно записать.
rowKey Ключ строки сущности таблицы, которую нужно записать.
Подключение Имя параметра или коллекции параметров приложения, указывающих, как подключиться к службе таблицы. См. раздел Подключения.

В следующем примере показана выходная привязка таблицы в файле function.json и коде скрипта C#, использующем привязку. Эта функция записывает несколько сущностей в таблице.

Ниже показан файл function.json.

{
  "bindings": [
    {
      "name": "input",
      "type": "manualTrigger",
      "direction": "in"
    },
    {
      "tableName": "Person",
      "connection": "MyStorageConnectionAppSetting",
      "name": "tableBinding",
      "type": "table",
      "direction": "out"
    }
  ],
  "disabled": false
}

Ниже приведен код скрипта C#.

public static void Run(string input, ICollector<Person> tableBinding, ILogger log)
{
    for (int i = 1; i < 10; i++)
        {
            log.LogInformation($"Adding Person entity {i}");
            tableBinding.Add(
                new Person() { 
                    PartitionKey = "Test", 
                    RowKey = i.ToString(), 
                    Name = "Name" + i.ToString() }
                );
        }

}

public class Person
{
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public string Name { get; set; }
}

Триггер по таймеру

В следующей таблице описываются свойства конфигурации привязки для скрипта C#, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеtimerTrigger. Это свойство задается автоматически при создании триггера на портале Azure.
direction Должен иметь значениеin. Это свойство задается автоматически при создании триггера на портале Azure.
name Имя переменной, представляющей объект таймера в коде функции.
schedule Значение выражения CRON или TimeSpan. TimeSpan можно использовать только для приложения-функции, которая работает в плане службы приложений. Вы можете поместить выражение расписания в параметр приложения и присвоить этому свойству имя параметра приложения, заключенное в знаки %, например: "%ScheduleAppSetting%".
runOnStartup Если настроено значение true, функция вызывается при запуске среды выполнения. Например, среда выполнения запускается, когда приложение-функция выходит из спящего режима (в который она перешла из-за отсутствия активности), При перезапуске приложения-функции из-за изменений функций и при горизонтальном масштабировании приложения-функции. Используйте с осторожностью. runOnStartup редко должен быть установлен true, особенно в рабочей среде.
useMonitor Установите значение true илиfalse, чтобы указать, следует ли отслеживать расписание. При мониторинге расписания его экземпляры сохраняются, чтобы обеспечить его корректную обработку даже при перезапуске экземпляров приложения-функции. Если значение явно не задано, для расписаний с интервалом повторения более чем 1 минута или равным 1 минуте по умолчанию используется true. Для расписаний, выполняющихся чаще одного раза в минуту, значением по умолчанию является false.

В следующем примере показана привязка триггера таймера в файле function.json и функции скрипта C#, использующая привязку. Эта функция выполняет запись в журнал, указывая, когда ее вызов выполняется из-за пропущенного запуска по расписанию. Объект TimerInfo передается в функцию.

Данные привязки в файле function.json:

{
    "schedule": "0 */5 * * * *",
    "name": "myTimer",
    "type": "timerTrigger",
    "direction": "in"
}

Ниже приведен код скрипта C#.

public static void Run(TimerInfo myTimer, ILogger log)
{
    if (myTimer.IsPastDue)
    {
        log.LogInformation("Timer is running late!");
    }
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}" );  
}

Триггер HTTP

В следующей таблице описываются свойства конфигурации триггера, которые задаются в файле function.json.

Свойство в function.json Описание
type Обязательное. Необходимо задать значение httpTrigger.
direction Обязательное. Необходимо задать значение in.
name Обязательное. Имя переменной, из которой в коде функции можно получить запрос или текст запроса.
authLevel Определяет, какие ключи (если они требуются) должны присутствовать в запросе, чтобы вызвать функцию. Поддерживаемые значения см. на уровне авторизации.
methods Массив методов HTTP, на которые отвечает функция. Если свойство не указано, функция отвечает на все методы HTTP. См. раздел Настройка конечной точки HTTP.
маршрут Шаблон маршрута, определяющий URL-адреса запросов, на которые отвечает функция. Если значение не указано, по умолчанию используется <functionname>. См. раздел Настройка конечной точки HTTP.
webHookType Поддерживается только для среды выполнения версии 1.x.

Указывает, что триггер HTTP должен выступать в качестве получателя веб-перехватчика для указанного поставщика. Поддерживаемые значения см. в разделе Тип веб-перехватчика.

В следующем примере показана привязка триггера в файле function.json и функции скрипта C#, использующая привязку. В функции выполняется поиск параметра name в строке запроса или в тексте HTTP-запроса.

Ниже показан файл function.json.

{
    "disabled": false,
    "bindings": [
        {
            "authLevel": "function",
            "name": "req",
            "type": "httpTrigger",
            "direction": "in",
            "methods": [
                "get",
                "post"
            ]
        },
        {
            "name": "$return",
            "type": "http",
            "direction": "out"
        }
    ]
}

Ниже приведен код сценария C#, который выполняет привязку к HttpRequest:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];
    
    string requestBody = String.Empty;
    using (StreamReader streamReader =  new  StreamReader(req.Body))
    {
        requestBody = await streamReader.ReadToEndAsync();
    }
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;
    
    return name != null
        ? (ActionResult)new OkObjectResult($"Hello, {name}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

Вы можете выполнить привязку к пользовательскому объекту вместо HttpRequest. Этот объект создается из текста запроса и анализируется как JSON. Аналогичным образом тип можно передать в привязку вывода ответа HTTP. Результатом будет текст ответа с кодом состояния 200.

using System.Net;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

public static string Run(Person person, ILogger log)
{   
    return person.Name != null
        ? (ActionResult)new OkObjectResult($"Hello, {person.Name}")
        : new BadRequestObjectResult("Please pass an instance of Person.");
}

public class Person {
     public string Name {get; set;}
}

Выходные данные HTTP

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json.

Свойство Описание
type Должен иметь значениеhttp.
direction Должен иметь значениеout.
name Имя переменной, используемое в коде функции для ответа, или $return для использования возвращаемого значения.

Триггер Центров событий

В следующей таблице описываются свойства конфигурации триггера, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеeventHubTrigger. Это свойство задается автоматически при создании триггера на портале Azure.
direction Должен иметь значениеin. Это свойство задается автоматически при создании триггера на портале Azure.
name Имя переменной, представляющей элемент события в коде функции.
eventHubName Функции 2.x и более поздних версий. Имя концентратора событий. Если имя концентратора событий указано также в строке подключения, такое значение переопределяет это свойство во время выполнения. Можно ссылаться с помощью параметров %eventHubName%приложения. В версии 1.x это свойство называется path.
consumerGroup Необязательное свойство, которое используется для задания группы потребителей, используемой для подписки на события в концентраторе. Если аргумент опущен, используется группа потребителей $Default.
Подключение Имя параметра или коллекции параметров приложения, указывающих, как подключиться к центрам событий. См. раздел Подключения.

В следующем примере показана привязка триггера центров событий в файле function.json и функции скрипта C#, использующая привязку. Эта функция записывает в журнал текст сообщений триггера центров событий.

В следующих примерах показаны данные привязки центров событий в файле function.json для среды выполнения Функций версии 2.x и более поздних.

{
  "type": "eventHubTrigger",
  "name": "myEventHubMessage",
  "direction": "in",
  "eventHubName": "MyEventHub",
  "connection": "myEventHubReadConnectionAppSetting"
}

Ниже приведен код скрипта C#.

using System;

public static void Run(string myEventHubMessage, TraceWriter log)
{
    log.Info($"C# function triggered to process a message: {myEventHubMessage}");
}

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

#r "Microsoft.Azure.EventHubs"

using System.Text;
using System;
using Microsoft.ServiceBus.Messaging;
using Microsoft.Azure.EventHubs;

public void Run(EventData myEventHubMessage,
    DateTime enqueuedTimeUtc,
    Int64 sequenceNumber,
    string offset,
    TraceWriter log)
{
    log.Info($"Event: {Encoding.UTF8.GetString(myEventHubMessage.Body)}");
    log.Info($"EnqueuedTimeUtc={myEventHubMessage.SystemProperties.EnqueuedTimeUtc}");
    log.Info($"SequenceNumber={myEventHubMessage.SystemProperties.SequenceNumber}");
    log.Info($"Offset={myEventHubMessage.SystemProperties.Offset}");

    // Metadata accessed by using binding expressions
    log.Info($"EnqueuedTimeUtc={enqueuedTimeUtc}");
    log.Info($"SequenceNumber={sequenceNumber}");
    log.Info($"Offset={offset}");
}

Для пакетного получения событий создайте массив string или EventData.

public static void Run(string[] eventHubMessages, TraceWriter log)
{
    foreach (var message in eventHubMessages)
    {
        log.Info($"C# function triggered to process a message: {message}");
    }
}

Выходные данные Центров событий

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеeventHub.
direction Должен иметь значениеout. Этот параметр задается автоматически при создании привязки на портале Azure.
name Имя переменной, используемое в коде функции, которая представляет событие.
eventHubName Функции 2.x и более поздних версий. Имя концентратора событий. Если имя концентратора событий указано также в строке подключения, такое значение переопределяет это свойство во время выполнения. В службе "Функции" версии 1.x это свойство называется path.
Подключение Имя параметра или коллекции параметров приложения, указывающих, как подключиться к центрам событий. Дополнительные сведения см. в разделе Подключения.

В следующем примере показана привязка триггера концентратора событий в файле function.json и функция скрипта C#, использующая привязку. Эта функция записывает сообщение в концентратор событий.

В следующих примерах показаны данные привязки центров событий в файле function.json для среды выполнения Функций версии 2.x и более поздних.

{
    "type": "eventHub",
    "name": "outputEventHubMessage",
    "eventHubName": "myeventhub",
    "connection": "MyEventHubSendAppSetting",
    "direction": "out"
}

Ниже приведен код сценария C#, который создает одно сообщение.

using System;
using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, out string outputEventHubMessage, ILogger log)
{
    String msg = $"TimerTriggerCSharp1 executed at: {DateTime.Now}";
    log.LogInformation(msg);   
    outputEventHubMessage = msg;
}

Ниже приведен код сценария C#, который создает несколько сообщений.

public static void Run(TimerInfo myTimer, ICollector<string> outputEventHubMessage, ILogger log)
{
    string message = $"Message created at: {DateTime.Now}";
    log.LogInformation(message);
    outputEventHubMessage.Add("1 " + message);
    outputEventHubMessage.Add("2 " + message);
}

Триггер Сетки событий

В следующей таблице описываются свойства конфигурации привязки для скрипта C#, которые задаются в файле function.json. В атрибуте EventGridTrigger не задаются параметры или свойства конструкции.

Свойство в function.json Описание
type Обязательное. Необходимо задать значение eventGridTrigger.
direction Обязательное. Необходимо задать значение in.
name Обязательное. Имя переменной, используемой в коде функции, для параметра, получающего данные события.

В следующем примере показан триггер сетки событий, определенный в файле function.json.

Данные привязки в файле function.json:

{
  "bindings": [
    {
      "type": "eventGridTrigger",
      "name": "eventGridEvent",
      "direction": "in"
    }
  ],
  "disabled": false
}

Далее приведен пример функции скрипта C#, которая использует параметр привязки EventGridEvent:

#r "Azure.Messaging.EventGrid"
using Azure.Messaging.EventGrid;
using Microsoft.Extensions.Logging;

public static void Run(EventGridEvent eventGridEvent, ILogger log)
{
    log.LogInformation(eventGridEvent.Data.ToString());
}

Далее приведен пример функции скрипта C#, которая использует параметр привязки JObject:

#r "Newtonsoft.Json"

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public static void Run(JObject eventGridEvent, TraceWriter log)
{
    log.Info(eventGridEvent.ToString(Formatting.Indented));
}

Выходные данные сетки событий

В следующей таблице описываются свойства конфигурации привязки для скрипта C#, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеeventGrid.
direction Должен иметь значениеout. Этот параметр задается автоматически при создании привязки на портале Azure.
name Имя переменной, используемое в коде функции, которая представляет событие.
topicEndpointUri Имя параметра приложения, содержащего URI для пользовательского раздела, например MyTopicEndpointUri.
topicKeySetting Имя параметра приложения, содержащего ключ доступа для пользовательского раздела.

В приведенных ниже примерах показаны данные выходной привязки Сетки событий в файле function.json.

{
    "type": "eventGrid",
    "name": "outputEvent",
    "topicEndpointUri": "MyEventGridTopicUriSetting",
    "topicKeySetting": "MyEventGridTopicKeySetting",
    "direction": "out"
}

Ниже приведен код скрипта C#, который создает одно событие:

#r "Microsoft.Azure.EventGrid"
using System;
using Microsoft.Azure.EventGrid.Models;
using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, out EventGridEvent outputEvent, ILogger log)
{
    outputEvent = new EventGridEvent("message-id", "subject-name", "event-data", "event-type", DateTime.UtcNow, "1.0");
}

Ниже приведен код скрипта C#, который создает несколько событий:

#r "Microsoft.Azure.EventGrid"
using System;
using Microsoft.Azure.EventGrid.Models;
using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, ICollector<EventGridEvent> outputEvent, ILogger log)
{
    outputEvent.Add(new EventGridEvent("message-id-1", "subject-name", "event-data", "event-type", DateTime.UtcNow, "1.0"));
    outputEvent.Add(new EventGridEvent("message-id-2", "subject-name", "event-data", "event-type", DateTime.UtcNow, "1.0"));
}

Триггер служебной шины

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеserviceBusTrigger. Это свойство задается автоматически при создании триггера на портале Azure.
direction Должен иметь значениеin. Это свойство задается автоматически при создании триггера на портале Azure.
name Имя переменной, представляющей сообщение очереди или раздела в коде функции.
queueName Имя очереди для отслеживания. Задается только в том случае, если отслеживается очередь, но не раздел.
topicName Имя отслеживаемого раздела. Задается только в том случае, если отслеживается раздел, но не очередь.
subscriptionName Имя отслеживаемой подписки. Задается только в том случае, если отслеживается раздел, но не очередь.
Подключение Имя параметра или коллекции параметров приложения, указывающих, как подключиться к служебной шине. См. раздел Подключения.
accessRights Права доступа для строки подключения. Доступные значения: manage и listen. Значение по умолчанию — manage. Это означает, что у свойства connection есть разрешение на управление. При использовании строки подключения без разрешения на управление задайте для свойства accessRights значение "listen". В противном случае выполнение операций, для которых требуются права на управление, в среде выполнения Функций Azure может завершиться ошибкой. В Функциях Azure версии 2.x и более поздних это свойство недоступно, так как последняя версия пакета SDK Служебной шины не поддерживает операции управления.
isSessionsEnabled true при подключении к очереди или подписке с поддержкой сеансов. false в противном случае (значение по умолчанию).
autoComplete true, когда триггер должен автоматически вызывать завершение после обработки, в противном случае код функции будет вызывать завершение вручную.

Значение false поддерживается только в C#.

Если установлено значение true, триггер автоматически завершает обработку сообщения, если выполнение функции завершается успешно, в противном случае прерывает обработку сообщения.
<br/Если задано значение false, вы несете ответственность за вызов методов ServiceBusReceiver для завершения, отказа или взаимозапуска сообщения, сеанса или пакета. Если генерируется исключение (и ни один из методов ServiceBusReceiver не вызывается), то блокировка остается. По истечении срока блокировки сообщение снова помещается в очередь с увеличением счетчика DeliveryCount и блокировка автоматически продляется.

Это свойство доступно только в Функциях Azure 2.x и более поздних версий.

В следующем примере показана привязка триггера служебная шина в файле function.json и функции скрипта C#, использующая привязку. Функция считывает метаданные сообщения и заносит в журнал сообщение из очереди службы "Служебная шина".

Данные привязки в файле function.json:

{
"bindings": [
    {
    "queueName": "testqueue",
    "connection": "MyServiceBusConnection",
    "name": "myQueueItem",
    "type": "serviceBusTrigger",
    "direction": "in"
    }
],
"disabled": false
}

Ниже приведен код скрипта C#.

using System;

public static void Run(string myQueueItem,
    Int32 deliveryCount,
    DateTime enqueuedTimeUtc,
    string messageId,
    TraceWriter log)
{
    log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");

    log.Info($"EnqueuedTimeUtc={enqueuedTimeUtc}");
    log.Info($"DeliveryCount={deliveryCount}");
    log.Info($"MessageId={messageId}");
}

выходные данные служебная шина

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеserviceBus. Это свойство задается автоматически при создании триггера на портале Azure.
direction Должен иметь значениеout. Это свойство задается автоматически при создании триггера на портале Azure.
name Имя переменной, представляющей сообщение очереди или раздела в коде функции. Задайте значение "$return", ссылающееся на возвращаемое значение функции.
queueName Имя очереди. Задается только в случае отправки сообщений очереди, а не раздела.
topicName Имя раздела. Задается только в случае отправки сообщений раздела, а не очереди.
Подключение Имя параметра или коллекции параметров приложения, указывающих, как подключиться к служебной шине. См. раздел Подключения.
accessRights (только в версии 1) Права доступа для строки подключения. Доступные значения: manage и listen. Значение по умолчанию — manage. Это означает, что у свойства connection есть разрешение на управление. При использовании строки подключения без разрешения на управление задайте для свойства accessRights значение "listen". В противном случае выполнение операций, для которых требуются права на управление, в среде выполнения Функций Azure может завершиться ошибкой. В Функциях Azure версии 2.x и более поздних это свойство недоступно, так как последняя версия пакета SDK Служебной шины не поддерживает операции управления.

В следующем примере показана служебная шина выходная привязка в файле function.json и функция скрипта C#, использующая привязку. Функция использует триггер таймера для отправки сообщения очереди каждые 15 секунд.

Данные привязки в файле function.json:

{
    "bindings": [
        {
            "schedule": "0/15 * * * * *",
            "name": "myTimer",
            "runsOnStartup": true,
            "type": "timerTrigger",
            "direction": "in"
        },
        {
            "name": "outputSbQueue",
            "type": "serviceBus",
            "queueName": "testqueue",
            "connection": "MyServiceBusConnection",
            "direction": "out"
        }
    ],
    "disabled": false
}

Ниже приведен код сценария C#, который создает одно сообщение.

public static void Run(TimerInfo myTimer, ILogger log, out string outputSbQueue)
{
    string message = $"Service Bus queue message created at: {DateTime.Now}";
    log.LogInformation(message); 
    outputSbQueue = message;
}

Ниже приведен код сценария C#, который создает несколько сообщений.

public static async Task Run(TimerInfo myTimer, ILogger log, IAsyncCollector<string> outputSbQueue)
{
    string message = $"Service Bus queue messages created at: {DateTime.Now}";
    log.LogInformation(message); 
    await outputSbQueue.AddAsync("1 " + message);
    await outputSbQueue.AddAsync("2 " + message);
}

Триггер Azure Cosmos DB версии 2

В этом разделе описана поддержка только расширения версии 4.x+.

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеcosmosDBTrigger.
direction Должен иметь значениеin. Этот параметр задается автоматически при создании триггера на портале Azure.
name Имя переменной, используемое в коде функции, представляющей список документов с изменениями.
Подключение Имя параметра или коллекции параметров приложения, указывающих, как подключиться к отслеживаемой учетной записи Azure Cosmos DB. Дополнительные сведения см. в разделе Соединения.
databaseName Имя базы данных Azure Cosmos DB с отслеживаемым контейнером.
containerName Имя отслеживаемого контейнера.
leaseConnection (Необязательно.) Имя параметра или контейнера параметров приложения, указывающих, как подключиться к учетной записи Azure Cosmos DB, в которой хранится контейнер аренд.

Если значение не задано, используется значение connection. Этот параметр задается автоматически при создании привязки на портале. Строка подключения для контейнера аренд должна иметь разрешения на запись.
leaseDatabaseName (Необязательно.) Имя базы данных, в которой содержится контейнер, используемый для хранения аренд. Если значение не задано, используется значение параметра databaseName.
leaseContainerName (Необязательно.) Имя контейнера, используемого для хранения аренд. Если значение не задано, используется значение leases.
createLeaseContainerIfNotExists (Необязательно.) Если задано значение true, контейнер аренд создается автоматически, если он еще не создан. Значение по умолчанию — false. При использовании удостоверений Microsoft Entra, если задано значение true, создание контейнеров не является разрешенной операцией , и функция не сможет запуститься.
leasesContainerThroughput (Необязательно.) Определяет количество единиц запроса для назначения при создании контейнера аренд. Этот параметр используется, только если для createLeaseContainerIfNotExists задано значение true. Этот параметр задается автоматически при создании привязки с помощью портала.
leaseContainerPrefix (Необязательно.) Если этот параметр задан, значение добавляется в качестве префикса к арендам, созданным в контейнере аренд для этой функции. Использование префикса позволяет двум отдельным Функциям Azure совместно применять один контейнер аренд с помощью разных префиксов.
feedPollDelay (Необязательно.) Определяет задержку между опросами секции на наличие новых изменений в веб-канале, после того как все текущие изменения будут утеряны (в миллисекундах). Значение по умолчанию равно 5000 миллисекунд, или 5 секундам.
leaseAcquireInterval (Дополнительно) Если параметр задан, то он определяет интервал для запуска задачи вычисления при условии равномерности распределения секций между известными экземплярами узла (в миллисекундах). По умолчанию это 13000 (13 секунд).
leaseExpirationInterval (Дополнительно) Если параметр задан, то он определяет интервал, за который берется аренда, представляющая секцию (в миллисекундах). Если аренда не будет обновлена в течение этого интервала, это приведет к ее истечению и владение секцией перейдет к другому экземпляру. По умолчанию это 60000 (60 секунд).
leaseRenewInterval (Дополнительно) Если параметр задан, то он определяет интервал продления для всех аренд в разделах, которые на данный момент занятые экземплярами (в миллисекундах). По умолчанию это 17000 (17 секунд).
maxItemsPerInvocation (Необязательно.) Если это свойство задано, оно устанавливает максимальное число полученных элементов на вызов функции. Если операции в отслеживаемом контейнере выполняются с помощью хранимых процедур, область транзакции сохраняется при считывании элементов из канала изменений. В результате число полученных элементов может быть выше указанного значения, чтобы элементы, измененные одной транзакцией, возвращались как часть одного атомарного пакета.
startFromBeginning (Необязательно.) Этот параметр указывает триггеру считывать изменения с начала истории изменений контейнера, а не с текущего момента времени. Считывание с начала возможно только при первом запуске триггера, так как при последующих запусках контрольные точки уже будут сохранены. Если установить для этого параметра значение true при уже созданных арендах, этот параметр не будет иметь никакого эффекта.
startFromTime (Необязательно.) Возвращает или задает дату и время для начала инициализации операции чтения канала изменений. Рекомендуемый формат — ISO 8601 с указателем UTC, например 2021-02-16T14:19:29Z. Такой подход используется только для задания начального состояния триггера. После того как триггер перешел в состояние аренды, изменение этого значения не будет иметь никакого эффекта.
preferredLocations (Необязательно.) Определяет предпочтительные расположения (регионы) для геореплицированных учетных записей базы данных в службе Azure Cosmos DB. Значения должны быть разделены запятыми. Например, "Восточная часть США,Центрально-южная часть США,Северная Европа".

В следующем примере показана привязка триггера Azure Cosmos DB в файле function.json и функция скрипта C#, использующая привязку. Функция записывает сообщения журнала при добавлении или изменении записей Azure Cosmos DB.

Данные привязки в файле function.json:

{
    "type": "cosmosDBTrigger",
    "name": "documents",
    "direction": "in",
    "leaseContainerName": "leases",
    "connection": "<connection-app-setting>",
    "databaseName": "Tasks",
    "containerName": "Items",
    "createLeaseContainerIfNotExists": true
}

Ниже приведен код скрипта C#.

    using System;
    using System.Collections.Generic;
    using Microsoft.Extensions.Logging;

    // Customize the model with your own desired properties
    public class ToDoItem
    {
        public string id { get; set; }
        public string Description { get; set; }
    }

    public static void Run(IReadOnlyList<ToDoItem> documents, ILogger log)
    {
      log.LogInformation("Documents modified " + documents.Count);
      log.LogInformation("First document Id " + documents[0].id);
    }

Входные данные Azure Cosmos DB версии 2

В этом разделе описана поддержка только расширения версии 4.x+.

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json.

Свойство в function.json Описание
type Должен иметь значениеcosmosDB.
direction Должен иметь значениеin.
name Имя переменной, используемое в коде функции, представляющей список документов с изменениями.
Подключение Имя параметра или контейнера параметров приложения, указывающих, как подключиться к отслеживаемой учетной записи Azure Cosmos DB. Дополнительные сведения см. в разделе Соединения.
databaseName Имя базы данных Azure Cosmos DB с отслеживаемым контейнером.
containerName Имя отслеживаемого контейнера.
partitionKey Задает значение ключа секции для поиска. Может включать параметры привязки. Он необходим для поиска в секционированных контейнерах.
id Идентификатор документа, который нужно получить. Это свойство поддерживает выражения привязок. Не задавайте свойства id и sqlQuery одновременно. Если не задать ни одного из них, извлекается весь контейнер.
sqlQuery SQL-запрос к Azure Cosmos DB, используемый для извлечения нескольких документов. Свойство поддерживает привязки времени выполнения, как показано в примере: SELECT * FROM c where c.departmentId = {departmentId}. Не задавайте свойства id и sqlQuery одновременно. Если не задать ни одного из них, извлекается весь контейнер.
preferredLocations (Необязательно.) Определяет предпочтительные расположения (регионы) для геореплицированных учетных записей базы данных в службе Azure Cosmos DB. Значения должны быть разделены запятыми. Например, East US,South Central US,North Europe.

Этот раздел содержит следующие примеры.

В примерах триггера HTTP используется ToDoItem простого типа:

namespace CosmosDBSamplesV2
{
    public class ToDoItem
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }
}

Триггер очереди, поисковый идентификатор из строки

В следующем примере показана входная привязка Azure Cosmos DB в файле function.json и функция скрипта C#, использующая привязку. Функция считывает один документ и обновляет текстовое значение в документе.

Данные привязки в файле function.json:

{
    "name": "inputDocument",
    "type": "cosmosDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "id" : "{queueTrigger}",
    "partitionKey": "{partition key value}",
    "connectionStringSetting": "MyAccount_COSMOSDB",
    "direction": "in"
}

Ниже приведен код скрипта C#.

    using System;

    // Change input document contents using Azure Cosmos DB input binding
    public static void Run(string myQueueItem, dynamic inputDocument)
    {
      inputDocument.text = "This has changed.";
    }

Триггер очереди, получение нескольких документов, используется SqlQuery

В следующем примере показана входная привязка Azure Cosmos DB в файле function.json и функция скрипта C#, использующая привязку. Функция извлекает несколько документов, указанных SQL-запросом, используя триггер очереди для настройки параметров запроса.

Триггер очереди предоставляет параметр departmentId. Сообщение из очереди { "departmentId" : "Finance" } возвратит все записи для финансового отдела.

Данные привязки в файле function.json:

{
    "name": "documents",
    "type": "cosmosDB",
    "direction": "in",
    "databaseName": "MyDb",
    "collectionName": "MyCollection",
    "sqlQuery": "SELECT * from c where c.departmentId = {departmentId}",
    "connectionStringSetting": "CosmosDBConnection"
}

Ниже приведен код скрипта C#.

    public static void Run(QueuePayload myQueueItem, IEnumerable<dynamic> documents)
    {
        foreach (var doc in documents)
        {
            // operate on each document
        }
    }

    public class QueuePayload
    {
        public string departmentId { get; set; }
    }

Триггер HTTP, поисковый идентификатор из строки запроса

В следующем примере показана функция скрипта C#, которая получает один документ. Функция активируется HTTP-запросом, который использует строку запроса, чтобы указать идентификатор и значение ключа раздела для поиска. Эти идентификатор и значение ключа раздела используются для получения документа ToDoItem из указанной базы данных и коллекции.

Ниже показан файл function.json.

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "in",
      "Id": "{Query.id}",
      "PartitionKey" : "{Query.partitionKeyValue}"
    }
  ],
  "disabled": false
}

Ниже приведен код скрипта C#.

using System.Net;
using Microsoft.Extensions.Logging;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
         log.LogInformation($"ToDo item not found");
    }
    else
    {
        log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

Триггер HTTP, поисковый идентификатор из данных маршрута

В следующем примере показана функция скрипта C#, которая получает один документ. Функция активируется HTTP-запросом, который использует данные маршрута, чтобы указать идентификатор и значение ключа раздела для поиска. Эти идентификатор и значение ключа раздела используются для получения документа ToDoItem из указанной базы данных и коллекции.

Ниже показан файл function.json.

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ],
      "route":"todoitems/{partitionKeyValue}/{id}"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "in",
      "id": "{id}",
      "partitionKey": "{partitionKeyValue}"
    }
  ],
  "disabled": false
}

Ниже приведен код скрипта C#.

using System.Net;
using Microsoft.Extensions.Logging;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
         log.LogInformation($"ToDo item not found");
    }
    else
    {
        log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

Триггер HTTP, получение нескольких документов, используется SqlQuery

В следующем примере показана функция скрипта C#, которая получает список документов. Функция активируется с помощью HTTP-запроса. Запрос указывается в свойстве атрибута SqlQuery.

Ниже показан файл function.json.

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItems",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "in",
      "sqlQuery": "SELECT top 2 * FROM c order by c._ts desc"
    }
  ],
  "disabled": false
}

Ниже приведен код скрипта C#.

using System.Net;
using Microsoft.Extensions.Logging;

public static HttpResponseMessage Run(HttpRequestMessage req, IEnumerable<ToDoItem> toDoItems, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    foreach (ToDoItem toDoItem in toDoItems)
    {
        log.LogInformation(toDoItem.Description);
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

Триггер HTTP, получение нескольких документов, используется DocumentClient

В следующем примере показана функция скрипта C#, которая получает список документов. Функция активируется с помощью HTTP-запроса. Код использует экземпляр DocumentClient, предоставленный привязкой Azure Cosmos DB для считывания списка документов. Экземпляр DocumentClient может также использоваться для операций записи.

Ниже показан файл function.json.

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "cosmosDB",
      "name": "client",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "inout"
    }
  ],
  "disabled": false
}

Ниже приведен код скрипта C#.

#r "Microsoft.Azure.Documents.Client"

using System.Net;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Microsoft.Extensions.Logging;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, DocumentClient client, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    Uri collectionUri = UriFactory.CreateDocumentCollectionUri("ToDoItems", "Items");
    string searchterm = req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, "searchterm", true) == 0)
        .Value;

    if (searchterm == null)
    {
        return req.CreateResponse(HttpStatusCode.NotFound);
    }

    log.LogInformation($"Searching for word: {searchterm} using Uri: {collectionUri.ToString()}");
    IDocumentQuery<ToDoItem> query = client.CreateDocumentQuery<ToDoItem>(collectionUri)
        .Where(p => p.Description.Contains(searchterm))
        .AsDocumentQuery();

    while (query.HasMoreResults)
    {
        foreach (ToDoItem result in await query.ExecuteNextAsync())
        {
            log.LogInformation(result.Description);
        }
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

Выходные данные Azure Cosmos DB версии 2

В этом разделе описана поддержка только расширения версии 4.x+.

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json.

Свойство в function.json Description
Подключение Имя параметра или коллекции параметров приложения, указывающих, как подключиться к отслеживаемой учетной записи Azure Cosmos DB. Дополнительные сведения см. в разделе Соединения.
databaseName Имя базы данных Azure Cosmos DB с отслеживаемым контейнером.
containerName Имя отслеживаемого контейнера.
createIfNotExists Логическое значение, указывающее, будет ли создан контейнер при ее отсутствии. Значение по умолчанию — false, так как контейнеры создаются с использованием зарезервированной пропускной способности, с которой связаны ценовые требования. Дополнительные сведения см. на странице цен.
partitionKey Если для createIfNotExists задано значение true, оно определяет путь к ключу раздела для созданного контейнера. Может включать параметры привязки.
containerThroughput Если для createIfNotExists задано значение true, оно определяет пропускную способность созданного контейнера.
preferredLocations (Необязательно.) Определяет предпочтительные расположения (регионы) для геореплицированных учетных записей базы данных в службе Azure Cosmos DB. Значения должны быть разделены запятыми. Например, East US,South Central US,North Europe.

Этот раздел содержит следующие примеры.

Триггер очереди, запись одного документа

В следующем примере показаны выходная привязка Azure Cosmos DB в файле function.json и функция сценария C#, которая использует эту привязку. Функция использует входную привязку очереди для очереди, которую получает JSON в следующем формате:

{
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

Функция создает документы Azure Cosmos DB для каждой записи в следующем формате:

{
    "id": "John Henry-123456",
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

Данные привязки в файле function.json:

{
    "name": "employeeDocument",
    "type": "cosmosDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "createIfNotExists": true,
    "connectionStringSetting": "MyAccount_COSMOSDB",
    "direction": "out"
}

Ниже приведен код скрипта C#.

    #r "Newtonsoft.Json"

    using Microsoft.Azure.WebJobs.Host;
    using Newtonsoft.Json.Linq;
    using Microsoft.Extensions.Logging;

    public static void Run(string myQueueItem, out object employeeDocument, ILogger log)
    {
      log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

      dynamic employee = JObject.Parse(myQueueItem);

      employeeDocument = new {
        id = employee.name + "-" + employee.employeeId,
        name = employee.name,
        employeeId = employee.employeeId,
        address = employee.address
      };
    }

Триггер очереди, запись документов при помощи IAsyncCollector

Для создания нескольких документов можно выполнить привязку к ICollector<T> или к IAsyncCollector<T>, где T — любой из поддерживаемых типов.

Этот пример относится к простому типу ToDoItem:

namespace CosmosDBSamplesV2
{
    public class ToDoItem
    {
        public string id { get; set; }
        public string Description { get; set; }
    }
}

Ниже показан файл function.json:

{
  "bindings": [
    {
      "name": "toDoItemsIn",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "todoqueueforwritemulti",
      "connectionStringSetting": "AzureWebJobsStorage"
    },
    {
      "type": "cosmosDB",
      "name": "toDoItemsOut",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connectionStringSetting": "CosmosDBConnection",
      "direction": "out"
    }
  ],
  "disabled": false
}

Ниже приведен код скрипта C#.

using System;
using Microsoft.Extensions.Logging;

public static async Task Run(ToDoItem[] toDoItemsIn, IAsyncCollector<ToDoItem> toDoItemsOut, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed {toDoItemsIn?.Length} items");

    foreach (ToDoItem toDoItem in toDoItemsIn)
    {
        log.LogInformation($"Description={toDoItem.Description}");
        await toDoItemsOut.AddAsync(toDoItem);
    }
}

Триггер Azure Cosmos DB версии 1

В следующем примере показана привязка триггера Azure Cosmos DB в файле function.json и функция скрипта C#, использующая привязку. Функция записывает сообщения журнала при изменении записей Azure Cosmos DB.

Данные привязки в файле function.json:

{
    "type": "cosmosDBTrigger",
    "name": "documents",
    "direction": "in",
    "leaseCollectionName": "leases",
    "connectionStringSetting": "<connection-app-setting>",
    "databaseName": "Tasks",
    "collectionName": "Items",
    "createLeaseCollectionIfNotExists": true
}

Ниже приведен код скрипта C#.

    #r "Microsoft.Azure.Documents.Client"
    
    using System;
    using Microsoft.Azure.Documents;
    using System.Collections.Generic;
    

    public static void Run(IReadOnlyList<Document> documents, TraceWriter log)
    {
        log.Info("Documents modified " + documents.Count);
        log.Info("First document Id " + documents[0].Id);
    }

Входные данные Azure Cosmos DB версии 1

Этот раздел содержит следующие примеры.

В примерах триггера HTTP используется ToDoItem простого типа:

namespace CosmosDBSamplesV1
{
    public class ToDoItem
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }
}

Триггер очереди, поисковый идентификатор из строки

В следующем примере показана входная привязка Azure Cosmos DB в файле function.json и функция сценария C#, которая использует эту привязку. Функция считывает один документ и обновляет текстовое значение в документе.

Данные привязки в файле function.json:

{
    "name": "inputDocument",
    "type": "documentDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "id" : "{queueTrigger}",
    "partitionKey": "{partition key value}",
    "connection": "MyAccount_COSMOSDB",
    "direction": "in"
}

Ниже приведен код скрипта C#.

    using System;

    // Change input document contents using Azure Cosmos DB input binding
    public static void Run(string myQueueItem, dynamic inputDocument)
    {
        inputDocument.text = "This has changed.";
    }

Триггер очереди, получение нескольких документов, используется SqlQuery

В следующем примере показана входная привязка Azure Cosmos DB в файле function.json и функция сценария C#, которая использует эту привязку. Функция извлекает несколько документов, указанных SQL-запросом, используя триггер очереди для настройки параметров запроса.

Триггер очереди предоставляет параметр departmentId. Сообщение из очереди { "departmentId" : "Finance" } возвратит все записи для финансового отдела.

Данные привязки в файле function.json:

{
    "name": "documents",
    "type": "documentdb",
    "direction": "in",
    "databaseName": "MyDb",
    "collectionName": "MyCollection",
    "sqlQuery": "SELECT * from c where c.departmentId = {departmentId}",
    "connection": "CosmosDBConnection"
}

Ниже приведен код скрипта C#.

    public static void Run(QueuePayload myQueueItem, IEnumerable<dynamic> documents)
    {
        foreach (var doc in documents)
        {
            // operate on each document
        }
    }

    public class QueuePayload
    {
        public string departmentId { get; set; }
    }

Триггер HTTP, поисковый идентификатор из строки запроса

В следующем примере показана функция скрипта C#, которая получает один документ. Функция активируется HTTP-запросом, который в строке запроса указывает идентификатор для поиска. Этот идентификатор используется для получения ToDoItem документа из указанной базы данных и коллекции.

Ниже показан файл function.json.

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "in",
      "Id": "{Query.id}"
    }
  ],
  "disabled": true
}

Ниже приведен код скрипта C#.

using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
        log.Info($"ToDo item not found");
    }
    else
    {
        log.Info($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

Триггер HTTP, поисковый идентификатор из данных маршрута

В следующем примере показана функция скрипта C#, которая получает один документ. Функция инициируется HTTP-запросом, в котором с помощью данных маршрута указывается идентификатор для поиска. Этот идентификатор используется для получения ToDoItem документа из указанной базы данных и коллекции.

Ниже показан файл function.json.

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ],
      "route":"todoitems/{id}"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "toDoItem",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "in",
      "Id": "{id}"
    }
  ],
  "disabled": false
}

Ниже приведен код скрипта C#.

using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, ToDoItem toDoItem, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    if (toDoItem == null)
    {
        log.Info($"ToDo item not found");
    }
    else
    {
        log.Info($"Found ToDo item, Description={toDoItem.Description}");
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

Триггер HTTP, получение нескольких документов, используется SqlQuery

В следующем примере показана функция скрипта C#, которая получает список документов. Функция активируется с помощью HTTP-запроса. Запрос указывается в свойстве атрибута SqlQuery.

Ниже показан файл function.json.

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "toDoItems",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "in",
      "sqlQuery": "SELECT top 2 * FROM c order by c._ts desc"
    }
  ],
  "disabled": false
}

Ниже приведен код скрипта C#.

using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, IEnumerable<ToDoItem> toDoItems, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    foreach (ToDoItem toDoItem in toDoItems)
    {
        log.Info(toDoItem.Description);
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

Триггер HTTP, получение нескольких документов, используется DocumentClient

В следующем примере показана функция скрипта C#, которая получает список документов. Функция активируется с помощью HTTP-запроса. Код использует экземпляр DocumentClient, предоставленный привязкой Azure Cosmos DB для считывания списка документов. Экземпляр DocumentClient может также использоваться для операций записи.

Ниже показан файл function.json.

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "client",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "inout"
    }
  ],
  "disabled": false
}

Ниже приведен код скрипта C#.

#r "Microsoft.Azure.Documents.Client"

using System.Net;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, DocumentClient client, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    Uri collectionUri = UriFactory.CreateDocumentCollectionUri("ToDoItems", "Items");
    string searchterm = req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, "searchterm", true) == 0)
        .Value;

    if (searchterm == null)
    {
        return req.CreateResponse(HttpStatusCode.NotFound);
    }

    log.Info($"Searching for word: {searchterm} using Uri: {collectionUri.ToString()}");
    IDocumentQuery<ToDoItem> query = client.CreateDocumentQuery<ToDoItem>(collectionUri)
        .Where(p => p.Description.Contains(searchterm))
        .AsDocumentQuery();

    while (query.HasMoreResults)
    {
        foreach (ToDoItem result in await query.ExecuteNextAsync())
        {
            log.Info(result.Description);
        }
    }
    return req.CreateResponse(HttpStatusCode.OK);
}

Выходные данные Azure Cosmos DB версии 1

Этот раздел содержит следующие примеры.

  • Триггер очереди, запись одного документа
  • Триггер очереди, запись документов с помощью IAsyncCollector

Триггер очереди, запись одного документа

В следующем примере показаны выходная привязка Azure Cosmos DB в файле function.json и функция сценария C#, которая использует эту привязку. Функция использует входную привязку очереди для очереди, которую получает JSON в следующем формате:

{
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

Функция создает документы Azure Cosmos DB для каждой записи в следующем формате:

{
    "id": "John Henry-123456",
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

Данные привязки в файле function.json:

{
    "name": "employeeDocument",
    "type": "documentDB",
    "databaseName": "MyDatabase",
    "collectionName": "MyCollection",
    "createIfNotExists": true,
    "connection": "MyAccount_COSMOSDB",
    "direction": "out"
}

Ниже приведен код скрипта C#.

    #r "Newtonsoft.Json"

    using Microsoft.Azure.WebJobs.Host;
    using Newtonsoft.Json.Linq;

    public static void Run(string myQueueItem, out object employeeDocument, TraceWriter log)
    {
        log.Info($"C# Queue trigger function processed: {myQueueItem}");

        dynamic employee = JObject.Parse(myQueueItem);

        employeeDocument = new {
            id = employee.name + "-" + employee.employeeId,
            name = employee.name,
            employeeId = employee.employeeId,
            address = employee.address
        };
    }

Триггер очереди, запись документов при помощи IAsyncCollector

Для создания нескольких документов можно выполнить привязку к ICollector<T> или к IAsyncCollector<T>, где T — любой из поддерживаемых типов.

Этот пример относится к простому типу ToDoItem:

namespace CosmosDBSamplesV1
{
    public class ToDoItem
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }
}

Ниже показан файл function.json:

{
  "bindings": [
    {
      "name": "toDoItemsIn",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "todoqueueforwritemulti",
      "connection": "AzureWebJobsStorage"
    },
    {
      "type": "documentDB",
      "name": "toDoItemsOut",
      "databaseName": "ToDoItems",
      "collectionName": "Items",
      "connection": "CosmosDBConnection",
      "direction": "out"
    }
  ],
  "disabled": false
}

Ниже приведен код скрипта C#.

using System;

public static async Task Run(ToDoItem[] toDoItemsIn, IAsyncCollector<ToDoItem> toDoItemsOut, TraceWriter log)
{
    log.Info($"C# Queue trigger function processed {toDoItemsIn?.Length} items");

    foreach (ToDoItem toDoItem in toDoItemsIn)
    {
        log.Info($"Description={toDoItem.Description}");
        await toDoItemsOut.AddAsync(toDoItem);
    }
}

Триггер SQL Azure

Дополнительные примеры триггера SQL Azure доступны в репозитории GitHub.

Пример ссылается на ToDoItem класс и соответствующую таблицу базы данных:

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

Отслеживание изменений включено в базе данных и в таблице:

ALTER DATABASE [SampleDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE [dbo].[ToDo]
ENABLE CHANGE_TRACKING;

Триггер SQL привязывается к IReadOnlyList<SqlChange<T>>списку SqlChange объектов с двумя свойствами:

  • Элемент: измененный элемент. Тип элемента должен соответствовать схеме таблицы, как показано в ToDoItem классе.
  • Операция: значение из SqlChangeOperation перечисления. Возможные значения: Insert, Update и Delete.

В следующем примере показан триггер SQL в файле function.json и функции скрипта C#, вызываемой ToDo при изменении таблицы:

Ниже приведены данные привязки в файле function.json:

{
    "name": "todoChanges",
    "type": "sqlTrigger",
    "direction": "in",
    "tableName": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

Ниже приведена функция скрипта C#:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static void Run(IReadOnlyList<SqlChange<ToDoItem>> todoChanges, ILogger log)
{
    log.LogInformation($"C# SQL trigger function processed a request.");

    foreach (SqlChange<ToDoItem> change in todoChanges)
    {
        ToDoItem toDoItem = change.Item;
        log.LogInformation($"Change operation: {change.Operation}");
        log.LogInformation($"Id: {toDoItem.Id}, Title: {toDoItem.title}, Url: {toDoItem.url}, Completed: {toDoItem.completed}");
    }
}

Входные данные SQL Azure

Дополнительные примеры входной привязки Azure SQL доступны в репозитории GitHub.

Этот раздел содержит следующие примеры.

Примеры относятся к классу ToDoItem и соответствующей таблице базы данных:

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

Триггер HTTP, получение записи по идентификатору из строки запроса

В следующем примере показана входная привязка SQL Azure в файле function.json и функции скрипта C#, использующая привязку. Функция инициируется HTTP-запросом, который в строке запроса указывает идентификатор для поиска. Этот идентификатор используется для получения ToDoItem записи с указанным запросом.

Примечание.

Параметры строки запроса HTTP задаются с учетом регистра.

Данные привязки в файле function.json:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "get"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItem",
    "type": "sql",
    "direction": "in",
    "commandText": "select [Id], [order], [title], [url], [completed] from dbo.ToDo where Id = @Id",
    "commandType": "Text",
    "parameters": "@Id = {Query.id}",
    "connectionStringSetting": "SqlConnectionString"
}

Ниже приведен код скрипта C#.

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Collections.Generic;

public static IActionResult Run(HttpRequest req, ILogger log, IEnumerable<ToDoItem> todoItem)
{
    return new OkObjectResult(todoItem);
}

Триггер HTTP, удаление записей

В следующем примере показана входная привязка SQL Azure в файле function.json и функция скрипта C#, использующая привязку для выполнения хранимой процедуры с входными данными из параметра запроса HTTP-запроса. В этом примере хранимая процедура удаляет одну запись или все записи в зависимости от значения параметра.

Хранимая процедура dbo.DeleteToDo должна быть создана в базе данных SQL.

CREATE PROCEDURE [dbo].[DeleteToDo]
    @Id NVARCHAR(100)
AS
    DECLARE @UID UNIQUEIDENTIFIER = TRY_CAST(@ID AS UNIQUEIDENTIFIER)
    IF @UId IS NOT NULL AND @Id != ''
    BEGIN
        DELETE FROM dbo.ToDo WHERE Id = @UID
    END
    ELSE
    BEGIN
        DELETE FROM dbo.ToDo WHERE @ID = ''
    END

    SELECT [Id], [order], [title], [url], [completed] FROM dbo.ToDo
GO

Данные привязки в файле function.json:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "get"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItems",
    "type": "sql",
    "direction": "in",
    "commandText": "DeleteToDo",
    "commandType": "StoredProcedure",
    "parameters": "@Id = {Query.id}",
    "connectionStringSetting": "SqlConnectionString"
}
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

namespace AzureSQL.ToDo
{
    public static class DeleteToDo
    {
        // delete all items or a specific item from querystring
        // returns remaining items
        // uses input binding with a stored procedure DeleteToDo to delete items and return remaining items
        [FunctionName("DeleteToDo")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "delete", Route = "DeleteFunction")] HttpRequest req,
            ILogger log,
            [Sql(commandText: "DeleteToDo", commandType: System.Data.CommandType.StoredProcedure, 
                parameters: "@Id={Query.id}", connectionStringSetting: "SqlConnectionString")] 
                IEnumerable<ToDoItem> toDoItems)
        {
            return new OkObjectResult(toDoItems);
        }
    }
}

Ниже приведен код скрипта C#.

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Collections.Generic;

public static IActionResult Run(HttpRequest req, ILogger log, IEnumerable<ToDoItem> todoItems)
{
    return new OkObjectResult(todoItems);
}

Выходные данные SQL Azure

Дополнительные примеры выходной привязки Azure SQL доступны в репозитории GitHub.

Этот раздел содержит следующие примеры.

Примеры относятся к классу ToDoItem и соответствующей таблице базы данных:

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

Триггер HTTP, запись записей в таблицу

В следующем примере показана выходная привязка SQL в файле function.json и функция скрипта C#, которая добавляет записи в таблицу, используя данные, предоставленные в запросе HTTP POST в виде текста JSON.

Ниже приведены данные привязки в файле function.json:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "post"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItem",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

Ниже приведен пример кода скрипта C#:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static IActionResult Run(HttpRequest req, ILogger log, out ToDoItem todoItem)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = new StreamReader(req.Body).ReadToEnd();
    todoItem = JsonConvert.DeserializeObject<ToDoItem>(requestBody);

    return new OkObjectResult(todoItem);
}

Триггер HTTP, запись в две таблицы

В следующем примере показана выходная привязка SQL в файле function.json и функция скрипта C#, которая добавляет записи в базу данных в двух разных таблицах (dbo.ToDo и dbo.RequestLog), используя данные, предоставленные в запросе HTTP POST в виде текста JSON и нескольких выходных привязок.

Вторая таблица dbo.RequestLog соответствует следующему определению:

CREATE TABLE dbo.RequestLog (
    Id int identity(1,1) primary key,
    RequestTimeStamp datetime2 not null,
    ItemCount int not null
)

Ниже приведены данные привязки в файле function.json:

{
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
        "post"
    ]
},
{
    "type": "http",
    "direction": "out",
    "name": "res"
},
{
    "name": "todoItem",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
},
{
    "name": "requestLog",
    "type": "sql",
    "direction": "out",
    "commandText": "dbo.RequestLog",
    "connectionStringSetting": "SqlConnectionString"
}

Ниже приведен пример кода скрипта C#:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static IActionResult Run(HttpRequest req, ILogger log, out ToDoItem todoItem, out RequestLog requestLog)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = new StreamReader(req.Body).ReadToEnd();
    todoItem = JsonConvert.DeserializeObject<ToDoItem>(requestBody);

    requestLog = new RequestLog();
    requestLog.RequestTimeStamp = DateTime.Now;
    requestLog.ItemCount = 1;

    return new OkObjectResult(todoItem);
}

public class RequestLog {
    public DateTime RequestTimeStamp { get; set; }
    public int ItemCount { get; set; }
}

Выходные данные RabbitMQ

В следующем примере показаны выходная привязка RabbitMQ в файле function.json и функция скрипта C#, которая ее использует. Функция считывает сообщение из триггера HTTP и выводит его в очередь RabbitMQ.

Данные привязки в файле function.json:

{
    "bindings": [
        {
            "type": "httpTrigger",
            "direction": "in",
            "authLevel": "function",
            "name": "input",
            "methods": [
                "get",
                "post"
            ]
        },
        {
            "type": "rabbitMQ",
            "name": "outputMessage",
            "queueName": "outputQueue",
            "connectionStringSetting": "rabbitMQConnectionAppSetting",
            "direction": "out"
        }
    ]
}

Ниже приведен код скрипта C#.

using System;
using Microsoft.Extensions.Logging;

public static void Run(string input, out string outputMessage, ILogger log)
{
    log.LogInformation(input);
    outputMessage = input;
}

Выходные привязки SendGrid

В следующем примере показаны выходная привязка SendGrid в файле function.json и функция сценария C#, которая использует эту привязку.

Данные привязки в файле function.json:

{
    "bindings": [
        {
          "type": "queueTrigger",
          "name": "mymsg",
          "queueName": "myqueue",
          "connection": "AzureWebJobsStorage",
          "direction": "in"
        },
        {
          "type": "sendGrid",
          "name": "$return",
          "direction": "out",
          "apiKey": "SendGridAPIKeyAsAppSetting",
          "from": "{FromEmail}",
          "to": "{ToEmail}"
        }
    ]
}

Ниже приведен код скрипта C#.

#r "SendGrid"

using System;
using SendGrid.Helpers.Mail;
using Microsoft.Azure.WebJobs.Host;

public static SendGridMessage Run(Message mymsg, ILogger log)
{
    SendGridMessage message = new SendGridMessage()
    {
        Subject = $"{mymsg.Subject}"
    };
    
    message.AddContent("text/plain", $"{mymsg.Content}");

    return message;
}
public class Message
{
    public string ToEmail { get; set; }
    public string FromEmail { get; set; }
    public string Subject { get; set; }
    public string Content { get; set; }
}

Триггер SignalR

Пример данных привязки в файле function.json приведен ниже.

{
    "type": "signalRTrigger",
    "name": "invocation",
    "hubName": "SignalRTest",
    "category": "messages",
    "event": "SendMessage",
    "parameterNames": [
        "message"
    ],
    "direction": "in"
}

А вот код.

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using System;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
using Microsoft.Extensions.Logging;

public static void Run(InvocationContext invocation, string message, ILogger logger)
{
    logger.LogInformation($"Receive {message} from {invocationContext.ConnectionId}.");
}

Входные данные SignalR

В следующем примере показана входная привязка для сведений о подключении SignalR в файле function.json и функция скрипта C#, использующая привязку для возврата сведений о подключении.

Данные привязки в файле function.json:

Пример файла function.json:

{
    "type": "signalRConnectionInfo",
    "name": "connectionInfo",
    "hubName": "chat",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "direction": "in"
}

Ниже приведен код скрипта C#.

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static SignalRConnectionInfo Run(HttpRequest req, SignalRConnectionInfo connectionInfo)
{
    return connectionInfo;
}

В качестве значения свойства userId привязки можно задать один из заголовков с помощью выражения привязки: {headers.x-ms-client-principal-id} или {headers.x-ms-client-principal-name}.

Пример файла function.json:

{
    "type": "signalRConnectionInfo",
    "name": "connectionInfo",
    "hubName": "chat",
    "userId": "{headers.x-ms-client-principal-id}",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "direction": "in"
}

Ниже приведен код скрипта C#.

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static SignalRConnectionInfo Run(HttpRequest req, SignalRConnectionInfo connectionInfo)
{
    // connectionInfo contains an access key token with a name identifier
    // claim set to the authenticated user
    return connectionInfo;
}

Выходные данные SignalR

Данные привязки в файле function.json:

Пример файла function.json:

{
  "type": "signalR",
  "name": "signalRMessages",
  "hubName": "<hub_name>",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}

Ниже приведен код скрипта C#.

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    object message,
    IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage
        {
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

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

Пример файла function.json:

{
  "type": "signalR",
  "name": "signalRMessages",
  "hubName": "<hub_name>",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}

Ниже приведен код скрипта C#.

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    object message,
    IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage
        {
            // the message will only be sent to this user ID
            UserId = "userId1",
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

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

Пример файла function.json:

{
  "type": "signalR",
  "name": "signalRMessages",
  "hubName": "<hub_name>",
  "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
  "direction": "out"
}

Ниже приведен код скрипта C#.

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    object message,
    IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage
        {
            // the message will be sent to the group with this name
            GroupName = "myGroup",
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

Служба SignalR позволяет добавлять пользователей или подключения в группы. Затем сообщения можно отправлять группе. Выходную привязку SignalR можно использовать для управления группами.

В примере ниже пользователь добавляется в группу.

Пример файла function.json

{
    "type": "signalR",
    "name": "signalRGroupActions",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "hubName": "chat",
    "direction": "out"
}

Run.csx

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    HttpRequest req,
    ClaimsPrincipal claimsPrincipal,
    IAsyncCollector<SignalRGroupAction> signalRGroupActions)
{
    var userIdClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier);
    return signalRGroupActions.AddAsync(
        new SignalRGroupAction
        {
            UserId = userIdClaim.Value,
            GroupName = "myGroup",
            Action = GroupAction.Add
        });
}

В примере ниже пользователь удаляется из группы.

Пример файла function.json

{
    "type": "signalR",
    "name": "signalRGroupActions",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "hubName": "chat",
    "direction": "out"
}

Run.csx

#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using Microsoft.Azure.WebJobs.Extensions.SignalRService;

public static Task Run(
    HttpRequest req,
    ClaimsPrincipal claimsPrincipal,
    IAsyncCollector<SignalRGroupAction> signalRGroupActions)
{
    var userIdClaim = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier);
    return signalRGroupActions.AddAsync(
        new SignalRGroupAction
        {
            UserId = userIdClaim.Value,
            GroupName = "myGroup",
            Action = GroupAction.Remove
        });
}

Выходные привязки Twilio

В следующем примере показаны выходная привязка Twiliofunction.json и функция сценария C#, которая использует эту привязку. Эта функция использует параметр out для отправки текстового сообщения.

Данные привязки в файле function.json:

Пример файла function.json:

{
  "type": "twilioSms",
  "name": "message",
  "accountSidSetting": "TwilioAccountSid",
  "authTokenSetting": "TwilioAuthToken",
  "from": "+1425XXXXXXX",
  "direction": "out",
  "body": "Azure Functions Testing"
}

Ниже приведен код сценария C#:

#r "Newtonsoft.Json"
#r "Twilio"
#r "Microsoft.Azure.WebJobs.Extensions.Twilio"

using System;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;

public static void Run(string myQueueItem, out CreateMessageOptions message,  ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

    // In this example the queue item is a JSON string representing an order that contains the name of a
    // customer and a mobile number to send text updates to.
    dynamic order = JsonConvert.DeserializeObject(myQueueItem);
    string msg = "Hello " + order.name + ", thank you for your order.";

    // You must initialize the CreateMessageOptions variable with the "To" phone number.
    message = new CreateMessageOptions(new PhoneNumber("+1704XXXXXXX"));

    // A dynamic message can be set instead of the body in the output binding. In this example, we use
    // the order information to personalize a text message.
    message.Body = msg;
}

Вы не можете использовать параметры вывода в асинхронном коде. Ниже приведен пример асинхронного кода сценария C#:

#r "Newtonsoft.Json"
#r "Twilio"
#r "Microsoft.Azure.WebJobs.Extensions.Twilio"

using System;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;

public static async Task Run(string myQueueItem, IAsyncCollector<CreateMessageOptions> message,  ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

    // In this example the queue item is a JSON string representing an order that contains the name of a
    // customer and a mobile number to send text updates to.
    dynamic order = JsonConvert.DeserializeObject(myQueueItem);
    string msg = "Hello " + order.name + ", thank you for your order.";

    // You must initialize the CreateMessageOptions variable with the "To" phone number.
    CreateMessageOptions smsText = new CreateMessageOptions(new PhoneNumber("+1704XXXXXXX"));

    // A dynamic message can be set instead of the body in the output binding. In this example, we use
    // the order information to personalize a text message.
    smsText.Body = msg;

    await message.AddAsync(smsText);
}

Триггер прогревание

В следующем примере показан триггер прогрева в файле function.json и функция скрипта C#, которая выполняется на каждом новом экземпляре при добавлении в приложение.

Не поддерживается только в среде выполнения Функций версии 1.x.

Ниже показан файл function.json.

{
    "bindings": [
        {
            "type": "warmupTrigger",
            "direction": "in",
            "name": "warmupContext"
        }
    ]
}
public static void Run(WarmupContext warmupContext, ILogger log)
{
    log.LogInformation("Function App instance is warm.");  
}

Следующие шаги