Azure功能blob绑定

mar*_*s-O 4 c# azure azure-functions

我不能在不使用C#实现(而不是CSX)中的[BlobAttribute]的情况下将blob类型的输入参数绑定到字符串/ TextReader.

我得到的错误是:

Microsoft.Azure.WebJobs.Host: Error indexing method 'Functions.Harvester'. 
Microsoft.Azure.WebJobs.Host: Cannot bind parameter 'configReader' to type 
TextReader. Make sure the parameter Type is supported by the binding. If 
you're using binding extensions (e.g. ServiceBus, Timers, etc.) make sure 
you've called the registration method for the extension(s) in your startup 
code (e.g. config.UseServiceBus(), config.UseTimers(), etc.).
Run Code Online (Sandbox Code Playgroud)

function.config:

"bindings": [
    {
      "type": "timerTrigger",
      "schedule": "0 */5 * * * *",
      "useMonitor": true,
      "runOnStartup": false,
      "direction": "in",
      "name": "myTimer"
    },
    {
      "type": "blob",
      "name": "configReader",
      "path": "secured/app.config.json",
      "connection": "XXX",
      "direction": "in"
    }
  ],
Run Code Online (Sandbox Code Playgroud)

功能签名(NOT BINDING configReader):

[FunctionName("Harvester")]
 public static async Task Run(
   [TimerTrigger("0 */5 * * * *")]TimerInfo myTimer,
   TraceWriter log,
   TextReader configReader)
Run Code Online (Sandbox Code Playgroud)

这会工作(BINDING configReader:

[FunctionName("Harvester")]
 public static async Task Run(
   [TimerTrigger("0 */5 * * * *")]TimerInfo myTimer,
   TraceWriter log,
   [Blob("secured/app.config.json", FileAccess.Read)]TextReader configReader)
Run Code Online (Sandbox Code Playgroud)

关于如何在不指定blob路径的情况下使其工作的任何想法BlobAttribute.理想情况下,我将Blob配置保留在代码之外,这样我的功能就会变得更加便携.

ahm*_*yed 6

问题结果是最新的运行时支持一个新的属性(configurationSource)function.json

这告诉运行时为函数配置使用config(即function.json)或C#属性.

基本上允许你像这样定义你的功能

现在您可以将您的函数定义为

[FunctionName("Harvester")]
public static async Task Run(
    [TimerTrigger]TimerInfo myTimer,
    TraceWriter log,
    TextReader configReader)
{
}
Run Code Online (Sandbox Code Playgroud)

以及function.json看起来像这样的

{
  "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.0.0",
  "configurationSource": "config",
  "bindings": [
    {
      "type": "timerTrigger",
      "schedule": "0 */5 * * * *",
      "useMonitor": true,
      "runOnStartup": false,
      "direction": "in",
      "name": "myTimer"
    },
    {
      "type": "blob",
      "name": "configReader",
      "path": "secured/app.config.json",
      "connection": "XXX",
      "direction": "in"
    }
  ],
  "disabled": false,
  "scriptFile": "...",
  "entryPoint": "..."
}
Run Code Online (Sandbox Code Playgroud)

或者像这样

[FunctionName("Harvester")]
public static async Task Run(
    [TimerTrigger("0 */5 * * * *")]TimerInfo myTimer,
    TraceWriter log,
    [Blob("secured/app.config.json", FileAccess.Read)]TextReader configReader)
{
}
Run Code Online (Sandbox Code Playgroud)

使用这样的简单配置

{
  "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.0.0",
  "configurationSource": "attributes",
  "bindings": [
    {
      "type": "timerTrigger",
      "name": "myTimer"
    },
  ],
  "scriptFile": "...",
  "entryPoint": "..."
}
Run Code Online (Sandbox Code Playgroud)

请注意configurationSource两个示例中的值.

Visual Studio 2017的工具默认使用后者.如果您想更改function.json以包含所有配置并更改,configurationSource则需要在项目中包含该文件并将其标记为始终复制.这个GIF显示了如何做到这一点.