programing

ASP.NET 번들 - 포함된 파일이 변경된 후 번들이 업데이트되지 않음(304개가 수정되지 않음을 반환함)

oldcodes 2023. 6. 23. 22:25
반응형

ASP.NET 번들 - 포함된 파일이 변경된 후 번들이 업데이트되지 않음(304개가 수정되지 않음을 반환함)

ASP.NET MVC 4 어플리케이션으로 ASP.NET Bundling을 사용해보고 있습니다.상황은 제가 CDN 스타일 서비스를 만들고 싶은 것입니다. 여기에는 포함된 모든 .js 파일을 묶고 최소화하는 유형 주소인 http://www.mycdn.com/scripts/plugin/js, 의 다른 사이트에서 주소를 지정할 수 있는 JS 및 CSS 파일이 포함되어 있습니다.

한 파일에 대한 번들 구성은 다음과 같습니다.

bundles.Add(new ScriptBundle("~/Scripts/plugin/pluginjs").Include("~/Scripts/plugin/jquery.plugin.js"));

하지만 이렇게 하면 원래 js 파일을 변경해도 번들이 업데이트되지 않습니다.브라우저를 새로 고쳤을 때 304개의 수정되지 않음 메시지가 계속 표시되지만, 축소된 파일의 내용은 업데이트되지 않습니다.오래된 콘텐츠를 포함하는 번들은 쓸모가 없기 때문에 번들을 업데이트하려면 어떻게 해야 합니까?저는 모든 방법을 시도했지만 해결책을 찾을 수 없었습니다.

저도 똑같은 문제가 있었습니다.2개의 CSS 파일이 있는 폴더가 있습니다.

  • ~/내용/main.css
  • ~/Content/main.min.css(이전 수동 최소화 프로세스에서 이전 버전)

내 번들 코드는 다음과 같습니다.

bundles.Add(new StyleBundle("~/css/main").Include("~/content/main.css"));

.main.css출력 내용이 동일한 URL입니다.

<link href="/css/main?v=6Xf_QaUMSlzHbXralZP7Msq1EiLTd7g1vId6Vcy8NJM1" rel="stylesheet"/>

번들을 업데이트하는 유일한 방법은 솔루션을 재구축하는 것이었습니다. 물론 최선의 방법은 아니었습니다.

하지만 삭제하자마자 모든 것이 정상적으로 작동하기 시작했습니다.조금 더 연주를 해보니 두 가지가 다 있다면,main.css그리고.main.min.css 업데이트 업이중main.min.css실제로 번들을 업데이트할 것입니다.이상하긴 하지만 적어도 예측은 가능합니다.

번들 캐시를 새로 고친 이유를 파악하기 위해 노력한 끝에 다른 사용자에게 도움이 될 몇 가지 결론을 내렸습니다.

.min 파일이 번들의 일부로 포함된 경우:

  • 릴리스 모드 + minjs 코드 변경 = 캐시 새로 고침
  • 릴리스 모드 + non-minjs 코드 변경 = 캐시 새로 고침 없음
  • 디버그 모드 + minjs 코드 변경 = 캐시 새로 고침 없음
  • 디버그 모드 + non-minjs 코드 변경 = 캐시 새로 고침 없음

.min 파일이 번들의 일부로 포함되지 않은 경우:

  • 디버그 모드 + js 코드 변경 = 캐시 새로 고침 없음
  • 릴리스 모드 + js 코드 변경 = 캐시 새로 고침

메모들

  • 디버그 모드에서 나는 web.config 컴파일 디버그 = true(및 BundleTable)를 의미합니다.최적화 사용 = false 또는 생략됨)
  • 릴리스 모드에서는 web.config 컴파일 디버깅 = false(및 BundleTable)를 의미합니다.최적화 사용 = true 또는 생략됨
  • 실제로 코드를 변경하고 있는지 확인합니다.공백 및 주석과 같은 변경사항은 결과적으로 최소화된 j에 영향을 미치지 않으므로 서버는 변경사항이 없다는 점에서 정확합니다(따라서 번들 캐시는 새로 고쳐지지 않습니다).

Google Chrome을 사용하는 경우 캐싱은 매우 공격적입니다. 않도록 캐되지않하다작수다행니합업을음을 수행할 수 .Ctrl-Shift-I개발자 창을 표시합니다.에 가다Network를 클릭합니다.Disable Cache이걸 열어놔야 해요.이제 페이지를 새로 고칩니다.캐시를 지우고 파일 변경 내용을 지금 반영해야 합니다.

