FluentValidation访问IOwinContext - 获取请求IP并访问ApplicationDbContext

时间:2016-07-19 08:21:50

标签: c# asp.net-web-api2 owin

我创建了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吗?是的,那我该怎么做?

1 个答案:

答案 0 :(得分:1)

所以HttpContext在ASP.NET中是静态的。

所以HttpContext.Current.Request.GetOwinContext()

但是,您在问题中正确使用ApplicationDbContext并且我不会更改

原因是,您希望仅围绕可能的最小工作单元实例化新的上下文。你做得非常正确。