C# Web API异步方法调用两次

C# Web API异步方法调用两次,c#,asp.net,asynchronous,async-await,C#,Asp.net,Asynchronous,Async Await,我一直在寻找代码被内部调用两次的原因,并在数据库中以毫秒的时间保存重复记录。两个记录之间的时间差为: 入口日期时间 2017-03-21 08:17:11.957(记录1) 2017-03-21 08:17:11.960(记录2) 这是代码。为了简单起见,我删除了调试行和验证逻辑以使其更加清晰 // Controller [Route("CreateUser")] public async Task<IHttpActionResult> PostCreateUser(SignUp p

我一直在寻找代码被内部调用两次的原因,并在数据库中以毫秒的时间保存重复记录。两个记录之间的时间差为:

入口日期时间 2017-03-21 08:17:11.957(记录1) 2017-03-21 08:17:11.960(记录2)

这是代码。为了简单起见,我删除了调试行和验证逻辑以使其更加清晰

// Controller
[Route("CreateUser")]
public async Task<IHttpActionResult> PostCreateUser(SignUp parameters)
{
    try
    {
            SignUpRepository repo = new SignUpRepository();
    var response = await repo.ResisterUser(parameters);
    }
    catch (Exception ex)
    {
        return Ok("Error occurred...." + ex.Message);
    }

    return Ok("SignUp successfully completed.");

}

// SignUpRepository Class
public async Task<String> ResisterUser(SignUp signUp) 
{

    SignUpManager manager = new SignUpManager();
    var createUser = await CreateUserAsync(signUp, manager);

    if (String.IsNullOrWhiteSpace(createUser)) {
        return "No user created";
    }

    return "User successfully created.";
}

private Task<string> CreateUserAsync(SignUp signUp, SignUpManager manager)
{
    return Task.Run<string>(() => CreateUserAccount(signUp, manager));
}

private string CreateUserAccount(SignUp signUp, SignUpManager manager)
{
    Customer customer = new Customer {
        User_Name = signUp.UserName,
        Password = signUp.Password,
        First_Name = signUp.FirstName,
        Last_Name = signUp.LastName,
        Email_Address = signUp.Email,
        Mobile_Number = signUp.Mobile,
        Country_Id = signUp.CountryId
    };
    return manager.RegisterUser(customer);
}

// SignUpManager Class
public string RegisterUser(Customer customer)
{
    return new SQLHelper().RegisterUser(customer);
}

// SQL Helper Class
public string RegisterUser(Customer customer)
{
    using (SqlConnection conn = new SqlConnection("Connection String value"))
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.Connection = conn;
            // cmd.CommandText = "sp_RegisterUserByThirdParty";
            cmd.CommandText = "sp_RegisterUserByLEOSmart";
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new SqlParameter("@UserName", customer.User_Name));
            cmd.Parameters.Add(new SqlParameter("@Password", customer.Password));
            cmd.Parameters.Add(new SqlParameter("@Full_Name", String.Format("{0} {1}", customer.First_Name, customer.Last_Name)));
            cmd.Parameters.Add(new SqlParameter("@Mobile_Number", customer.Mobile_Number));
            cmd.Parameters.Add(new SqlParameter("@Email", customer.Email_Address));
            cmd.Parameters.Add(new SqlParameter("@Country_ID", customer.Country_Id));

            cmd.Parameters.Add(new SqlParameter("@outToken", SqlDbType.VarChar, 16));
            cmd.Parameters["@outToken"].Direction = ParameterDirection.Output;

            cmd.ExecuteNonQuery();
            this.response = Convert.ToString(cmd.Parameters["@outToken"].Value);
        }
    }
    return this.response;
}
//控制器
[路由(“CreateUser”)]
公共异步任务PostCreateUser(注册参数)
{
尝试
{
SignUpRepository回购=新SignUpRepository();
var响应=等待回购(参数);
}
捕获(例外情况除外)
{
返回Ok(“发生错误…”+ex.Message);
}
返回Ok(“注册成功完成”);
}
//符号存储类
公共异步任务管理器(注册注册)
{
SignUpManager=新的SignUpManager();
var createUser=await CreateUserAsync(注册,管理器);
if(String.IsNullOrWhiteSpace(createUser)){
返回“未创建用户”;
}
返回“用户已成功创建。”;
}
专用任务CreateUserAsync(注册注册,注册管理器)
{
返回任务。运行(()=>CreateUserAccount(注册,管理器));
}
私有字符串CreateUserAccount(注册注册、注册管理器)
{
客户=新客户{
User\u Name=signUp.UserName,
密码=注册。密码,
First_Name=signUp.FirstName,
Last_Name=signUp.LastName,
电子邮件地址=注册。电子邮件,
手机号码=signUp.Mobile,
Country\u Id=signUp.CountryId
};
退货经理、登记员(客户);
}
//注册管理器类
公共字符串注册器(客户)
{
返回新的SQLHelper().RegisterUser(客户);
}
//SQL帮助程序类
公共字符串注册器(客户)
{
使用(SqlConnection conn=newsqlconnection(“连接字符串值”))
{
conn.Open();
使用(SqlCommand cmd=new SqlCommand())
{
cmd.Connection=conn;
//cmd.CommandText=“sp_RegisterUserByThirdParty”;
cmd.CommandText=“sp_RegisterUserByLEOSmart”;
cmd.CommandType=CommandType.storedProcess;
cmd.Parameters.Add(新的SqlParameter(“@UserName”,customer.User_Name));
cmd.Parameters.Add(新的SqlParameter(“@Password”,customer.Password));
Add(新的SqlParameter(“@Full_Name”,String.Format(“{0}{1}”,customer.First_Name,customer.Last_Name));
cmd.Parameters.Add(新的SqlParameter(“@Mobile_Number”,customer.Mobile_Number));
cmd.Parameters.Add(新的SqlParameter(“@Email”,customer.Email_地址));
cmd.Parameters.Add(新的SqlParameter(“@Country_ID”,customer.Country_ID));
Add(新的SqlParameter(“@outToken”,SqlDbType.VarChar,16));
cmd.Parameters[“@outToken”].Direction=ParameterDirection.Output;
cmd.ExecuteNonQuery();
this.response=Convert.ToString(cmd.Parameters[“@outToken”].Value);
}
}
返回此.response;
}
在存储过程本身中有一些验证检查,但奇怪的是,它们都被绕过并保存了记录

有谁能帮我弄清楚为什么会这样吗


谢谢

您在哪个地方调试了两次代码?
PostCreateUser
是否可以使用模拟数据处理2个请求?例如,用户按两次按钮或您的客户机代码发送两个post请求最有可能是客户机调用了两次。首先检查这里我从未使用过Task.Run,但是否应该等待它?我认为客户端代码不会发送两个post请求。如果客户机甚至发送了两个post请求,说明为什么数据库验证检查没有在存储过程中运行,以便在保存记录之前检查重复。我在这里复制了一些信息:--用户名(如果存在)(从User\u Name=@username的客户中选择1)返回'3'--手机号(如果存在)(从User\u Number=@Mobile\u Number的客户中选择1)返回'2'@AImran作为您应该查看的数据库端