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

В этой статье содержатся общие сведения о разработке функций Azure с помощью скрипта C# (CSX).This article is an introduction to developing Azure Functions by using C# script (.csx).

Решение "Функции Azure" поддерживает языки программирования C# и скрипт C#.Azure Functions supports C# and C# script programming languages. Рекомендации по использованию C# в проекте библиотеки классов Visual Studio см. в справочнике разработчика C#.If you're looking for guidance on using C# in a Visual Studio class library project, see C# developer reference.

В этой статье предполагается, что вы уже прочли руководство для разработчиков по решению "Функции Azure".This article assumes that you've already read the Azure Functions developers guide.

Как работает формат CSXHow .csx works

Интерфейс скрипта C# для решения "Функции Azure" основан на пакете SDK для веб-заданий Azure.The C# script experience for Azure Functions is based on the Azure WebJobs SDK. Данные поступают в функцию C# через аргументы метода.Data flows into your C# function via method arguments. Имена аргументов указываются в файле function.json. Есть предварительно определенные имена для доступа к таким объектам, как средство ведения журнала функций и маркеры отмены.Argument names are specified in a function.json file, and there are predefined names for accessing things like the function logger and cancellation tokens.

Формат CSX позволяет писать меньше стандартного кода и сосредоточиться на написании только функции C#.The .csx format allows you to write less "boilerplate" and focus on writing just a C# function. а затем вместо помещения всего кода в пространство имен и класс просто определите метод Run.Instead of wrapping everything in a namespace and class, just define a Run method. Как обычно, укажите ссылки на необходимые сборки и пространства имен в начале файла,Include any assembly references and namespaces at the beginning of the file as usual.

Файлы CSX приложения-функции компилируются при инициализации экземпляра.A function app's .csx files are compiled when an instance is initialized. Этот этап компиляции означает, что такие операции, как холодный запуск, могут занимать больше времени при использовании функций скрипта C#, по сравнению с библиотеками классов C#.This compilation step means things like cold start may take longer for C# script functions compared to C# class libraries. Кроме того, благодаря этому этапу компиляции функции скрипта C# доступны для редактирования на портале Azure, в отличие от библиотек классов C#.This compilation step is also why C# script functions are editable in the Azure portal, while C# class libraries are not.

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

Структура папок для проекта на C# выглядит следующим образом.The folder structure for a C# script project looks like the following:

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

Существует общий файл host.json, который можно использовать для настройки приложения-функции.There's a shared host.json file that can be used to configure the function app. У каждой функции есть собственный файл кода (.csx) и файлом конфигурации привязки (function.json).Each function has its own code file (.csx) and binding configuration file (function.json).

Расширения привязки, необходимые в версии 2. x и более поздних версиях среды выполнения функций, определяются в файле extensions.csproj с фактическими файлами библиотеки в папке bin.The binding extensions required in version 2.x and later versions of the Functions runtime are defined in the extensions.csproj file, with the actual library files in the bin folder. При локальной разработке необходимо зарегистрировать расширения привязки.When developing locally, you must register binding extensions. При разработке функций на портале Azure эта регистрация выполняется автоматически.When developing functions in the Azure portal, this registration is done for you.

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

Входные или выходные данные привязываются к параметру функции скрипта C# прпи помощи свойства name в файле конфигурации function.json.Input or output data is bound to a C# script function parameter via the name property in the function.json configuration file. В следующем примере представлены файлы function.json и run.csx для функции, срабатывающей по запросу.The following example shows a function.json file and run.csx file for a queue-triggered function. Параметр для получения данных из сообщения очереди называется myQueueItem, так как это значение свойства name.The parameter that receives data from the queue message is named myQueueItem because that's the value of the name property.

