1、创建一个存储请求详细信息的类。
public class IPDetailModel
{
public string IPAddress
{
get;
set;
}
public DateTime Time
{
get;
set;
}
public int Count
{
get;
set;
}
}
2、创建一个类来处理逻辑,这里我设置的是两分钟之内一个IP只能请求一次进来
public class TraceIPAttribute : ActionFilterAttribute
{
IPDetailModel model = new IPDetailModel();
public override void OnActionExecuting(ActionExecutingContext context)
{
var remoteIp = context.HttpContext.Connection.RemoteIpAddress.ToString();
if (context.HttpContext.Session.GetString(remoteIp) == null)
{
model.Count = 1;
model.IPAddress = remoteIp;
model.Time = DateTime.Now;
context.HttpContext.Session.SetString(remoteIp, JsonConvert.SerializeObject(model));
}
else
{
var _record = JsonConvert.DeserializeObject<IPDetailModel>(context.HttpContext.Session.GetString(remoteIp));
if (DateTime.Now.Subtract(_record.Time).TotalMinutes < 2 && _record.Count >= 1)
{
context.Result = new JsonResult("Permission denined!");
}
else
{
_record.Count = _record.Count + 1;
context.HttpContext.Session.Remove(remoteIp);
context.HttpContext.Session.SetString(remoteIp, JsonConvert.SerializeObject(_record));
}
}
}
}
3、startup里添加配置
services.AddDistributedMemoryCache();
services.AddSession();
services.AddScoped<TraceIPAttribute>();
app.UseSession();
4、给controller或者接口上打标签 [ServiceFilter(typeof(TraceIPAttribute))]
[ServiceFilter(typeof(TraceIPAttribute))]
[HttpPost]
public object Text()
{
return new {};
}