Disable cache in Google Chrome

좋아요, 제 이야기는 이렇습니다.Web Essentials에서 파일 수를 줄이기 위해 min 파일 생성을 비활성화했습니다.오래된 min 파일은 삭제되지 않았고, bundle thingy는 업데이트된 CSS 대신에 그것들을 보았습니다.행운을 빕니다.

편집

얼마 후 저는 같은 문제에 대해 또 다른 좋은 2시간을 보냈습니다.이번에는 제가 잘못한 것 같습니다. - 저는 선두 타일을 잊어버렸습니다. 즉,나는 썼습니다.

Scripts.Render("/js/script")

대신에

Scripts.Render("~/js/script")

어떤 이유에서든 때로는 효과가 있었고, 때로는 그런 일을 하지 않았습니다.

번들링 작업은 대소문자를 구분합니다.파일 이름에 올바른 대소문자가 있는지 확인합니다.

저는 제 BundleConfig.cs 의 한 줄을 바꿔야 했습니다.

bundles.Add(new StyleBundle("~/Content/css").Include(
    "~/Content/bootstrap.css",
    "~/Content/Site.css"));  <-- Uppercased.

저는 사실 시스템을 사용하지 않기로 결정했습니다.이 작업에 대한 Web.Optimization이지만 MVC4 시스템과 함께 제공되는 WebGrease.dll에도 포함되어 있는 Microsoft Ajax Minifier를 찾았습니다.웹.최적화 라이브러리.저는 다음 함수를 작성했고, 각 미니화된 파일에 대해 Application_Start를 호출했습니다.

    public static void MinifyFile(string virtualPath)
    {
        string fullPath = HttpContext.Current.Server.MapPath(virtualPath);
        string extension = Path.GetExtension(fullPath).ToLower();
        string targetPath = fullPath.Substring(0, fullPath.Length - extension.Length) + ".min" + extension;
        if(File.Exists(fullPath) == false) 
        {
            throw new FileNotFoundException("File not found: " + fullPath);
        }
        string input = File.ReadAllText(fullPath);
        string output;
        if (extension == ".js")
        {
            Microsoft.Ajax.Utilities.Minifier jsmin = new Microsoft.Ajax.Utilities.Minifier();
            output = jsmin.MinifyJavaScript(input);
        }
        else if (extension == ".css")
        {
            Microsoft.Ajax.Utilities.Minifier jsmin = new Microsoft.Ajax.Utilities.Minifier();
            output = jsmin.MinifyStyleSheet(input);                
        }
        else
        {
            throw new NotSupportedException(extension + " is not supported for minification.");
        }
        File.WriteAllText(targetPath, output);
    }

이제 제 애플리케이션은 Application_Start의 모든 파일을 최소화하고 있습니다.

현재 기능이 브라우저 캐싱을 방지하기 위해 해시 코드를 포함하는 URL에 암묵적으로 의존하기 때문에 CDN이 되는 것을 실제로 지원할지 확신할 수 없습니다.

하지만 당신이 그곳에 도착할 수 있도록 도와줄 수 있어요 그리고 어쩌면 오늘 가능할지도 몰라요잠재적으로 장애물이 될 수 있는 한 가지 문제는 IfLastModified 헤더가 포함된 번들 요청에 대해 BundleHandler가 304개를 반환한다는 것입니다. 이는 URL에 있는 지문으로 인해 브라우저 캐시가 항상 유효하다는 것을 가정하기 때문입니다.

번들에 대한 참조를 렌더링하는 방법에 대한 세부 정보를 추가할 수 있습니까?스크립트와 같은 것을 사용하고 있습니까?렌더("~/스크립트/플러그인/플러그인js")?

번들 스크립트 태그는 다음과 같아야 합니다.

Good: <script src="/fbt/bundles/js?v=wvLq7H7qEZB2giyIRn7aEZAxhHOb2RfTYYh2HMd9EqM1"></script>

스크립트 태그가 버전 문자열이 없는 원시 번들을 참조하는 경우 다음과 같은 캐싱 문제가 발생할 수 있습니다.

Not good: <script src="/fbt/bundles/js></script>

