2016-04-05 15 views
10

Azure関数のバインディングオプションを使用すると、トリガから導出されたパラメータ(関数をトリガしたキューメッセージなど)に基づいて書き込まれるBlobの名前を指定できます。ドキュメントにその例が示されています。Azure関数の出力Blobの名前の生成

私の質問は、ブロブ名が事前にわかっていないケースを処理する最善の方法は何ですか、実際にはが計算されて、関数の実行の一部としてが計算されますか?

関連性:計算の結果に基づいて、関数が出力blob(または複数の出力blob!)を生成するかどうかはどうしたらよいでしょうか?

Azure関数のバインドメカニズムは、これらのケースではあまり役に立ちません。最も簡単な方法は、紺碧のブロブを「古典的な方法」で書くアセンブリを参照することです。しかし、より慣用的なやり方がありますか?

+0

不足している情報で更新された回答はこちら[こちら](http://stackoverflow.com/questions/39855409/how-do-i-use-binder-to-perform-dynamic-bindings-in-my-c-sharp) -関数)。 –

答えて

15

C#Azure関数で実際にこれを実行することができます.Node.js関数でもこれを有効にするための追跡項目here in our repoがあります。私たちはすぐにそれに着きます。

ランタイムで指定されたパスでblobにバインドする作業関数の例を以下に示します。 Azure関数のカバーはAzure WebJobs SDK上に構築されているため、これはWebJobs SDK Binderの使い方に慣れていることがわかります。 IBinder/Binderの詳細については、WebJobs SDKを参照してください。 WebJobs SDKでは、バインディングに宣言属性が使用されます(例:QueueAttribute/TableAttribute/BlobAttributeなど)。これらのすべてを実行時にBinderで指定することができます。 Azure関数では、外部メタデータを使用してバインディングを記述しますが、この高度なシナリオではハイブリッドを使用します。 Binderを使用する場合、function.jsonに対応するバインディングはありません。 Binder動的バインディングの詳細については、thisを参照してください。一般的に

、あなたは多くの素晴らしいWebJobs SDKの機能はAzureの機能に使用可能であることを見つけることができます - 私たちのドキュメントは、ちょうどこのの人々に認識させるために追いつくために必要があります:)

注意すべきもう一つの事を:あり出力のためのランダムな新しい識別子を生成するためのいくつかの組み込みサポート。例えば。出力ブロブのパスをテスト出力/ {rand-guid}に設定すると、新しいIDが自動的に生成されます。それがあなたのニーズを満たしていれば、Binderは必要ありません。あなたの2番目の質問については

using System; 
using System.IO; 
using System.Net; 
using Microsoft.Azure.WebJobs; 

public static async Task<HttpResponseMessage> 
     Run(HttpRequestMessage req, Binder binder, TraceWriter log) 
{ 
    log.Verbose($"C# HTTP function processed RequestUri={req.RequestUri}"); 

    using (var writer = await binder.BindAsync<TextWriter>(
        new BlobAttribute("test-output/result"))) 
    { 
     writer.Write("Hello World!!"); 
    } 

    return new HttpResponseMessage(HttpStatusCode.OK); 
} 

、あなたは条件付きで結合出力に書き込みたい場合は、単に結合に任意の値を割り当てていない - 何も出力が生成されるべきではありません。

+2

ライターが閉じていることを確認するために '使用する 'べきでしょうか? –

+0

usingステートメントを追加するコードが更新されました。 – mathewc

+2

cool!私はIBinderの "トリック"が私のしたことを知らなかった: 'var container = outBlob.Container; var newOutBlob = container.GetBlockBlobReference(newFileName); ':$ – Nicolocodev