试图使我的 C# WEB API 2 return 成为对象,但出现错误 500
Trying to make my C# WEB API 2 return an Object, but getting Error 500
我正在尝试发送登录名和密码,如果它在数据库中找到,它会显示 return 帐户详细信息。但我在我的控制台上收到此错误:
ERROR HttpErrorResponse {headers: HttpHeaders, status: 500, statusText: "Internal Server Error", 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;
}
}
enter image description here
enter image description here
由于对问题的评论线程...
这里出现异常:
usuario.idUsuario = (int)rdr["idUsuario"];
我不熟悉您的葡萄牙语设置中异常的具体翻译,但本质上它的意思是您在 none 可用时尝试读取数据。这是轻微误导,因为从查询返回是数据(这就是为什么rdr.HasRows
解析为true
) . 但是您还没有调用 rdr.Read()
来访问结果中的第一条记录。即使只有一条记录,从技术上讲,它仍然是恰好只有一个条目的记录集合。 DataReader
需要被告知才能完成该集合。
看看some examples here。特别是他们如何构建阅读结果:
while (reader.Read())
{
//...
}
在这种情况下调用.Read()
returns一个bool
指示是否有下一条记录要读取,但它也正在内部悄悄推进 DataReader
以访问下一条记录。
您可以使用相同的循环结构并期望它只循环一次,因为应该只有一个返回记录。 (如果返回了多个记录,添加一些错误检查来处理意外的可能性不会有什么坏处。)或者您甚至可以只调用 .Read()
一次:
if (rdr.HasRows)
{
rdr.Read();
// the rest of your code
}
还有一点要注意,这与问题无关,但 重要 无论如何。首先,作为初学者,您使用查询参数而不是直接连接字符串值这一事实是一件 非常好的事情 。但是,您应该注意代码中的另一个安全问题。您正在以纯文本形式存储用户密码。这是一件非常糟糕的事情。您不想看到或知道您用户的密码。
.NET Framework 中现有的身份验证工具可以为您完成大部分工作。但即使在创建自己的密码时,您也应该始终 散列 密码。 (不是 encrypt、hash。这是一个非常重要的区别。)并且具有良好的散列方法(不是 MD5).这样就没有人可以恢复原始密码。不是攻击者,即使您是系统所有者。
我正在尝试发送登录名和密码,如果它在数据库中找到,它会显示 return 帐户详细信息。但我在我的控制台上收到此错误:
ERROR HttpErrorResponse {headers: HttpHeaders, status: 500, statusText: "Internal Server Error", 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;
}
}
enter image description here
enter image description here
由于对问题的评论线程...
这里出现异常:
usuario.idUsuario = (int)rdr["idUsuario"];
我不熟悉您的葡萄牙语设置中异常的具体翻译,但本质上它的意思是您在 none 可用时尝试读取数据。这是轻微误导,因为从查询返回是数据(这就是为什么rdr.HasRows
解析为true
) . 但是您还没有调用 rdr.Read()
来访问结果中的第一条记录。即使只有一条记录,从技术上讲,它仍然是恰好只有一个条目的记录集合。 DataReader
需要被告知才能完成该集合。
看看some examples here。特别是他们如何构建阅读结果:
while (reader.Read())
{
//...
}
在这种情况下调用.Read()
returns一个bool
指示是否有下一条记录要读取,但它也正在内部悄悄推进 DataReader
以访问下一条记录。
您可以使用相同的循环结构并期望它只循环一次,因为应该只有一个返回记录。 (如果返回了多个记录,添加一些错误检查来处理意外的可能性不会有什么坏处。)或者您甚至可以只调用 .Read()
一次:
if (rdr.HasRows)
{
rdr.Read();
// the rest of your code
}
还有一点要注意,这与问题无关,但 重要 无论如何。首先,作为初学者,您使用查询参数而不是直接连接字符串值这一事实是一件 非常好的事情 。但是,您应该注意代码中的另一个安全问题。您正在以纯文本形式存储用户密码。这是一件非常糟糕的事情。您不想看到或知道您用户的密码。
.NET Framework 中现有的身份验证工具可以为您完成大部分工作。但即使在创建自己的密码时,您也应该始终 散列 密码。 (不是 encrypt、hash。这是一个非常重要的区别。)并且具有良好的散列方法(不是 MD5).这样就没有人可以恢复原始密码。不是攻击者,即使您是系统所有者。