2012-06-04 6 views
3

는, 나는 내가 생각하는 것은 불안정한 코드 발견했습니다면도기보기 경쟁 조건

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
    { 
     ViewLocationFormats = AddViewDynamicFormat(controllerContext, viewName).ToArray(); 
     AreaViewLocationFormats = AddAreaViewDynamicFormat(controllerContext, viewName).ToArray(); 
     return base.FindView(controllerContext, viewName, masterName, useCache); 
    } 

내 관심사는 두 개의 요청이 동시에 "처리되는 경우 , "첫 번째는 필요에 따라 위치 형식을 설정하지만 사용하기 전에 두 번째 스레드 요청은 위치 형식을 다른 방식으로 설정할 수 있습니다. 나머지는 추악해진다.

이 문제가 유효한가요? 다르게 말하자면, ASP.NET MVC는 Razor View 엔진이 한 번에 정확히 하나의 요청을 처리하도록 보장합니까? 나는 그것이 사실이라고 의심한다.

이와 마찬가지로, 면도기 뷰 엔진이 하나 인 경우 요청 당이면 괜찮습니다. 그러나 나는 또한 그것이 사실이라고 믿지 않는다.

업데이트 나는 이것이 경쟁 조건임을 확인했습니다. 나는 또한 경쟁 조건없이 문제를 해결하는 dynamic expansive razor search example을 보여주는 기사를 찾았습니다. (하지만 여전히 캐싱 문제가 있는지 궁금합니다.)

+0

그래서 ... 이걸로 무엇을 이루고자합니까? 어쩌면 다른 솔루션이 필요합니다. – ivowiblo

답변

0

저는 RazorViewEngine이 런타임에 수정되는 것이 아니라 Global.asax Application_Start에서 구성된다는 점이 거의 긍정적입니다. 나는 RazorViewEngine 인스턴스가 시작한 후 앱 도메인의 수명 동안 존재한다고 생각합니다.

ViewLocationFormats 또는 AreaViewLocationFormats를 추가해야하는 경우 Application_Start에서 수행하십시오. Application_Start는 앱 도메인 당 한 번만 실행됩니다.

0

ViewLocationFormatsAreaViewLocationFormats은 가상입니까? 그렇다면 해당 값을 HttpContext.Current.Items 컬렉션에 넣고 재정의 된 속성에서 가져올 수 있습니다.

+0

아니요, VirtualPathProviderEngine이라는 MVC 클래스에 정의되어 있다는 아이러니 함에도 불구하고 가상 속성이 아닙니다. –