试图使我的C#WEB API 2返回一个对象,但出现错误500

时间:2018-11-30 19:29:12

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

我正在尝试发送登录名和密码,如果在数据库中找到它,则返回帐户详细信息。但是我在控制台上收到此错误:

  

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;
    }
}

enter image description here

enter image description here

1 个答案:

答案 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)。这样,任何人都无法恢复原始密码。不是攻击者,甚至不是您作为系统所有者。