我要做的是模拟一个随机令牌,该令牌将从另一个系统通过 url 发送。这个其他系统还将在数据库中插入 3 个值:
- ID
- 知识产权
- 当前时间
现在,在另一个时间,客户端访问应用程序时,它必须与第一次访问它的系统具有相同的 IP 和 ID,并且时间差必须在 30 分钟以内,否则会话未通过身份验证,机器将被限制并发送到错误页面。
我有一个问题:
- 当我执行时
session[] sessionArray = a.ToArray();
出现以下错误:
{“函数 cgdimport.DiffMinutes 不存在”}
正如 WiiMaxx 所解释的:
不,您的错误不存在您的错误是 EntityFunctions.DiffMinutes(b.start, DateTime.Now)。因为您的 b 不包含名为 DiffMinutes() 的函数
所以我尝试了另一种方法:
ar a = (from b in data.session
where b.idsession == sessionid
&& b.ip == clientip
&& DateTime.Now <= b.start + new TimeSpan(0, 0, 30, 0)
select b);
但它给了我以下错误:
DbArithmeticExpression 参数必须具有数字通用类型。
还有一个:
var a = (from b in data.session
where b.idsession == sessionid
&& b.ip == clientip
&& DateTime.Now <= b.start.AddMinutes(30)
select b);
但是出现了这个错误:
LINQ to Entities 无法识别方法 'System.DateTime AddMinutes(Double)' 方法,并且此方法无法转换为存储表达式。
public ActionResult SessionController()
{
var data = new cgdimportEntities();
//Request sessionnid from the URL
if (!Request.QueryString["token"].IsEmpty() && Request.QueryString["token"] != null)
{
//Obtain client IP
string clientip = HttpContext.Request.UserHostAddress;
//Request sessionid from url
string sessionid = Request.QueryString["token"];
//string sessionid = token;
//Dummy Test Insert
var sessionvar = new session {idsession = sessionid, ip = clientip, start = DateTime.Now};
data.session.Add(sessionvar);
try { data.SaveChanges(); }
catch (DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}", validationErrors.Entry.Entity.GetType().FullName,
validationError.PropertyName, validationError.ErrorMessage);
}
}
}
//old code
//var a = (from b in data.session
//where b.idsession == sessionid
//&& b.ip == clientip
//&& EntityFunctions.DiffMinutes(b.start, DateTime.Now) < 30
//select b);
//old code
//var a = (from b in data.session
//where b.idsession == sessionid
//&& b.ip == clientip
//&& DateTime.Now <= b.start + new TimeSpan(0, 0, 30, 0)
//select b);
//new code
var a = (from b in data.session
where b.idsession == sessionid
&& b.ip == clientip
&& DateTime.Now <= b.start.AddMinutes(30)
select b);
int count = 0;
//ERROR HERE! ERROR HERE!
session[] sessionArray = a.ToArray();
foreach (var i in sessionArray)
{
count++;
}
//if 0 rows are counted
if (count == 0)
{
Session["authenticated"] = "false";
return RedirectToAction("Erro", "Login", new { erro = "No rows counted" });
}
//Once all queries are verified, the user is authenticated
Session["authenticated"] = "true";
return RedirectToAction("Painel", "Data");
}
Session["authenticated"] = "false";
return RedirectToAction("Erro", "Login", new { erro = "Query is null" });
}