.NET 비동기 작업에 대한 경험이 제한되어 있지만 이전에는 BackgroundWorker 및 IAsyncResult를 사용했습니다. 아래 코드는 MVC4 프로젝트에 있습니다. 오류가 없으면 모든 것이 정상적으로 작동합니다. 문제는 무언가가 실패 할 때이다. 설명 할 손실이있는 비동기 호출로 예상치 못한 일이있는 것 같습니다.MVC 비동기로 설명 할 수없는 흐름
현재 SMTP 서버 설정이 존재하지 않는 서버로 설정되어 있으므로 코드가 비동기 호출 await smtp.SendMailAsync(message);
으로 확산됩니다. 오류를 생성하는 메일 서버에 대한 호출이 아니라 오류가 사용자 생성 프로세스의 어딘가에서 온 것 같습니다. "이름이 이미 사용되었습니다." 이것은 임의로 입력 한 사용자 이름이 메시지를 발생시키기 때문에 분명하지 않습니다 (예 : "[email protected]").
내가 기대하는 것 :
- 사용자는
- 역할 이메일을 보내
- 호출을 추가 오류 '연결 서버를 메일 거부'생성에 실패되어 생성됩니다.
- 사용자는
- 역할이 실패 이메일을 보내
- 호출을 추가 생성되지만 오류 메시지가 .NET의 사용자 생성 로직 어딘가에서 온다 :
실제로 어떻게됩니까 IUserStore에서.
예상되는 결과는 로컬에서 발생하지만 서버에서는 기괴한 동작을 보입니다.
다음은 오류가 발생할 겉으로 사용자 방법을 만듭니다
public virtual Task CreateAsync(User user)
{
if (user == null)
throw new ArgumentNullException("user");
return Task.Factory.StartNew(() =>
{
using (SqlConnection cn = new SqlConnection(DbHelper.ConnectionString))
{
cn.Insert<User>(user);
}
});
}
등록 컨트롤러의 동작 :
업데이트[POST("register")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel vm)
{
if (ModelState.IsValid)
{
var user = AutoMapper.Mapper.Map<User>(vm);
user.PasswordDate = DateTime.Now;
var result = await _userManager.CreateAsync(user); // Error message seems to come from here
if (result.Succeeded)
{
// Add roles
//...
foreach (var area in vm.AllowedAreas.Where(a => a.Value))
await _userManager.AddClaimAsync(user.Id, new Claim("Area", area.Key));
// Generate an email and send it out
var thanksForRegisteringVm = new ThanksForRegisteringViewModel();
thanksForRegisteringVm.FullName = vm.FullName;
thanksForRegisteringVm.EmailAddress = vm.EmailAddress;
var emailBody = RenderViewAsString.Render("~/Views/Emails/ThanksForRegistering.cshtml", thanksForRegisteringVm);
var message = new MailMessage()
{
Subject = "Thanks for Registering",
Body = emailBody,
IsBodyHtml = true
};
message.To.Add(vm.EmailAddress);
var smtp = new SmtpClient();
await smtp.SendMailAsync(message); // this will definitely be the true source of the error - a non existant mail server in web.config
return RedirectToAction("ThanksForRegistering");
}
else
{
foreach (var error in result.Errors)
ModelState.AddModelError("", error);
}
}
// If we got this far, something failed, redisplay form
setUpRegisterViewModel(vm);
return View(vm);
}
: 우리는 어딘가에 차이로이 좁혀했습니다 로컬, dev 및 live 사이의 IIS 구성. 로컬 및 개발 작업, 라이브 않습니다. 상황은 우리가 제거했습니다
- 응용 프로그램 풀 (생성 된 새)
- ELMAH는 (라이브에서 제거)에 관계없이
액션 방법은 두 번 호출지고
디버깅을 난독 화시키는 다른 문제가 발생하지 않았습니까? 예 : 요청 파이프 라인이 두 번 트리거되어 사용자를 두 번 만들려고합니다. 논리적으로이 코드에는 아무런 문제가 없으므로 어떤 종류의 환경 문제 여야합니다. –
그건 이상한 일입니다. 설정은 내가 볼 수있는 한 동일합니다. 프로덕션 서버에서 비정상적인 실행이 발생하여 작업 및 비동기에 대한 나의 이해를 의심하게 만듭니다. – Echilon
브라우저에서 요청을 두 번 제출하게하는 것만으로도 요청 로깅을 구현하고 거기에서 거꾸로 작업하도록 제안 할 수 있습니다. 나는 이걸로 너를 도울 수 있다고 생각하지 않는다. –