2

ASP MVC를 사용하여 다중 사용자 응용 프로그램을 개발 중입니다. 세입자는 하위 도메인으로 식별됩니다. 번들 및 축소 및 BundleTransformer.Less에 System.Web.Optimization을 사용하고 있습니다.멀티 테넌트 ASP MVC 응용 프로그램 번들

UI는 각 테넌트에 특정 LESS 변수 세트를 적용하여 주제를 지정할 수 있습니다. 이 변수는 DB에 저장됩니다.

제안에 따라 https://stackoverflow.com/users/1292362/andrey-taritsyn을 사용하여 사용자 지정 VirtualPathProvider를 구현하여 덜 필요한 파일에 적은 변수를 삽입했습니다. 그것은 매력처럼 작동합니다!

그러나 묶음 및 캐싱이 어떻게 관리되는지에 관해선 의문의 여지가 있습니다.

  1. 나는 가능한 모든 세입자를 잡고 App_Start 각 하나에 대한 번들을 등록해야 하는가? (나는이 옵션을 좋아하지 않습니다. 번들을 등록 할 필요가 없으며, 은 새 임차인을 재시작하지 않고도 새 번들 등록 문제를 해결해야합니다.

  2. 요청할 때마다 거주자 용 번들이 있는지 확인하고 필요없는 경우 등록하십시오.

  3. 최적의 솔루션은 세입자의 하위 도메인에 대한 첫 번째 요청이 들어 오면 캐시에 생성 및 저장 번들 응답을 App_Start에서 한 번만 번들을 선언하고이하는 것입니다.

내가 현재 가지고 옵션 3을 구현하고 작동하지만 실제로 어떤 일이 진행되는지 알지 못합니다.

  • 어떻게 번들 세입자를 식별하는 캐시 키를 사용자 정의합니까?

    public class SkinnableBundle : Bundle 
    { 
        public SkinnableBundle(string virtualPath) 
         : this(virtualPath, null) 
        { } 
    
        public SkinnableBundle(string virtualPath, string cdnPath) 
         : base(virtualPath, cdnPath, 
          new IBundleTransform[] { BundleTransformerContext.Current.Css.GetTransformerInstance() }) 
        { 
         Builder = new NullBuilder(); 
        } 
    
        public override string GetCacheKey(BundleContext context) 
        { 
         if (context.HttpContext == null) 
         { 
          return base.GetCacheKey(context); 
         } 
    
         var host = context.HttpContext.Request.Url.Host.ToLowerInvariant(); 
         return string.Format("System.Web.Optimization.Bundle:{0}:{1}", host, context.BundleVirtualPath); 
        } 
    } 
    
    • 번들은 동일한 가상 패스에 의해 식별되지만 : 지금까지,이 한 캐시되는 많은 번들 응답됩니다 (테넌트 별)? 또는 번들 응답이 하나만 덮어 쓰여지고 있습니까?

    • 레이아웃에서 테넌트 별 번들 응답을 검색하려면 어떻게합니까? @ Styles.Render ("~/bundles/css/common")를 수행하면 어떻게됩니까? 가상 경로 거주자를 기반으로 번들 응답을 식별합니까?

답변

1

여러 개의 테넌트 별 번들 응답이 캐시에 저장되는 것을 거의 확신합니다. Glimpse를 설치하고 캐시를 검사했습니다. 번들에 대한 세입자 당 하나의 항목이 나열되는 것으로 나타났습니다.