{
    "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 описан далее в этой статье.The #r statement is explained later in this article.

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

Для каждой привязки есть собственные поддерживаемые типы. Например, триггер больших двоичных объектов можно использовать со строковым параметром, параметрами POCO, CloudBlockBlob или любым из нескольких других поддерживаемых типов.Each binding has its own supported types; for instance, a blob trigger can be used with a string parameter, a POCO parameter, a CloudBlockBlob parameter, or any of several other supported types. В справочной статье о привязках для больших двоичных объектов содержится список всех поддерживаемых типов параметров для триггеров больших двоичных объектов.The binding reference article for blob bindings lists all supported parameter types for blob triggers. Дополнительные сведения см. в статье о триггерах и привязках и в справочной документации по каждому типу привязки.For more information, see Triggers and bindings and the binding reference docs for each binding type.

Совет

Если вы планируете использовать привязки HTTP или веб-перехватчика, спланируйте работу так, чтобы избежать нехватки портов, которая может возникнуть в результате неправильной установки HttpClient.If you plan to use the HTTP or WebHook bindings, plan to avoid port exhaustion that can be caused by improper instantiation of HttpClient. См. дополнительные сведения об управлении подключениями в службе "Функции Azure".For more information, see How to manage connections in Azure Functions.

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

Если нужно использовать пользовательский класс простых старых объектов CLR (POCO), вы можете включить определении класса в тот же файл или поместить его в отдельный файл.If you need to use a custom Plain Old CLR Object (POCO) class, you can include the class definition inside the same file or put it in a separate file.

В следующем примере показан пример файла run.csx, содержащего определение класса POCO.The following example shows a run.csx example that includes a POCO class definition.

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 нужно определить методы получения и задания.A POCO class must have a getter and setter defined for each property.

Повторное использование кода CSXReusing .csx code

В файле run.csx можно использовать классы и методы, определенные в других CSX-файлах.You can use classes and methods defined in other .csx files in your run.csx file. Для этого используйте директивы #load в файле run.csx.To do that, use #load directives in your run.csx file. В следующем примере к процедуре ведения журнала с именем MyLogger предоставляется общий доступ в файле myLogger.csx, а также она загружается в файл run.csx. Для этого используется директива #load:In the following example, a logging routine named MyLogger is shared in myLogger.csx and loaded into run.csx using the #load directive:

Пример run.csx:Example 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:Example mylogger.csx:

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

Обычно для задания строго типизированных данных, передаваемых между функциями с использованием объекта POCO, применяется общий файл с расширением CSX.Using a shared .csx file is a common pattern when you want to strongly type the data passed between functions by using a POCO object. В указанном ниже упрощенном примере триггер HTTP и очереди совместно используют объект POCO с именем Order для задания строго типизированных данных о заказах.In the following simplified example, an HTTP trigger and queue trigger share a POCO object named Order to strongly type the order data:

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

#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 для триггера очереди:Example run.csx for queue trigger:

#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:Example 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 можно использовать относительный путь:You can use a relative path with the #load directive:

  • #load "mylogger.csx" загружает файл, расположенный в папке функции.#load "mylogger.csx" loads a file located in the function folder.
  • #load "loadedfiles\mylogger.csx" загружает файл, расположенный в папке, которая содержится в папке функции.#load "loadedfiles\mylogger.csx" loads a file located in a folder in the function folder.
  • #load "..\shared\mylogger.csx" загружает файл, расположенный в папке на том же уровне, что и папка функции, то есть непосредственно в разделе wwwroot.#load "..\shared\mylogger.csx" loads a file located in a folder at the same level as the function folder, that is, directly under wwwroot.

Директива #load работает только с CSX-файлами, но не с CS-файлами.The #load directive works only with .csx files, not with .cs files.

Привязка к возвращаемому значению методаBinding to method return value

Используйте возвращаемое значение метода для выходной привязки, указав имя $return в function.json.You can use a method return value for an output binding, by using the name $return in function.json. Примеры см. в статье о триггерах и привязках.For examples, see Triggers and bindings.

Используйте возвращаемое значение, только если в результате успешного выполнения функции всегда возвращается значение для передачи в привязку для вывода.Use the return value only if a successful function execution always results in a return value to pass to the output binding. В противном случае используйте ICollector или IAsyncCollector, как указано в следующем разделе.Otherwise, use ICollector or IAsyncCollector, as shown in the following section.

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

Чтобы записать несколько значений в привязку для вывода или если после успешного вызова функции не возвращается значение для передачи в привязку для вывода, используйте типы ICollector или IAsyncCollector.To write multiple values to an output binding, or if a successful function invocation might not result in anything to pass to the output binding, use the ICollector or IAsyncCollector types. Эти типы представляют собой доступные только для записи коллекции, записываемые в выходную привязку по завершении метода.These types are write-only collections that are written to the output binding when the method completes.

В следующем примере записываются несколько сообщений очереди в ту же очередь с помощью ICollector:This example writes multiple queue messages into the same queue using ICollector:

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

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

Для записи выходных данных в потоковые журналы в C# включите аргумент с типом ILogger.To log output to your streaming logs in C#, include an argument of type ILogger. Рекомендуем присвоить ему имя log.We recommend that you name it log. Не используйте Console.Write в Функциях Azure.Avoid using Console.Write in Azure Functions.

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

Примечание

Сведения о новой платформе ведения журналов, которую можно использовать вместо TraceWriter, см. в разделе Запись журналов в функциях C# статьи Мониторинг Функций Azure.For information about a newer logging framework that you can use instead of TraceWriter, see Write logs in C# functions in the Monitor Azure Functions article.

Асинхронный режимAsync

Чтобы сделать функцию асинхронной, используйте ключевое слово async и верните объект Task.To make a function asynchronous, use the async keyword and return a Task object.

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

Вы не можете использовать параметры out в асинхронных функциях.You can't use out parameters in async functions. Вместо этих параметров для выходных привязок используйте возвращаемое значение функции или объект сборщика.For output bindings, use the function return value or a collector object instead.

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

Функция может принимать параметр CancellationToken, который позволяет операционной системе передавать в ваш код сведения о том, что выполнение функции будет завершено.A function can accept a CancellationToken parameter, which enables the operating system to notify your code when the function is about to be terminated. Это уведомление можно использовать для предотвращения ситуации, когда выполнение функции завершается неожиданно, оставляя данные в несогласованном состоянии.You can use this notification to make sure the function doesn't terminate unexpectedly in a way that leaves data in an inconsistent state.

В следующем примере показано, как проверить, не приближается ли завершение выполнения функции.The following example shows how to check for impending function termination.

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);
    }
}

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

