要使用 HTTP 触发器在 Azure 函数下检索客户端 IP,可以使用以下代码片段:
运行.csx:
#r "System.Web"
using System.Web;
using System.Net;
public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log)
{
var address = ((HttpContextWrapper)req.Properties["MS_HttpContext"]).Request.UserHostAddress;
log.Info($"Your client IP: {address}");
return req.CreateResponse(HttpStatusCode.OK, $"Your client IP: {address}");
}
有关更多详细信息,您可以参考此问题。
这样我就可以阻止客户端 ipaddress 一天,如果用户对 api 的调用超过尝试次数,第二天我可以通过从队列存储运行计时器触发器中获取所有 ipaddress 来取消阻止客户端 ipaddress。
我更喜欢使用表存储来存储特定 IP 的访问日志。您可以将PartitionKey
列设置为 Date、设置RowKey
为ClientIP
or ClientIP + ApiName
,也可以添加其他列(Timestamp、TotalRequests 等)。此外,您可以参考Azure 存储表设计指南来设计存储表。
对于您的 azure 功能,您可以使用存储表绑定和表存储 SDK来读取特定 IP 的请求日志并更新特定 IP 的总请求数。此外,这里有一个类似的博客,你可以参考这里。
更新:
您可以将日志配置为存储在“监控 > 诊断日志”下的文件系统或 blob 存储中,如下所示:
对于应用程序日志记录(文件系统),您可以通过kudu找到日志:
对于应用程序日志记录 (Blob),您可以利用存储资源管理器来检索您的日志。