ASP MVC : IController Dispose ()는 언제 호출됩니까?
더 큰 MVC 앱 중 하나의 큰 리팩토링 / 속도 조정을 진행 중입니다. 이제 몇 달 동안 프로덕션에 배포되었으며 연결 풀에서 연결을 기다리는 시간 초과가 발생하기 시작했습니다. 제대로 처리되지 않는 연결까지 문제를 추적했습니다.
이를 고려하여 이후 기본 컨트롤러를 다음과 같이 변경했습니다.
public class MyBaseController : Controller
{
private ConfigurationManager configManager; // Manages the data context.
public MyBaseController()
{
configManager = new ConfigurationManager();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (this.configManager != null)
{
this.configManager.Dispose();
this.configManager = null;
}
}
base.Dispose(disposing);
}
}
이제 두 가지 질문이 있습니다.
- 경쟁 조건을 도입하고 있습니까? 뷰에 매개 변수를 노출 하는을
configManager
관리 하므로 뷰가 렌더링을 완료하기 전에 컨트롤러에서 호출되지 않는지 확인해야합니다 .DataContext
IQueryable<>
Dispose()
Dispose()
뷰가 렌더링되기 전이나 후에 MVC 프레임 워크 가 컨트롤러에서 호출 합니까? 아니면 MVC 프레임 워크가이를 GarbageCollector에 맡깁니까?
Dispose는 뷰가 렌더링 된 후 항상 호출됩니다 .
뷰는에 대한 호출에서 렌더링됩니다 ActionResult.ExecuteResult
. 이것은 (간접적으로)에 의해 호출되고 ControllerActionInvoker.InvokeAction
, 차례로에 의해 호출됩니다 ControllerBase.ExecuteCore
.
뷰가 렌더링 될 때 컨트롤러가 호출 스택에 있기 때문에 폐기 할 수 없습니다.
Craig Stuntz의 답변 을 확장하려면 :
ControllerFactory는 Controller가 삭제 될 때 처리합니다. IControllerFactory 인터페이스를 구현할 때 구현해야하는 메서드 중 하나는 ReleaseController입니다.
직접 롤링했는지 여부에 관계없이 사용중인 ControllerFactory를 잘 모르겠지만 Reflector에서 DefaultControllerFactory를 보면 ReleaseController 메서드가 다음과 같이 구현됩니다.
public virtual void ReleaseController(IController controller)
{
IDisposable disposable = controller as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
해당 컨트롤러가 IDisposable을 구현하는 경우 IController 참조가 전달되면 해당 컨트롤러의 Dispose 메서드가 호출됩니다. 따라서 요청이 완료된 후, 즉 뷰가 렌더링 된 후 처리해야하는 항목이있는 경우. IDisposable을 상속하고 Dispose 메서드에 논리를 넣어 모든 리소스를 해제합니다.
ReleaseController 메서드는 요청을 처리하고 IHttpHandler를 구현하는 System.Web.Mvc.MvcHandler에 의해 호출됩니다. ProcessRequest는 주어진 HttpContext를 취하고 구현 된 ControllerFactory를 호출하여 요청을 처리 할 컨트롤러를 찾는 프로세스를 시작합니다. ProcessRequest 메소드를 살펴보면 ControllerFactory의 ReleaseController를 호출하는 finally 블록을 볼 수 있습니다. Controller가 ViewResult를 반환 한 경우에만 호출됩니다.
참고 URL : https://stackoverflow.com/questions/1380019/asp-mvc-when-is-icontroller-dispose-called
'Development Tip' 카테고리의 다른 글
팬더의 for 루프가 정말 나쁜가요? (0) | 2020.10.05 |
---|---|
Python 코드의 들여 쓰기를 중괄호로 변환하는 방법이 있습니까? (0) | 2020.10.05 |
내가 [[fallthrough]]를 사용해도 GCC가 폴 스루에 대해 경고하는 이유는 무엇입니까? (0) | 2020.10.05 |
PHP에서 효율적인 JPEG 이미지 크기 조정 (0) | 2020.10.05 |
Chrome JavaScript 개발자 콘솔 : 줄 바꿈없이 console.log ()를 호출 할 수 있나요? (0) | 2020.10.05 |