2017-08-22 23 views
4

CSlobではなくC#実装で[BlobAttribute]を使用せずに、blob型の入力パラメータをstring/TextReaderにバインドできません。AzureファンクションBLOBバインド

私は取得していますエラーは次のとおりです。

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.). 

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" 
    } 
    ], 

関数のシグネチャ(結合しないconfigReader):

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

これは(ただし、うまくいきますバインドconfigReader

ブロブのパスを指定せずに動作させる方法については、BlobAttributeをご覧ください。私は理想的には、コードの外にBlobの設定を保持したい、私の関数は、より移植可能になる方法。問題がfunction.json

に新しいプロパティ(configurationSource)をサポートする最新のランタイムであることが判明し

+0

VS2017ツールを使用していますか?もしあなたがそうであれば、 'function.json'ファイルを含む' Harvester'というフォルダの出力フォルダをチェックインできますか? 'configurationSource'と呼ばれるプロパティがあり、その値がどのような値であるかを調べることができますか? – ahmelsayed

+0

私はVS2017ツーリングを使用していますが、ファイルをチェックしましたが、 'configurationSource'というプロパティはありません。 'configReader'を参照していましたか?もしそうなら、それは私の元の質問に記載されている通りです(上のリストは空白のUIから来ています)。 –

+0

いいえ、 'configurationSource'は、属性対コンフィギュレーションファイルを使用するように関数ランタイムに指示するために2017ツールで導入された新しいプロパティです。あなたのcsprojの ''バージョンを確認できますか?最新版は[1.0.2](https://www.nuget.org/packages/Microsoft.NET.Sdk.Functions)ですが、これは 'configurationSource'を' attributes'にする必要があることに注意してください。それを 'config'に変更して、属性の代わりにconfigを使うようにランタイムに指示してください。その後、プロジェクトにそのjsonファイルを含める必要があります – ahmelsayed

答えて

3

これは(function.jsonです)configのいずれかを使用するには、ランタイムに指示やC#は、機能の設定のための属性。基本的に、あなたが今、あなたはこの

{ 
    "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": "..." 
} 

のように見えますfunction.jsonとともに

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

として、あなたの関数を定義するか、この

のようなあなたの関数を定義するためにどちらかの可能

このようなもの

この

{ 
    "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.0.0", 
    "configurationSource": "attributes", 
    "bindings": [ 
    { 
     "type": "timerTrigger", 
     "name": "myTimer" 
    }, 
    ], 
    "scriptFile": "...", 
    "entryPoint": "..." 
} 

ような簡単な設定を持つ

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

両方の例においてconfigurationSourceの値を確認します。

Visual Studio 2017用のツールは、デフォルトで後者を実行します。 function.jsonを変更してすべての設定をインクルードし、configurationSourceを変更する場合は、プロジェクトにファイルを含めて、常にコピーとしてマークする必要があります。このGIFはそれを行う方法を示しています。

関連する問題