试图使我的 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 中现有的身份验证工具可以为您完成大部分工作。但即使在创建自己的密码时,您也应该始终 散列 密码。 (不是 encrypthash。这是一个非常重要的区别。)并且具有良好的散列方法(不是 MD5).这样就没有人可以恢复原始密码。不是攻击者,即使您是系统所有者。