Если требуется импортировать пространства имен, это можно сделать как обычно — с помощью предложения using .If you need to import namespaces, you can do so as usual, with the using clause.

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

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

Следующие пространства имен импортируются автоматически и поэтому являются необязательными:The following namespaces are automatically imported and are therefore optional:

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

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

Для сборок платформы добавьте ссылки с помощью директивы #r "AssemblyName" .For framework assemblies, add references by using the #r "AssemblyName" directive.

#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:The following assemblies are automatically added by the Azure Functions hosting environment:

  • 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

К следующим сборкам можно обращаться по простому имени (например, #r "AssemblyName"):The following assemblies may be referenced by simple-name (for example, #r "AssemblyName"):

  • Newtonsoft.Json
  • Microsoft.WindowsAzure.Storage
  • Microsoft.ServiceBus
  • Microsoft.AspNet.WebHooks.Receivers
  • Microsoft.AspNet.WebHooks.Common
  • Microsoft.Azure.NotificationHubs

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

Чтобы указать ссылку на пользовательские сборки, можно использовать общую или закрытую сборку.To reference a custom assembly, you can use either a shared assembly or a private assembly:

  • Общие сборки совместно используют все функции в приложении-функции.Shared assemblies are shared across all functions within a function app. Чтобы добавить ссылку на пользовательскую сборку, отправьте ее в папку с именем bin в корневом каталоге приложения-функции (wwwroot).To reference a custom assembly, upload the assembly to a folder named bin in your function app root folder (wwwroot).

  • Закрытые сборки входят в контекст указанной функции и поддерживают загрузку неопубликованных приложений разных версий.Private assemblies are part of a given function's context, and support side-loading of different versions. Закрытые сборки необходимо отправить в папку bin в каталоге функции.Private assemblies should be uploaded in a bin folder in the function directory. Укажите ссылки на сборки, используя имя файла, например #r "MyAssembly.dll".Reference the assemblies using the file name, such as #r "MyAssembly.dll".

Дополнительные сведения о передаче файлов в папку функции см. в разделе об управлении пакетами.For information on how to upload files to your function folder, see the section on package management.

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

Каталог, содержащий файл сценария функции, автоматически отслеживает изменения в сборках.The directory that contains the function script file is automatically watched for changes to assemblies. Чтобы отслеживать изменения сборки в других каталогах, добавьте их в список watchDirectories в host.json.To watch for assembly changes in other directories, add them to the watchDirectories list in host.json.

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

Чтобы использовать пакеты NuGet в функции 2. x и более C# поздних версий, отправьте файл Function. proj в папку функции в файловой системе приложения-функции.To use NuGet packages in a 2.x and later C# function, upload a function.proj file to the function's folder in the function app's file system. Ниже приведен пример файла function.proj, который добавляет ссылку на Microsoft.ProjectOxford.Face версии 1.1.0.Here is an example function.proj file that adds a reference to Microsoft.ProjectOxford.Face version 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>

Чтобы использовать настраиваемые веб-каналы NuGet, укажите веб-канал в файле Nuget.Config в корне приложения-функции.To use a custom NuGet feed, specify the feed in a Nuget.Config file in the Function App root. Дополнительные сведения см. в статье Configuring NuGet behavior (Настройка поведения NuGet).For more information, see Configuring NuGet behavior.

Примечание

В функциях 1 C# . x ссылки на пакеты NuGet указываются в файле Project. JSON вместо файла Function. proj .In 1.x C# functions, NuGet packages are referenced with a project.json file instead of a function.proj file.

Для функций 1. x используйте вместо него файл Project. JSON .For 1.x functions, use a project.json file instead. Ниже приведен пример файла Project. JSON .Here is an example project.json file:

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "Microsoft.ProjectOxford.Face": "1.1.0"
      }
    }
   }
}

