2017-06-12 12 views
0

私はIoTHubからメッセージを受け取り、処理のために所定のキューに配置するAzure関数を持っています。キューは、着信メッセージデータによって、実行時に動的に決定し、私は唯一のメッセージが数秒間持続したいと短いExpirationTimeでキューに配置されています。タイプCloudQueueを使用するAzure関数からストレージアカウントの名前を指定してください

#r "Microsoft.WindowsAzure.Storage" 
#r "Newtonsoft.Json" 

using System; 
using Microsoft.WindowsAzure.Storage.Queue; 
using Newtonsoft.Json; 


public static void Run(MyType myEventHubMessage, IBinder binder, TraceWriter log) 
{ 
    int TTL = 3; 
    var data = JsonConvert.SerializeObject(myEventHubMessage); 
    var msg = new CloudQueueMessage(data); 

    string outputQueueName = myEventHubMessage.DeviceId; 
    QueueAttribute queueAttribute = new QueueAttribute(outputQueueName); 
    CloudQueue outputQueue = binder.Bind<CloudQueue>(queueAttribute); 

    outputQueue.AddMessage(msg, TimeSpan.FromSeconds(TTL), null, null, null); 

} 

public class MyType 
{ 
    public string DeviceId { get; set; } 
    public double Field1 { get; set; } 
    public double Field2 { get; set; } 
    public double Field3 { get; set; } 

} 

これ、うまく機能しているとのメッセージがされています私のキューに書き込まれます。ただし、書き込むキューは、使用したいストレージアカウントではありません!それは他の場所からストレージアカウントを取得しているようですか?

私は私のfunction.jsonで接続プロパティを持っている:

{ 
    "bindings": [ 
    { 
     "type": "eventHubTrigger", 
     "name": "myEventHubMessage", 
     "direction": "in", 
     "path": "someiothub", 
     "connection": "IoTHubConnectionString" 
    }, 
    { 
     "type": "CloudQueue", 
     "name": "$return", 
     "queueName": "{DeviceId}", 
     "connection": "NAME_OF_CON_STRING_I_WANT_TO_USE", 
     "direction": "out" 
    } 
    ], 
    "disabled": false 
} 

が、その完全に無視されています。面白いことに、JSONから値またはキーと値のペアを完全に削除すると、関数が実行され、デフォルトのストレージアカウントがどこかにあるように見えます。

私は私の実行機能に[StorageAccount("NAME_OF_CON_STR_I_WANT_TO_USE")]属性を追加しようとしたが、それも無視しているようだと私はまた、属性の配列を作成し、binder.Bind<T>(attributeArray)にQueueAttributeとStorageAccountAttributeの両方を渡すが、それはそれは、配列を受け入れることができないと文句を言いみました。

ストレージアカウントを取得してからストレージアカウントを取得する場所を知っていますか、さらに重要なのはストレージアカウント名を設定する方法です。

おかげ

答えて

1

あなたは正しい軌道に乗っている:あなたは、バインダーへの属性の配列にStorageAccountAttributeを渡す必要があります。私にはわからない理由で、コンクリートクラスの非同期バージョンのように見えます。Binderメソッドは配列の受け渡しをサポートしています。そのような何かが動作するはずです:

public static async Task Run(MyType myEventHubMessage, Binder binder, TraceWriter log) 
{ 
    // ... 
    var queueAttribute = new QueueAttribute(outputQueueName); 
    var storageAttribute = new StorageAccountAttribute("MyAccount"); 
    var attributes = new Attribute[] { queueAttribute, storageAttribute }; 
    CloudQueue outputQueue = await binder.BindAsync<CloudQueue>(attributes); 
    // ... 
} 

ところで、あなたは不可欠バインディングのためfunction.jsonで任意の設定を指定する必要はありません。彼らは無視されます。ちょうど混乱を避けるためにそれらを削除してください(もちろん、トリガーを保つ)。

+0

返信いただきありがとうございます。これはどこに文書化されていますか? 2017-06-13T09:43:56.381(20,65):エラーCS1503:引数1: 'System.Attribute []'から 'System.Attribute'に変換できません – LDJ

+0

私はドキュメントを見つけることができません...あなたは 'Binder'(' IBinder'ではなく)と 'BindAsync'(' Bind'ではなく)を使用していますか?私のために働く。 – Mikhail

+0

申し訳ありませんが、あなたは正しいです。 IBinderをバインダーに変更するのを忘れました。今の魅力のように動作します。もう一度助けてくれてありがとう:) – LDJ

関連する問題