Попытка заставить мой C # WEB API 2 вернуть объект, но получаю ошибку 500 - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь отправить логин и пароль и, если он найден в базе данных, он возвращает данные учетной записи.Но я получаю эту ошибку на своей консоли:

ОШИБКА HttpErrorResponse {заголовки: HttpHeaders, status: 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;
    }
}

введите описание изображения здесь

введите описание изображения здесь

1 Ответ

0 голосов
/ 30 ноября 2018

В результате цепочки комментариев к вопросу ...

Вы получаете исключение здесь:

usuario.idUsuario = (int)rdr["idUsuario"];

Я не знаком с конкретным переводомИсключение составляют португальские настройки, но, по сути, это означает, что вы пытаетесь прочитать данные, когда ни один из них не доступен.Что слегка вводит в заблуждение, поскольку - это данные, возвращаемые из запроса (именно поэтому rdr.HasRows разрешается в true). Но вы не позвонили rdr.Read(), чтобы получить доступ к первой записи в результатах.Даже если есть только одна запись, технически это все же набор записей, в котором есть только одна запись.И DataReader нужно сказать, чтобы пройти через эту коллекцию.

Взгляните на некоторые примеры здесь .Конкретно, как они структурируют чтение результатов:

while (reader.Read())
{
    //...
}

В этом случае вызов .Read() возвращает bool, указывающий, есть ли следующая запись для чтения, но это также тихо продвигает DataReader внутри, чтобы получить доступ к следующей записи.

Вы можете использовать эту же структуру цикла и ожидать, что она зациклится только один раз, поскольку должна быть только одна возвращенная запись,(Не мешало бы добавить некоторую проверку ошибок, чтобы обработать неожиданные возможности, если возвращается более одной записи.) Или вы могли бы даже просто вызвать .Read() один раз:

if (rdr.HasRows)
{
    rdr.Read();
    // the rest of your code
}

Еще одна вещь, которую стоит отметить, которая не связана с проблемой, но важна независимо.Во-первых, для новичка тот факт, что вы используете параметры запроса вместо прямой конкатенации строковых значений, является очень хорошей вещью .Однако в вашем коде есть еще одна проблема безопасности, о которой вам следует знать.Вы храните пароли пользователей в виде простого текста.Это очень плохая вещь .Вы не хотите когда-либо видеть или знать пароли ваших пользователей.

В .NET Framework существуют инструменты аутентификации, которые могут выполнить большую часть работы за вас.Но даже при создании собственного вы всегда должны хэшировать пароли.(Не шифровать , хэш . Это очень важное различие.) И с хорошими методами хеширования ( не MD5).Таким образом, никто не сможет восстановить исходный пароль.Не злоумышленник, даже вы как владелец системы.

...