我正在尝试发送登录名和密码,如果在数据库中找到它,则返回帐户详细信息。但是我在控制台上收到此错误:
ERROR HttpErrorResponse {标题:HttpHeaders,状态:500,statusText:“内部服务器错误”,URL:“ http://localhost:56624/api/Usuarios”
这是我的API代码: `
public Usuarios Post([FromBody]LoginRequest login)
{
var usuario = new Usuarios();
var con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["comidas"].ConnectionString);
var com = new SqlCommand("SELECT * FROM usuarios WHERE loginUsuario = @loginUsuario AND senhaUsuario = @senhaUsuario", con);
com.Parameters.AddWithValue("@loginUsuario", login.loginUsuario);
com.Parameters.AddWithValue("@senhaUsuario", login.senhaUsuario);
con.Open();
var rdr = com.ExecuteReader();
if (rdr.HasRows)
{
usuario.idUsuario = (int)rdr["idUsuario"];
usuario.loginUsuario = (string)rdr["loginUsuario"];
usuario.senhaUsuario = (string)rdr["senhaUsuario"];
usuario.nomeUsuario = (string)rdr["nomeUsuario"];
usuario.emailUsuario = (string)rdr["emailUsuario"];
usuario.telefoneUsuario = (string)rdr["telefoneUsuario"];
return usuario;
}
con.Close();
return null;
}`
如果你们发现任何错误,请告诉我,我是C#的新手。
这是javascript中的请求代码:
getUser() {
let head = new HttpHeaders();
head.set('Content-Type', 'application/json');
let body = {
loginUsuario: '*login*',
senhaUsuario: '*password*'
}
return this.http.post(this.url + 'Usuarios', body, { headers: head }).subscribe(data => {
this.user = data;
console.log(data);
});
}
和类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MeinNahrungAPI.Models
{
public class Usuarios
{
public int idUsuario;
public string loginUsuario;
public string senhaUsuario;
public string tipoUsuario;
public string nomeUsuario;
public string emailUsuario;
public string telefoneUsuario;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MeinNahrungAPI.Models
{
public class LoginRequest
{
public string loginUsuario;
public string senhaUsuario;
}
}
答案 0 :(得分:0)
由于对该问题发表了评论……
您在这里遇到异常:
usuario.idUsuario = (int)rdr["idUsuario"];
我不熟悉葡萄牙语设置中异常的具体翻译,但是从本质上讲,这意味着您正在尝试在没有可用数据时读取数据。由于查询返回的数据是 ,因此这会引起误导(这就是rdr.HasRows
解析为true
的原因)。 但是您尚未调用rdr.Read()
来访问结果中的第一条记录。即使只有一条记录,从技术上讲,它仍然是一组记录,碰巧只有一个条目。并且需要告知DataReader
才能完成该集合。
看看some examples here。特别是他们如何构造读取结果的方法:
while (reader.Read())
{
//...
}
在这种情况下,调用.Read()
返回一个bool
,指示是否有下一条记录要读取,但是 也在悄悄推进DataReader
内部访问下一条记录。
您可以使用相同的循环结构,并希望它只循环一次,因为应该只返回一个记录。 (如果返回了多个记录,则添加一些错误检查以处理意外的情况也没什么坏处。)或者甚至可以只调用一次.Read()
:
if (rdr.HasRows)
{
rdr.Read();
// the rest of your code
}
要注意的另一件事,与问题无关,但重要。首先,作为一个初学者,您正在使用查询参数而不是直接连接字符串值的事实是很好。但是,应注意代码中的另一个安全问题。您正在以纯文本格式存储用户密码。这是非常不好的事情。您不希望看到或知道用户的密码。
.NET Framework中有现有的身份验证工具,可以为您完成很多工作。但是,即使创建自己的密码,也应该始终 hash 。 (不是 encrypt , hash 。这是非常重要的区别。)并且具有良好的哈希方法( not MD5)。这样,任何人都无法恢复原始密码。不是攻击者,甚至不是您作为系统所有者。