Использование файла Function. projUsing a function.proj file

  1. Откройте функцию на портале Azure.Open the function in the Azure portal. На вкладке "Журналы" отображаются выходные данные установки пакета.The logs tab displays the package installation output.
  2. Чтобы передать файл Function. proj , используйте один из методов, описанных в статье как обновить файлы приложения-функции в справочнике разработчика по функциям Azure.To upload a function.proj file, use one of the methods described in the How to update function app files in the Azure Functions developer reference topic.
  3. После отправки файла Function. proj вы увидите в журнале потоковой передачи функции выходные данные, как в следующем примере:After the function.proj file is uploaded, you see output like the following example in your function's streaming log:
2018-12-14T22:00:48.658 [Information] Restoring packages.
2018-12-14T22:00:48.681 [Information] Starting packages restore
2018-12-14T22:00:57.064 [Information] Restoring packages for D:\local\Temp\9e814101-fe35-42aa-ada5-f8435253eb83\function.proj...
2016-04-04T19:02:50.511 Restoring packages for D:\home\site\wwwroot\HttpTriggerCSharp1\function.proj...
2018-12-14T22:01:00.844 [Information] Installing Newtonsoft.Json 10.0.2.
2018-12-14T22:01:01.041 [Information] Installing Microsoft.ProjectOxford.Common.DotNetStandard 1.0.0.
2018-12-14T22:01:01.140 [Information] Installing Microsoft.ProjectOxford.Face.DotNetStandard 1.0.0.
2018-12-14T22:01:09.799 [Information] Restore completed in 5.79 sec for D:\local\Temp\9e814101-fe35-42aa-ada5-f8435253eb83\function.proj.
2018-12-14T22:01:10.905 [Information] Packages restored.

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

Чтобы получить значение переменной среды или значение параметра приложения, используйте System.Environment.GetEnvironmentVariable, как показано в следующем примере кода.To get an environment variable or an app setting value, use System.Environment.GetEnvironmentVariable, as shown in the following code example:

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);
}

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

Для C# и других языков .NET можно использовать шаблон императивной привязки, которая отличается от декларативной привязки в файле function.json.In C# and other .NET languages, you can use an imperative binding pattern, as opposed to the declarative bindings in function.json. Императивную привязку удобно использовать, когда параметры привязки должны вычисляться не при проектировании, а во время выполнения.Imperative binding is useful when binding parameters need to be computed at runtime rather than design time. С использованием такого шаблона можно моментально выполнить привязку к поддерживаемым входным и выходным привязкам в коде функции.With this pattern, you can bind to supported input and output bindings on-the-fly in your function code.

