ASP.NET 번들링-포함 된 파일이 변경된 후 번들이 업데이트되지 않음 (수정되지 않은 304 반환)
ASP.NET MVC 4 응용 프로그램과 함께 ASP.NET 번들링을 시도하고 있습니다. 상황은 다음과 같은 유형의 주소로 다른 사이트에서 주소를 지정할 수있는 JS 및 CSS 파일이있는 CDN 스타일 서비스를 만들고 싶습니다. http://www.mycdn.com/scripts/plugin/js . 포함 된 모든 .js 파일을 축소합니다.
하나의 파일에 대한 내 번들 구성은 다음과 같습니다.
bundles.Add(new ScriptBundle("~/Scripts/plugin/pluginjs").Include("~/Scripts/plugin/jquery.plugin.js"));
그러나 이렇게하면 원본 js 파일을 변경 한 후에도 번들이 업데이트되지 않습니다. 브라우저를 새로 고칠 때 304 Not Modified가 계속 표시되고 축소 된 파일의 내용이 업데이트되지 않습니다. 오래된 콘텐츠가 포함 된 번들을 사용할 수 없으므로 번들을 업데이트하려면 어떻게해야합니까? 나는 모든 방법을 시도했지만 해결책을 찾지 못했습니다.
미리 감사드립니다!
나는 똑같은 문제가 있었다. 2 개의 CSS 파일이있는 폴더가 있습니다.
- ~ / Content / 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.min.css
모든 것이 잘 작동하기 시작했습니다. 재생 조금 더 나는 것을 발견 모두가있는 경우 main.css
및 main.min.css
다음 업데이트 main.min.css
실제로 번들 ... 불가사의를 업데이트하지만, 적어도 예측.
번들 캐시를 새로 고치는 이유를 파악하기 위해 싸운 후 다른 사람들에게 도움이 될 몇 가지 결론에 도달했습니다.
.min 파일이 번들의 일부로 포함 된 경우 :
- 릴리스 모드 + 최소 js 코드 변경 = 캐시 새로 고침
- 릴리스 모드 + 최소가 아닌 js 코드 변경 = 캐시 새로 고침 없음
- 디버그 모드 + 최소 js 코드 변경 = 캐시 새로 고침 없음
- 디버그 모드 + 최소가 아닌 js 코드 변경 = 캐시 새로 고침 없음
.min 파일이 번들의 일부로 포함되지 않은 경우 :
- 디버그 모드 + js 코드 변경 = 캐시 새로 고침 없음
- 릴리스 모드 + js 코드 변경 = 캐시 새로 고침
메모
- 디버그 모드 란 web.config 컴파일 디버그 = true (및 BundleTable.EnableOptimizations = false 또는 생략 됨)를 의미합니다.
- 릴리스 모드 란 web.config 컴파일 디버그 = false (및 BundleTable.EnableOptimizations = true 또는 생략 됨)를 의미합니다.
- 실제로 코드를 변경하고 있는지 확인하십시오. 공백 및 주석과 같은 변경 사항은 축소 된 js에 영향을주지 않으므로 변경 사항이 없다는 점에서 서버가 정확합니다 (번들 캐시가 새로 고쳐지지 않음).
좋아요, 여기 제 이야기입니다. Web Essentials에서 더 적은 파일에 대해 최소 파일 생성을 비활성화했습니다. 오래된 min 파일은 삭제되지 않았으며 번들은 업데이트 된 CSS 대신 파일을 보았습니다. 행운을 빕니다!
편집하다
언젠가 나는 같은 문제에 대해 또 다른 좋은 2 시간을 보냈다. 이번에는 내 잘못이었던 것 같습니다. 내가 썼던 선두 물결표를 잊어 버렸습니다.
Scripts.Render("/js/script")
대신
Scripts.Render("~/js/script")
어떤 이유로 든 때로는 효과가 있었고 때로는 그런 일이 없었습니다.
Google 크롬을 사용하는 경우 캐싱이 매우 공격적입니다. 캐시 된 항목이 없도록하려면 Ctrl-Shift-I
개발자 창을 표시 할 수 있습니다 . 로 이동하여을 Network
클릭 Disable Cache
합니다. 이것을 열어 두십시오. 이제 페이지를 새로 고칩니다. 캐시가 삭제되고 파일 변경 사항이 지금 반영되어야합니다.
실제로이 작업에 System.Web.Optimization을 사용하지 않기로 결정했지만 MVC4 System.Web.Optimization 라이브러리와 함께 제공되는 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의 모든 파일을 축소하고 있습니다.
번들링 작업은 대소 문자를 구분합니다. 파일 이름의 대소 문자가 올바른지 확인하십시오.
BundleConfig.cs에서 줄을 변경해야했습니다.
bundles.Add(new StyleBundle("~/Content/css").Include(
"~/Content/bootstrap.css",
"~/Content/Site.css")); <-- Uppercased.
브라우저 캐싱을 방지하기 위해 해시 코드를 포함하는 URL에 암시 적으로 의존하기 때문에 현재 기능이 실제로 CDN을 지원할 것이라고 확신하지 않습니다.
그러나 나는 당신이 거기에 도달하기 위해 노력할 수 있도록 도울 수 있으며 아마도 오늘 가능할 수도 있습니다 ... 잠재적으로 장애물이 될 수있는 한 가지 문제는 BundleHandler가 IfLastModified 헤더를 포함하는 모든 번들 요청에 대해 304를 반환한다는 것입니다. URL의 지문으로 인해 브라우저 캐시는 항상 유효합니다.
번들에 대한 참조를 렌더링하는 방법에 대한 세부 정보를 추가 할 수 있습니까? Scripts.Render ( "~ / Scripts / plugin / pluginjs")와 같은 것을 사용하고 있습니까?
번들 스크립트 태그는 다음과 같아야합니다.
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 파일을 변경하면 번 들러 해시가 올바르게 변경됩니다. 누군가에게 도움이 될 수 있으므로이 답변을 추가하십시오.
Just update your System.Web.Optimization by NuGet
For what it's worth, I had the same problem just now with one js file inexplicably refusing to update no matter what (rebuild, forced cache clear etc). After a while, I switched the client debug tools in IE on (F12) to start watching the network traffic, and this act alone forced the JS file to refresh. Go figure, but it worked.
The Issue for me was I had Fiddler running. After I close dit and rebuilt my solution it was loading the changes in the js file for me.
I had a similar problem. In my situation, I had a CSS file referenced in a style bundle and had that bundle referenced in my MVC view. I also had the "EnableOptimizations" flag set to false in the bundle code.
Despite all this, the view refused to update to include the new CSS file.
내 해결책은 CSS 파일의 축소 된 버전을 만들고 프로젝트에 포함하는 것이었고 작동하기 시작했습니다. 축소 된 파일이 (보기가 업데이트 된 후에도) 어디에서나 참조되지 않고 코드가 최적화되지 않도록 설정 되었기 때문에 고려해서는 안되기 때문에 이것이 왜 그런지 모르겠습니다. 이는 번들링 기능의 버그 (또는 기능) 일 가능성이 높습니다. 이 문제가 다른 사람에게 도움이되기를 바랍니다.
'Nice programing' 카테고리의 다른 글
Pandas에서 시계열도에 수직선을 어떻게 그리나요? (0) | 2020.11.04 |
---|---|
event.preventDefault를 다시 활성화하는 방법은 무엇입니까? (0) | 2020.11.04 |
순간 검색을 날짜 형식으로 변환하는 방법은 무엇입니까? (0) | 2020.11.03 |
오류-SqlDateTime 오버플로입니다. (0) | 2020.11.03 |
IComparable 인터페이스를 구현하는 방법은 무엇입니까? (0) | 2020.11.03 |