0

Webアプリケーションの前に配置し、httpリクエストを非常に受け取りやすいAzure Queue(サービスバスまたはストレージキュー)を作成できるかどうかを知りたいです。Azureキューでhttpリクエストを受信する

アップデート

コメントや回答をいただきありがとうございます。

IISに負荷をかけずにリクエストを処理したいです。 IISに到達する前にキュー内の要求を処理できるようにする必要があります。

+0

各リクエストを順番に処理しますか?あなたがOWINの上にあなたのWebアプリケーションを構築していたなら、あなたが望むことをするミドルウェアを登録することができます。 – woelliJ

+0

質問を詳しく教えてもらえますか?あなたが達成しようとしていることは明確ではありません。 –

答えて

2

Webアプリケーションの前に置くことができ、http要求を非常に受け付けることができるAzure Queue(サービスバスまたはストレージキュー)を作成できる場合は、

Azure Web Appで要求を渡す前に、要求メッセージをキューに保存してコードを追加することができます。 Azure Storageキューに要求メッセージを記録するC#バージョンのサンプルコードを書きました。以下の手順は参考になります。

手順1.プロジェクトにhttpモジュールを追加します。このモジュールでは、HttpApplicationのBeginRequestイベントを登録し、メッセージ記録ジョブを行います。

public class RequestToQueueModeule : IHttpModule 
{ 
    #region IHttpModule Members 

    public void Dispose() 
    { 
     //clean-up code here. 
    } 

    public void Init(HttpApplication context) 
    { 
     // Below is an example of how you can handle LogRequest event and provide 
     // custom logging implementation for it 
     context.BeginRequest += new EventHandler(OnBeginRequest); 
    } 

    #endregion 

    public void OnBeginRequest(Object source, EventArgs e) 
    { 
     HttpApplication context = source as HttpApplication; 
     AddMessageToQueue(context.Request); 
    } 


    public void AddMessageToQueue(HttpRequest request) 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.AppendLine(request.HttpMethod + " " + request.RawUrl + " " + request.ServerVariables["SERVER_PROTOCOL"]); 
     for (int i = 0; i < request.Headers.Count; i++) 
     { 
      sb.AppendLine(request.Headers.Keys[i] + ":" + request.Headers[i]); 
     } 
     sb.AppendLine(); 
     if (request.InputStream != null) 
     { 
      using (StreamReader sr = new StreamReader(request.InputStream)) 
      { 
       sb.Append(sr.ReadToEnd()); 
      } 
     } 

     // Retrieve storage account from connection string. 
     CloudStorageAccount storageAccount = CloudStorageAccount.Parse("connection string of your azure storage"); 

     // Create the queue client. 
     CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient(); 

     // Retrieve a reference to a queue. 
     CloudQueue queue = queueClient.GetQueueReference("queue name which is used to store the request message"); 

     // Create the queue if it doesn't already exist. 
     queue.CreateIfNotExists(); 

     // Create a message and add it to the queue. 
     CloudQueueMessage message = new CloudQueueMessage(sb.ToString()); 
     queue.AddMessage(message); 
    } 
} 

ステップ2. web.configのsystem.webServerノードに上位モジュールを登録します。あなたのモジュールが配置されている名前空間の名前を変更してください。

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="RequestToQueueModeule" type="[your namespace name].RequestToQueueModeule" /> 
    </modules> 
</system.webServer> 

私はIISをburdingせずに要求を処理します。 IISに到達する前にキュー内の要求を処理できるようにする必要があります。

要求がIISに届く前にキューで処理する場合は、Azure Web Appの前にプロキシを追加する必要があります。 Azure Application Gatewayはプロキシとして動作し、Web Appの前に置くことができます。 HTTリクエストの主な情報のみを記録する場合は、Azure Application Gatewayを使用してアクセスログをオンにできます。詳細については、下記のリンクを参考にしてください。

Diagnostic logs of Application Gateway

あなたはすべてのリクエスト・メッセージを保存したい場合は、私はあなたがカスタムプロキシを構築し、自分で要求をログに記録する必要があるかと思います。

+1

あなたの質問の更新に基づいて返信を修正しました。 – Amor

+0

ありがとうございました。このような解決策が必要な理由は、顧客がアイテム(パケット)をトレースするために使用するアプリケーションがあるからです。それはデータマイニングを何度も受けました。私たちは再チャプターを使いたくありません。このソリューションによって、私はオーガニック要求と非オーガニック要求(適切なItemIdが含まれているがロボットからの要求である)を区別し、それらをオーガニック要求のために速くし、非オーガニックのために遅くするために異なるレイテンシを持つ2つの異なるキューリクエスト。 – user217648

+1

URLにItemIdが渡されていますか?パスベースのルーティングをサポートするアプリケーションゲートウェイを使用できます。 ItemIdがHTTPヘッダーで渡された場合、それをルーティングできるAzureサービスはありません。おそらくあなたはVMを作成し、いくつかの逆プロキシを使ってそれを行うことができます。例えば、[Nginx](https://sites.psu。edu/jasonheffner/2015/06/19/nginx-use-different-backend-based-http-header /)を使用します。 – Amor

関連する問題