Определите принудительную привязку следующим образом.Define an imperative binding as follows:

  • Не добавляйте запись для нужных императивных привязок в файл function.json.Do not include an entry in function.json for your desired imperative bindings.
  • Передайте входной параметр Binder binder или IBinder binder.Pass in an input parameter Binder binder or IBinder binder.
  • Используйте следующий шаблон C# для привязки данных,Use the following C# pattern to perform the data binding.
using (var output = await binder.BindAsync<T>(new BindingTypeAttribute(...)))
{
    ...
}

где BindingTypeAttribute — атрибут .NET, определяющий пользовательскую привязку, а T — входной или выходной тип, поддерживаемый этим типом привязки.BindingTypeAttribute is the .NET attribute that defines your binding and T is an input or output type that's supported by that binding type. T не может быть параметром типа out (например, out JObject).T cannot be an out parameter type (such as out JObject). Например, выходная привязка таблицы мобильных приложений поддерживает шесть выходных типов, но для Tможно использовать только ICollector<t > или IAsyncCollector<T> .For example, the Mobile Apps table output binding supports six output types, but you can only use ICollector<T> or IAsyncCollector<T> for T.

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

В следующем примере кода создается выходная привязка большого двоичного объекта службы хранилища с путем к большому двоичному объекту, определенному во время выполнения, а затем записывается строка в большой двоичный объект.The following example code creates a Storage blob output binding with blob path that's defined at run time, then writes a string to the blob.

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 представляет собой поддерживаемый тип выходной привязки.BlobAttribute defines the Storage blob input or output binding, and TextWriter is a supported output binding type.

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

В предыдущем примере код получает параметр приложения для строки подключения основной учетной записи хранения приложения-функции (т. е. AzureWebJobsStorage).The preceding example gets the app setting for the function app's main Storage account connection string (which is AzureWebJobsStorage). Вы можете указать пользовательский параметр приложения, который следует использовать для учетной записи хранения. Для этого добавьте StorageAccountAttribute и передайте массив атрибутов в BindAsync<T>().You can specify a custom app setting to use for the Storage account by adding the StorageAccountAttribute and passing the attribute array into BindAsync<T>(). Используйте параметр Binder, а не IBinder.Use a Binder parameter, not IBinder. Пример.For example:

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 для каждого типа привязки и пакеты, в которых они определены.The following table lists the .NET attributes for each binding type and the packages in which they are defined.

ПривязкаBinding АтрибутAttribute Ссылка, которую нужно добавитьAdd reference
База данных CosmosCosmos DB Microsoft.Azure.WebJobs.DocumentDBAttribute #r "Microsoft.Azure.WebJobs.Extensions.CosmosDB"
Концентраторы событийEvent Hubs Microsoft.Azure.WebJobs.ServiceBus.EventHubAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttributeMicrosoft.Azure.WebJobs.ServiceBus.EventHubAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttribute #r "Microsoft.Azure.Jobs.ServiceBus"
Мобильные приложенияMobile Apps Microsoft.Azure.WebJobs.MobileTableAttribute #r "Microsoft.Azure.WebJobs.Extensions.MobileApps"
Концентраторы уведомленийNotification Hubs Microsoft.Azure.WebJobs.NotificationHubAttribute #r "Microsoft.Azure.WebJobs.Extensions.NotificationHubs"
Служебная шина AzureService Bus Microsoft.Azure.WebJobs.ServiceBusAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttributeMicrosoft.Azure.WebJobs.ServiceBusAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttribute #r "Microsoft.Azure.WebJobs.ServiceBus"
Очередь службы хранилищаStorage queue Microsoft.Azure.WebJobs.QueueAttribute, Microsoft.Azure.WebJobs.StorageAccountAttributeMicrosoft.Azure.WebJobs.QueueAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
Большой двоичный объект службы хранилищаStorage blob Microsoft.Azure.WebJobs.BlobAttribute, Microsoft.Azure.WebJobs.StorageAccountAttributeMicrosoft.Azure.WebJobs.BlobAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
Таблица службы хранилищаStorage table Microsoft.Azure.WebJobs.TableAttribute, Microsoft.Azure.WebJobs.StorageAccountAttributeMicrosoft.Azure.WebJobs.TableAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
TwilioTwilio Microsoft.Azure.WebJobs.TwilioSmsAttribute #r "Microsoft.Azure.WebJobs.Extensions.Twilio"

Дальнейшие действияNext steps