[javascript] 브라우저가 asp.net 응용 프로그램에서 최신 js 및 css 파일을 가져 오도록 강제

일부 브라우저는 js 및 css 파일을 캐시하여 강제하지 않으면 새로 고치지 못합니다. 가장 쉬운 방법은 무엇입니까?

방금 작동하는 것처럼 보이는이 솔루션을 구현했습니다.

페이지에서 버전 변수 선언

  public string version { get; set; }

web.config 키에서 버전 번호 가져 오기

 version = ConfigurationManager.AppSettings["versionNumber"];

aspx 페이지에서 자바 스크립트와 스타일 시트를 이렇게 호출하십시오.

<script src="scripts/myjavascript.js?v=<%=version %>" type="text/javascript"></script>
<link href="styles/mystyle.css?v=<%=version %>" rel="stylesheet" type="text/css" />

따라서 web.config에서 버전을 1.0에서 1.1로 설정하면 브라우저가 최신 파일을 다운로드하여 사용자와 사용자의 불만을 덜어줍니다.

더 잘 작동하는 다른 솔루션이 있습니까? 아니면 웹 사이트에 예기치 않은 문제가 발생합니까?



답변

마지막으로 수정 된 타임 스탬프를 스크립트에 대한 쿼리 매개 변수로 지정하여이 문제를 해결했습니다.

확장 방법을 사용하여이를 CSHTML 파일에서 사용했습니다. 참고 : 이 구현은 1 분 동안 타임 스탬프를 캐시하므로 디스크를 너무 많이 쓰지 않습니다.

확장 방법은 다음과 같습니다.

public static class JavascriptExtension {
    public static MvcHtmlString IncludeVersionedJs(this HtmlHelper helper, string filename) {
        string version = GetVersion(helper, filename);
        return MvcHtmlString.Create("<script type='text/javascript' src='" + filename + version + "'></script>");
    }

    private static string GetVersion(this HtmlHelper helper, string filename)
    {
        var context = helper.ViewContext.RequestContext.HttpContext;

        if (context.Cache[filename] == null)
        {
            var physicalPath = context.Server.MapPath(filename);
            var version = $"?v={new System.IO.FileInfo(physicalPath).LastWriteTime.ToString("MMddHHmmss")}";
            context.Cache.Add(filename, version, null,
              DateTime.Now.AddMinutes(5), TimeSpan.Zero,
              CacheItemPriority.Normal, null);
            return version;
        }
        else
        {
            return context.Cache[filename] as string;
        }
    }
}

그리고 CSHTML 페이지에서 :

 @Html.IncludeVersionedJs("/MyJavascriptFile.js")

렌더링 된 HTML에서는 다음과 같이 나타납니다.

 <script type='text/javascript' src='/MyJavascriptFile.js?20111129120000'></script>


답변

솔루션이 작동합니다. 사실 꽤 인기가 있습니다.

Stack Overflow도 비슷한 방법을 사용합니다.

<link rel="stylesheet" href="http://sstatic.net/so/all.css?v=6184"> 

v=6184SVN 개정 번호는 어디에 있습니까 ?


답변

에서 ASP.NET 코어 (MVC 6)이은을 통해 상자 밖으로 작동하는 asp-append-version태그 도우미 :

<script src="scripts/myjavascript.js" asp-append-version="true"></script>
<link href="styles/mystyle.css rel="stylesheet" asp-append-version="true" />


답변

JS / CSS에 번들을 사용하는 경우 ASP.NET MVC가이를 처리합니다. 번들에 GUID 형식으로 버전 번호를 자동으로 추가하고 번들이 업데이트 될 때만이 GUID를 업데이트합니다 (일명 소스 파일에 변경 사항이 있음).

컨텐츠로드 시간을 크게 향상시킬 수 있으므로 JS / CSS 파일이 많은 경우에도 도움이됩니다.

여기를 보아라


답변

이를 위해 asp.net에 내장 된 방법이 있습니다 : 번들링 . 그냥 사용하세요. 각 새 버전에는 고유 한 접미사 “? v = XXXXXXX”가 있습니다. 디버그 모드에서는 번들링이 꺼져 있으며 web.config에서 make 설정을 켜는 경우 :

<system.web>
    <compilation debug="false" />
</system.web>

또는 RegisterBundles (BundleCollection bundles) 메서드에 추가합니다.

BundleTable.EnableOptimizations = true;

예를 들면 :

BundleConfig.cs :

bundles.Add(new ScriptBundle("~/Scripts/myjavascript.js")
                .Include("~/Scripts/myjavascript.js"));

bundles.Add(new StyleBundle("~/Content/mystyle.css")
                .Include("~/Content/mystyle.css"));

_Layout.cshtml :

@Scripts.Render("~/Scripts/myjavascript.js")
@Styles.Render("~/Content/mystyle.css")


답변

질문에서 op에 의해 제공된 대답보다 더 간단한 대답이 있습니다 (접근 방식은 동일 함).

web.config에서 키를 정의하십시오.

<add key="VersionNumber" value="06032014"/>

aspx 페이지에서 직접 appsettings를 호출합니다.

<link href="styles/navigation.css?v=<%=ConfigurationManager.AppSettings["VersionNumber"]%>" rel="stylesheet" type="text/css" />


답변

Adam Tegan의 답변을 기반으로 웹 양식 응용 프로그램에서 사용하도록 수정되었습니다.

.cs 클래스 코드에서 :

public static class FileUtility
{
    public static string SetJsVersion(HttpContext context, string filename) {
        string version = GetJsFileVersion(context, filename);
        return filename + version;
    }

    private static string GetJsFileVersion(HttpContext context, string filename)
    {
        if (context.Cache[filename] == null)
        {
            string filePhysicalPath = context.Server.MapPath(filename);

            string version = "?v=" + GetFileLastModifiedDateTime(context, filePhysicalPath, "yyyyMMddhhmmss");

            return version;
        }
        else
        {
            return string.Empty;
        }
    }

    public static string GetFileLastModifiedDateTime(HttpContext context, string filePath, string dateFormat)
    {
        return new System.IO.FileInfo(filePath).LastWriteTime.ToString(dateFormat);
    }
}

aspx 마크 업에서 :

<script type="text/javascript" src='<%= FileUtility.SetJsVersion(Context,"/js/exampleJavaScriptFile.js") %>'></script>

렌더링 된 HTML에서는 다음과 같이 나타납니다.

<script type="text/javascript" src='/js/exampleJavaScriptFile.js?v=20150402021544'></script>