2017-05-08 9 views
1

Xamarinアプリケーションからメッセージが表示されたときに通知を受け取るためにサービスバスキューに登録する方法はありますか(もしそうなら、最良の方法はありますか)。Xamarinからサービスバスキューを効率的に購読できますか?

私はコンソールアプリでこのサンプルを使用しましたし、それがうまく動作しますが、私のXamarinは何の問題もなくWindowsAzure.ServiceBug Nuget packageへの参照を追加PCL desipiteフォームにQueueClientをインスタンス化することができるように見えるいけない:

Console.WriteLine("Receive critical messages. Ctrl-C to exit.\n"); 
var connectionString = "{service bus listen string}"; 
var queueName = "{queue name}"; 

var client = QueueClient.CreateFromConnectionString(connectionString, queueName); 

client.OnMessage(message => 
    { 
     Stream stream = message.GetBody<Stream>(); 
     StreamReader reader = new StreamReader(stream, Encoding.ASCII); 
     string s = reader.ReadToEnd(); 
     Console.WriteLine(String.Format("Message body: {0}", s)); 
    }); 

Console.ReadLine(); 

Xamarinで行うのが好ましい方法はありますか?

編集

明確にするために、私は、キューにメッセージを投稿し、それに加入するとメッセージが表示されたときに効率的に通知を受信したくありません。私はREST APIを使用することができますが、私は更新を頻繁にポーリングしなければなりません。これは非常に非効率的です。

編集2

私はロングポーリングを使用してみましたが、世論調査を返すようそれは本当に私は意味「204コンテンツなし」でほとんど即座にサービスバスキューでは動作しません。依然として連続してキューに当たっています。私は私が正しく理解していれば、あなたが言及したSDKは、Xamarinプラットフォームのために合われていません

おかげ

+1

の可能性のある重複した[XamarinフォームからAzureのServiceBus PCL](のhttp:// stackoverflowのを.com/questions/39753431/azure-servicebus-from-xamarin-forms-pcl) – Thomas

+0

@Thomasに感謝します。しかし、メッセージをキューにプッシュしたくありません。クライアントからのサービスバスキューを継続的にポーリングしなくても、可能な限り最も効率的な方法で購読したい – LDJ

答えて

0

を単にメッセージを待つことができて、私のサブスクリプションを介して通知を受けるSDKを使用しました。 Microsoft.Azure.ServiceBusを試してみてください。それはプレリリース版バージョンです。

我々は継続的にクライアントからサービスバスキューをポーリングOTたい場合は、次のコードを使用しようとしていてください。

var queueClient = new QueueClient(connectionstring, queueName, ReceiveMode.PeekLock); 

    // Register a OnMessage callback 
    queueClient.RegisterMessageHandler(
     async (message, token) => 
     { 
      // Process the message 
      string messageBody = Encoding.UTF8.GetString(message.Body); 

      // Complete the message so that it is not received again. 
      // This can be done only if the queueClient is opened in ReceiveMode.PeekLock mode. 
      await queueClient.CompleteAsync(message.SystemProperties.LockToken); 
       },new MessageHandlerOptions 
       { 
        MaxConcurrentCalls = 1, AutoComplete = false 
       }); 
関連する問題