我想知道是否可以创建一个Azure Queue(服务总线或存储队列),它可以放在Web应用程序的前面并且非常接收http请求。
更新
感谢您的评论和解答。
我想处理请求而不会烧掉IIS。我需要能够在到达IIS之前处理队列中的请求。
答案 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
如果您想保存所有请求消息,我恐怕您需要构建自定义代理并自行记录请求。