Azure队列接收http请求

时间:2017-06-19 07:12:11

标签: azure azure-servicebus-queues azure-queues azure-storage-queues

我想知道是否可以创建一个Azure Queue(服务总线或存储队列),它可以放在Web应用程序的前面并且非常接收http请求。

更新

感谢您的评论和解答。

我想处理请求而不会烧掉IIS。我需要能够在到达IIS之前处理队列中的请求。

1 个答案:

答案 0 :(得分:2)

  

如果可以创建Azure队列(服务总线或存储队列),它可以放在Web应用程序前面并且非常接收http请求。

我们可以在通过添加一些代码在Azure Web App中处理请求之前将请求消息保存到队列。我编写了一个C#版本示例代码,它将请求消息记录到Azure存储队列。以下步骤供您参考。

步骤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。我需要能够在到达IIS之前处理队列中的请求。

如果要在队列到达IIS之前处理队列中的请求,则需要在Azure Web App前添加代理。 Azure Application Gateway充当代理,可以放在Web App前面。如果您只想记录HTT请求的主要信息,可以使用Azure Application Gateway并打开Access Log。有关更多信息,请参阅以下链接供您参考。

Diagnostic logs of Application Gateway

如果您想保存所有请求消息,我恐怕您需要构建自定义代理并自行记录请求。