2016-10-07 3 views
-1

.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는 (라이브에서 제거)에 관계없이

액션 방법은 두 번 호출지고

  • applicationHost.config 파일, GET 및 POST 요청 모두에 대해 컨트롤러가 포함되지만 예외가 발생하면 입니다. 첫 번째 예외로 인해 액션 메서드가 다시 실행되는 것처럼 보입니다.

  • +3

    디버깅을 난독 화시키는 다른 문제가 발생하지 않았습니까? 예 : 요청 파이프 라인이 두 번 트리거되어 사용자를 두 번 만들려고합니다. 논리적으로이 코드에는 아무런 문제가 없으므로 어떤 종류의 환경 문제 여야합니다. –

    +1

    그건 이상한 일입니다. 설정은 내가 볼 수있는 한 동일합니다. 프로덕션 서버에서 비정상적인 실행이 발생하여 작업 및 비동기에 대한 나의 이해를 의심하게 만듭니다. – Echilon

    +0

    브라우저에서 요청을 두 번 제출하게하는 것만으로도 요청 로깅을 구현하고 거기에서 거꾸로 작업하도록 제안 할 수 있습니다. 나는 이걸로 너를 도울 수 있다고 생각하지 않는다. –

    답변

    0

    새 프로젝트에서 사이트를 복제하고 Nuget에서 모든 종속성을 설치 한 후에는 결국 Cisco IronPort가 실행되는 프록시 서버로 고정되었습니다.

    잘못 구성되었거나 인프라 팀이 의도적으로 설정 한 것으로 인해 프록시 서버는 클라이언트에서 하나만 보낸 경우에도 두 개의 동일한 요청을 서버에 전송합니다.

    프록시 서버를 사용하지 않도록 설정하거나 외부 (전화) 연결을 방문하면 한 번 요청됩니다.