2

只是关于我的应用程序的一些背景。我正在开发一个 ASP.Net MVC 3 Web 应用程序,它使用 Entity Framework 4.1 进行数据持久性。我的应用程序是分层的,它有一个 UI 层、服务层、存储库层等。我还使用 Unity 作为我的控制反转容器。

当用户在我的应用程序上注册时,我使用StringBuilder创建了两个随机代码(电子邮件和移动验证码) 。然后,我将这两个随机代码分配给用户对象中的相应属性,见下文。

User validateUser = new User();

validateUser.firstName = model.firstName.Trim();
validateUser.lastName = model.lastName.Trim();
validateUser.email = model.Email.Trim();

//Create Email and Mobile Verification Codes
string randomEmailCode = "";
randomEmailCode = _notifyService.GenerateEmailCode();
validateUser.emailVerificationCode = randomEmailCode;

string randomMobileCode = "";
randomMobileCode = _notifyService.GenerateMobileCode();
validateUser.mobileVerificationCode = randomMobileCode;

通知服务

public string GenerateEmailCode()
{
    StringBuilder builder = new StringBuilder();

    builder.Append(RandomString(4, true));
    builder.Append(RandomNumber(1000, 9999));
    builder.Append(RandomString(2, false));
    return builder.ToString();
}

public string GenerateMobileCode()
{
    StringBuilder builder = new StringBuilder();

    builder.Append(RandomString(3, true));
    builder.Append(RandomNumber(1000, 9999));
    builder.Append(RandomString(2, false));
    return builder.ToString();
}

private int RandomNumber(int min, int max)
{
    Random random = new Random();
    return random.Next(min, max);
}

private string RandomString(int size, bool lowerCase)
{
    StringBuilder builder = new StringBuilder();
    Random random = new Random();
    char ch;
    for (int i = 0; i < size; i++)
        {
            ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
            builder.Append(ch);
        }
        if (lowerCase)
            return builder.ToString().ToLower();
        return builder.ToString();
    }

然后我将用户添加到我的 DBcontext 并调用 SaveChanges() 方法将新用户保存到我的数据库中。

_accountService.AddUser(validateUser);
_accountService.Save();

现在,当我进入我的数据库并找到已添加的新用户时,emailVerificationCodemobileVerificationCode都是相同的。但是,如果我在以下行的代码上放置一个断点

randomEmailCode = _notifyService.GenerateEmailCode();

并一直跟踪直到保存,然后检查新用户的数据库,emailVerificationCodemobileVerificationCode代码都不同,正如预期的那样。

我不明白为什么当我运行应用程序时,它会为两个属性插入相同的代码。

有人可以帮忙吗?

谢谢。

更新

我按照简的建议做了,即像这样为每个属性输入硬编码值

validateUser.emailVerificationCode = "emailCode";
validateUser.mobileVerificationCode = "mobileCode";

再次运行应用程序,这一次按预期插入了两个硬编码值。这是否意味着我的两个方法GenerateEmailCode()GenerateMobileCode()不能正常工作?

4

1 回答 1

3

您生成这些随机代码的方式可能有问题。正如其他人指出的那样,问题很可能是您创建的随机类实例的时间太近了。

尝试声明一个静态随机生成器:

static Random r = new Random();

然后使用静态随机生成代码:(生成代码的方式显然取决于您,但这样的事情应该给您一个想法):

 public static string generateCode()
        {          
            string chrs = "abcdefghijklmnopqrstuvwxyz";
            char[] arr = chrs.ToCharArray();
            string code = "";
            for (int i = 0; i < 5; i++)
            {
                code += arr[r.Next(arr.Count())];
            }
            return code;
        }

当我运行这个:

 var firstCode  = generateCode();
 var secondCode = generateCode();

我得到 2 个不同的值。

这是另一个有用的链接

于 2012-09-25T10:29:48.237 回答