我创建了CreateAccountValidator
类,负责在IIS上托管的WebAPI2应用程序中验证我的绑定模型。
以下是我的课程:
public class CreateAccountValidator : AbstractValidator<CreateAccountBindingModel>
{
public CreateAccountValidator()
{
RuleFor(u => u.Amount)
.Cascade(CascadeMode.StopOnFirstFailure)
.GreaterThan(0).WithMessage("Must be greater than 0");
RuleFor(u => u.FirstName)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotEmpty().WithMessage("Name is required")
.Length(3, 20).WithMessage("Name must be between 3 and 20 characters");
RuleFor(u => u.LastName)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotEmpty().WithMessage("Surname is required")
.Length(3, 20).WithMessage("Surname must be between 3 and 20 characters");
RuleFor(u => u.ID)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotEmpty().WithMessage("ID is required")
.Must(ValidateId).WithMessage("ID is invalid");
}
private bool ValidateId(CreateAccountBindingModel createAccountBindingModel, string id, PropertyValidatorContext context)
{
var id_valid = IdValidator.IsValid(id);
if (!id_valid)
{
using (var db = new ApplicationDbContext())
{
//get request IP!!!
db.SaveAlert(createAccountBindingModel.UserEmail, "ID - CHECKSUM", string.Format("User entered: {0}", id), "192.100.100.100");
return false;
}
}
return true;
}
}
在ValidateId
方法内部我正在调用我的自定义验证器,如果它返回false,我想将该事实记录到数据库。
我需要获得Request IP,但我不知道该怎么做。我没有IOwinContext或Request属性。在Api控制器里面我打电话:
Request.GetOwinContext().Get<ApplicationDbContext>()
我可以从应用程序内的类访问IOwinContext吗?是的,那我该怎么做?
答案 0 :(得分:1)
所以HttpContext
在ASP.NET中是静态的。
所以HttpContext.Current.Request.GetOwinContext()
但是,您在问题中正确使用ApplicationDbContext
并且我不会更改
原因是,您希望仅围绕可能的最小工作单元实例化新的上下文。你做得非常正确。