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是的,我已经尝试过了,但仍然存在。