System.InvalidOperationException (возникла исключительная ситуация при попытке оценить выражение параметра запроса LINQ) - PullRequest
1 голос
/ 15 июня 2019

Я не знаю, что не так с моим запросом LINQ, все выглядит нормально, но я получил ошибку выше следующего кода:

if (! Dbcontext.AndroidUser.Any (user => user.Equals (value.UserName)))

Вот мой полный код для RegisterController.cs.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using APITesting.Models;
using APITesting.Utils;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;

namespace APITesting.Controllers
{
[Route("api/[controller]")]
public class RegisterController : Controller
{
    NoNameRestaurantContext dbcontext = new NoNameRestaurantContext();

    // POST api/<controller>
    [HttpPost]
    public string Post([FromBody]AndroidUser value)
    {
        //First we need to check that user is existing in database.
        if (!dbcontext.AndroidUser.Any(user => user.Equals                (value.UserName)))
        {
            AndroidUser user = new AndroidUser();
            user.UserName = value.UserName;
            user.Hash = Convert.ToBase64String(Common.GetRandomHash(16));
            user.Password = Convert.ToBase64String(Common.HashPassword(
                Encoding.ASCII.GetBytes(value.Password),
                Convert.FromBase64String(user.Hash)));

            //Save to Database

            try
            {
                dbcontext.Add(user);
                dbcontext.SaveChanges();
                return JsonConvert.SerializeObject("Register Successfully");
            }
            catch (Exception ex)
            {
                return JsonConvert.SerializeObject(ex.Message);
            }
        }
        else
        {
            return JsonConvert.SerializeObject("User is existing in Database");
        }

    }

  }
}

и для класса Common.cs, который я использовал для преобразования своего пароля в hashPassword.

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Security.Cryptography;
 using System.Threading.Tasks;

 namespace APITesting.Utils
 {
 public class Common
 {
    /*
     * 
     * FUNCTION TO CREATE RANDOM HASH STRING
     * 
     */
    public static byte[] GetRandomHash(int length)
    {
        var random = new RNGCryptoServiceProvider();
        byte[] hash = new byte[length];
        random.GetNonZeroBytes(hash);
        return hash;
    }
    /*
     * 
     * FUNCTION TO CREATE PASSWORD WITH HASH
     * 
     */
    public static byte[] HashPassword(byte[] password, byte[] hash)
    {
        HashAlgorithm algorithm = new SHA256Managed();
        byte[] plainTextWithHashByte = new byte[password.Length + hash.Length];
        for (int i = 0; i < password.Length; i++)
        {
            plainTextWithHashByte[i] = password[i];
        }
        for (int i = 0; i < hash.Length; i++)
        {
            plainTextWithHashByte[password.Length + i] = hash[i];
        }
        return algorithm.ComputeHash(plainTextWithHashByte);
    }
  }
}

Я изучаю этот урок: https://www.youtube.com/watch?v=b6T0_j7I9CE

1 Ответ

0 голосов
/ 16 июня 2019

Я попытался воспроизвести вашу проблему с помощью следующего кода, и это сработало.Убедитесь, что ваш объект AndroidUser отправляется вашему методу.

using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using System;
using System.Linq;
using System.Text;
using WebApplicationLab.Models;
using WebApplicationLab.Utils;

namespace WebApplicationLab.Controllers
{

    [Route("api/[controller]")]
    [ApiController]
    public class RegisterController : ControllerBase
    {
       private readonly AppDbContext _context;

       //Inject your DbContext object instead of create a new instance.
       public RegisterController(AppDbContext context)
       {
          _context = context;
       }

       public string Post([FromBody]User value)
       {
           //Make sure that your object `User` is being sent to your method. 
           if(value == null) 
           {   
              return JsonConvert.SerializeObject("Please inform a valid user!");
           }

          if (!IsUserExists(value.UserName))
          {
              var random = new Random();
              var hash = Common.GetRandomHash(random.Next(1, 100));

              var user = new User()
              {
                  UserName = value.UserName,
                  Hash = Convert.ToBase64String(hash),
                  Password = Convert.ToBase64String(Common.HashPassword(Encoding.ASCII.GetBytes(value.Password), hash))
               };

            _context.Users.Add(user);
            _context.SaveChanges();

            return JsonConvert.SerializeObject("Register Successfully");
        }

          return JsonConvert.SerializeObject("User already exists.");
       }

       private bool IsUserExists(string userName)
       {
           return _context.Users.Any(x => x.UserName.Equals(userName));
        }
    }
}

Класс моей модели:

[Table("Users")]
public class User
{     
    [Key]
    public string UserName { get; set; }

    public string Hash { get; set; }

    public string Password { get; set; }
}
...