c#抛出异常时,请求执行多次

c#抛出异常时,请求执行多次,c#,.net,interceptor,castle-dynamicproxy,C#,.net,Interceptor,Castle Dynamicproxy,当抛出异常时,控制进入catch块,然后再次转到请求所在的控制器操作,并重新执行ajax调用3到4次,我只检查了一次它发送的ajax调用的请求,这可能是因为拦截器 public ActionResult Login(LoginModel model) { string message = Resources.LoginInformationIncorrect; bool success = false; A

当抛出异常时,控制进入
catch
块,然后再次转到请求所在的控制器操作,并重新执行
ajax
调用3到4次,我只检查了一次它发送的ajax调用的请求,这可能是因为拦截器

 public ActionResult Login(LoginModel model)
        {
            string message = Resources.LoginInformationIncorrect;
            bool success = false;
            AuthenticationStatus status;
            var hashPass = EncodePassword(model.Password);
           status = _formsAuthProvider.SignIn(model.Username, hashPass);

       }


        public AuthenticationStatus SignIn(string username, string password)
        {
            var status = AuthenticationStatus.Failed;
            AuthenticationResultBo result = null;

            result = AuthenticateUser(username, password);
        }

        public AuthenticationResultBo AuthenticateUser(string username, string password)
        {
            var status = AuthenticationStatus.Failed;
            var failedLoginAttempt = 0;
            // authenticate user
            var credential = GetUserCredentials(username, password);
       }

        public UserBo GetUserCredentials(string username, string password)
        {

            using (var cmd = DbUtility.CreateSpCommand("[GetUserCredentialsForLogin]"))
            {

                cmd.Parameters.Add("@username", SqlDbType.NVarChar, 20).Value = username ?? SqlString.Null;
                cmd.Parameters.Add("@password", SqlDbType.NVarChar, 32).Value = password ?? SqlString.Null;

                var result = new UserBo();
                using (var reader = cmd.ExecuteReader())
                {
                    if (reader.HasRows)
                        result = Mapper.Map<IDataReader, IEnumerable<UserBo>>(reader).FirstOrDefault();
                    reader.Close();
                }
                //throwing exception manually
                //throw new System.InvalidOperationException("Fake exception");
                return result;

            }
        }





        public class TryCatchLoggingInterceptor : IInterceptor
        {
            public void Intercept(IInvocation invocation)
            {
                try
                {
                    LogManager.Info("Call:" + invocation.TargetType.Name + "::" + invocation.Method.Name);
                    var startTime = DateTime.Now;
                    invocation.Proceed();
                    var endTime = DateTime.Now;
                    LogManager.Info("CallEnd:" + invocation.TargetType.Name + "::" + invocation.Method.Name + " Execution Time(Milliseconds): " + (endTime - startTime).Milliseconds);
                }
                catch (Exception ex)
                {                
                    //HttpContext.Current.Request.Abort();
                    var builder = new StringBuilder();
                    var dataSource = ConfigurationManager.ConnectionStrings["dbMain"].ToString().Split(';')[0];

                    builder.AppendLine();
                    builder.AppendLine(string.Concat(Enumerable.Repeat(">", 50)));
                    builder.AppendLine("Server Time:-" + DateTime.Now);
                    //builder.AppendLine("Requested Url:" + HttpContext.Current.Request.Url);
                    builder.AppendLine(dataSource);
                    builder.AppendLine("Error at " + invocation.TargetType.Name + "::" + invocation.Method.Name + "(" + JsonConvert.SerializeObject(invocation.Arguments, Formatting.Indented) + ")");
                    builder.AppendLine(string.Concat(Enumerable.Repeat("-", 50)));
                    builder.AppendLine(JsonConvert.SerializeObject(ex, Formatting.Indented).Replace("\\n", System.Environment.NewLine));
                    builder.AppendLine(string.Concat(Enumerable.Repeat("<", 50)));

                    LogManager.Error(builder.ToString());
                    LogManager.SendMail(ex, builder.ToString());

                    throw;
                }           
            }
        }
公共操作结果登录(LoginModel模型)
{
string message=Resources.logininformationcorrect;
布尔成功=假;
认证状态;
var hashPass=EncodePassword(model.Password);
状态=_formsAuthProvider.SignIn(model.Username,hashPass);
}
公共身份验证状态签名(字符串用户名、字符串密码)
{
var status=AuthenticationStatus.失败;
AuthenticationResultBo result=null;
结果=验证者(用户名、密码);
}
公共身份验证结果bo AuthenticateUser(字符串用户名、字符串密码)
{
var status=AuthenticationStatus.失败;
var FailedLoginAttent=0;
//验证用户
var-credential=GetUserCredentials(用户名、密码);
}
public UserBo GetUserCredentials(字符串用户名、字符串密码)
{
使用(var cmd=DbUtility.CreateSpCommand(“[GetUserCredentialsForLogin]”)
{
cmd.Parameters.Add(“@username”,SqlDbType.NVarChar,20)。Value=username??SqlString.Null;
cmd.Parameters.Add(“@password”,SqlDbType.NVarChar,32)。Value=password??SqlString.Null;
var result=new UserBo();
使用(var reader=cmd.ExecuteReader())
{
if(reader.HasRows)
结果=Mapper.Map(reader.FirstOrDefault();
reader.Close();
}
//手动引发异常
//抛出新的System.InvalidOperationException(“假异常”);
返回结果;
}
}
公共类TryCatchLoggingInterceptor:IInterceptor
{
公共无效拦截(IInvocation调用)
{
尝试
{
LogManager.Info(“调用:“+invocation.TargetType.Name+”:“+invocation.Method.Name”);
var startTime=DateTime.Now;
invocation.procedure();
var endTime=DateTime.Now;
LogManager.Info(“被调用方:“+invocation.TargetType.Name+”::“+invocation.Method.Name+”执行时间(毫秒):“+(endTime-startTime).ms);
}
捕获(例外情况除外)
{                
//HttpContext.Current.Request.Abort();
var builder=新的StringBuilder();
var dataSource=ConfigurationManager.connectionString[“dbMain”].ToString().Split(“;”)[0];
AppendLine();
AppendLine(string.Concat(Enumerable.Repeat(“>”,50));
AppendLine(“服务器时间:-”+DateTime.Now);
//AppendLine(“请求的Url:+HttpContext.Current.Request.Url”);
builder.AppendLine(数据源);
builder.AppendLine(“错误在“+invocation.TargetType.Name+”::“+invocation.Method.Name+”(“+JsonConvert.SerializeObject(invocation.Arguments,Formatting.Indented)+”);
AppendLine(string.Concat(Enumerable.Repeat(“-”,50));
builder.AppendLine(JsonConvert.SerializeObject(ex,Formatting.Indented).Replace(“\\n”,System.Environment.NewLine));

builder.AppendLine(string.Concat(Enumerable.Repeat)(“听起来更像是客户端在重试…看起来像是您在重试异常。它最终在哪里得到处理?您也可以发布代码吗?尝试注释SendMail())在异常处理程序中,查看问题是否仍然存在。@JohnWu,我们没有在c#中处理此异常,它将作为失败转到jquery。@jdweng是的,我已经尝试过了,但它仍然存在。听起来更可能是客户端在重试……看起来您在重试异常。它最终在哪里得到处理?您可以发布代码吗太好了?请尝试在异常处理程序中注释掉SendMail(),看看问题是否仍然存在。@JohnWu,我们没有在c#中处理此异常,它将作为失败转到jquery。@jdweng是的,我已经尝试过了,但仍然存在。