2011-02-18 2 views
5

현재 여러 위치에서 동일한 컨트롤러 (예 : site1/v1/views/index.cshtmlsite1/v2/views/index.cshtml)를 사용하는 유사한보기를 관리하는 .net mvc3 응용 프로그램이 있습니다.MVC Razor ViewEngine은 스레드로부터 안전하지 않습니까?

이 처리 방법은 DefaultControllerFactory 및 CreateController 메서드를 상속하는 CustomControllerFactory를 만들어 기존 뷰 엔진을 지우고 현재 URL을 기반으로하는 뷰 위치 형식을 지정하는 새 사용자 지정 viewEngine을 추가하는 것입니다.

site1.com/v1/index.cshtml의 사용자 토지의 viewengine이의 뷰 위치를 지정하는 경우 : 나는 데

string versionDirectory = "v1"; 
ViewLocationFormats = new[]{ versionDirectory + "/Views/{0}.cshtml", 
          "/Views/{0}.cshtml", 
          "~/Shared/{0}.cshtml" 
          }; 

문제는 그 여러 사용자가 동시에에게 대략 다른 페이지에있는 모든 사용자를 착륙하는 경우 동일한보기가 표시됩니다.

Initially i thought this was related to caching 그러나 사용자 정의 viewEngine에 usecache = false을 명시 적으로 설정 한 후에는 ViewEngines class not being thread safe과 더 관련이있는 것처럼 보입니다.

다른 사람과 동일한 결과를 얻을 수있는 방법에 대한 아이디어가있는 사람이 있습니까?

미리 감사드립니다.

+0

어떻게하는지 잘 모르겠지만 정적 개체가 모든 요청에서 공유됩니다. 문제와 관련이있을 수 있습니다 ... – Buildstarted

답변

9

ViewEngines 컬렉션은 정적 컬렉션이므로 해당 값은 여러 요청에서 공유됩니다. 당신이하려고하는 것은 가능하지만, 당신이하고있는 방식이 정확하지 않습니다.

하나의 쉬운 접근법은 RazorViewEngine에서 파생되고 FindView 메서드를 재정의하는 사용자 지정보기 엔진을 작성하는 것입니다. 이 메소드는 요청 당 한 번 호출됩니다. 구현시 base.FindView를 호출 한 다음 필요한 사이트 정보를 포함하도록 결과 (null이 아닌 경우)를 수정하십시오.

Scott Hanselman은 사용자 정의보기 엔진을 통해 다른 위치에서보기를 찾는 예를 보여주는 블로그 게시물이 있습니다. http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx

+0

감사합니다! 이 작품은 – kfegen

+0

입니다. 해당 게시물의 출처에는 큰 제작 버그가 있습니다.보기 엔진의 업데이트 된 버전은 https://bitbucket.org/shanselman/mobileviewengines/src/48310997a453/Helpers/MobileCapableRazorViewEngine.cs에 관계없이 있습니다. 원래 게시물 및 내가 제공 한 새로운 링크가 내 잘못하면 base.ViewLocationFormats 컬렉션을 수정하기 위해 내 가난한 선택을 해결하는 핵심은 내가 실수로 생각 HTTP 요청 범위 반대 정적되었습니다. –

1

내장 된 뷰 엔진은 스레드로부터 안전합니다. 문제는 캐싱 또는 사용자 정의보기 엔진입니다. 다른 대답의 링크에있는 캐싱 설명을 확인하십시오.

관련 문제