업데이트된 지 꽤 시간이 흘렀지만 번들이 내 CSS 변경 사항을 따라잡을 수 있도록 몇 초만 기다리면 된다는 것을 알게 되었습니다.부트스트랩이 없는 파일을 CSS와 min.css로 컴파일하고 있는데, 내 변경 사항을 보는 것은 결코 즉각적이지 않습니다.저에게는 SSD가 장착된 빠른 PC에서 약 10초 정도였습니다.주행 거리는 시스템 사양에 따라 달라질 수 있습니다.

저는 이 답변을 보았지만 이 중 어느 것도 저에게는 해당되지 않았습니다.스타일 번들러를 실패하게 만드는 특정 CSS 규칙이 있었고 CSS 파일을 변경하더라도 동일한 해시를 얻습니다.이전에는 모든 것이 제대로 작동했습니다.

나의 경우, 위반한 CSS 선택기 규칙은 -였습니다.

#globalSearch.searching { ... }

만약 내가 이것을 그냥 만든다면,

.searching { ... }

모든 것이 다시 작동하기 시작하고 내가 내 CSS 파일을 변경하면 번들러 해시가 올바르게 변경됩니다.누군가에게 도움이 될 수도 있기 때문에 이 답변을 추가하는 것입니다.

무엇보다 방금 전에 한 js 파일이 무슨 일이 있어도 업데이트를 설명할 수 없이 거부하는 문제가 있었습니다(재구축, 강제 캐시 삭제 등).잠시 후 IE의 클라이언트 디버그 도구를 켜고(F12) 네트워크 트래픽을 모니터링하기 시작했는데, 이 동작만으로 JS 파일이 새로 고쳐졌습니다.가서 계산해봐요, 하지만 효과가 있었어요.

저에게 문제는 피들러를 실행하게 했다는 것입니다.내가 그것을 닫고 내 솔루션을 다시 구축한 후에 그것은 나를 위해 js 파일의 변경 사항을 로드하고 있었습니다.

저도 비슷한 문제가 있었습니다.제 상황에서는 스타일 번들에서 CSS 파일을 참조하고 MVC 보기에서 해당 번들을 참조했습니다.또한 번들 코드에서 "최적화 사용" 플래그를 false로 설정했습니다.

이 모든 상황에도 불구하고 보기는 새 CSS 파일을 포함하도록 업데이트하기를 거부했습니다.

제 해결책은 CSS 파일의 최소화된 버전을 만들어 프로젝트에 포함시키는 것이었고 그것은 작동하기 시작했습니다.최소화된 파일은 (보기가 업데이트된 후에도) 어디에서도 참조되지 않으며 코드가 최적화되지 않도록 설정되어 있으므로 고려할 필요조차 없기 때문에 이러한 이유가 무엇인지 모르겠습니다.이는 번들 기능의 버그(또는 기능)일 가능성이 높습니다.저는 이것이 다른 누군가가 이 문제에 부딪히는데 도움이 되기를 바랍니다.

앱이 릴리스 모드로 배포되고 호스트가 설정을 조작하고 있는지 확인합니다.저는 이 문제를 겪고 있었지만, 조사한 후 제 파일이 실제로 번들로 제공되지 않는다는 것을 깨달았습니다.릴리스 모드에서 배포하고 있었지만, 어떤 이유로(호스트가 의심됨) 제 앱이 디버그에 배포된 것 같습니다.

저는 BundleConfig.cs 파일의 끝에 다음과 같이 설정하여 강제로 번들링을 수행해야 했고, 이로 인해 업데이트된 파일이 브라우저에 표시되었습니다.

BundleTable.EnableOptimizations = true;

저는 오늘 이 문제를 겪었고 모든 답을 검토했지만 여기 있는 어떤 해결책으로도 제 문제가 해결되지 않았습니다.나중에 저는 제 CSS에 오류가 있어서 이런 일이 일어나고 있다는 것을 알게 되었습니다.URL 중 하나가 닫히지 않았습니다(마지막 단일 따옴표가 누락됨).

이로 인해 CSS 파일에 구문 오류가 발생하여 번들 구성용으로 컴파일하지 못했습니다.출력 로그에 메시지가 있을 것 같은데 확인하지 않았습니다.

2020년에 이런 일이 발생할 경우 CSS에 구문 오류가 없는지 확인하십시오.

시스템을 업데이트하십시오.웹.NuGet에 의한 최적화enter image description here

enter image description here

언급URL : https://stackoverflow.com/questions/12158933/asp-net-bundling-bundle-not-updating-after-included-file-has-changed-returns

반응형