จะเพิ่มหมายเลขเวอร์ชันของแฮช md5 ลงในไฟล์ javascript และ css ใน Visual Studio โดยอัตโนมัติหรือใช้วิธีอื่นในการบังคับให้รีเฟรชแคชของเบราว์เซอร์ได้อย่างไร

เมื่อใดก็ตามที่ฉันเผยแพร่ไฟล์ CSS หรือจาวาสคริปต์เวอร์ชันใหม่สำหรับเว็บแอปพลิเคชันใดๆ ของเรา ฉันจะเพิ่ม ?v=# ลงใน URL ในส่วนหัวของ HTML ด้วยตนเอง (# คือหมายเลขเวอร์ชัน เช่น 3 หรือ 10) เพื่อให้แน่ใจว่าผู้ใช้ แคชของเบราว์เซอร์ไม่ได้ขัดขวางการเปลี่ยนแปลง

แต่บางแอปพลิเคชันมีไฟล์ CSS และ JS หลายไฟล์อยู่ในส่วนหัว ดังนั้นจึงเป็นเรื่องน่าเบื่อที่จะติดตามไฟล์ที่เปลี่ยนแปลงทั้งหมด

เราใช้แพลตฟอร์ม ASP.NET บนเซิร์ฟเวอร์ IIS ดังนั้นการใช้คำตอบของ วิธีที่หรูหราในการบังคับให้เบราว์เซอร์โหลดไฟล์ CSS/JS ที่แคชไว้คืออะไร เป็นไปไม่ได้ แต่ฉันกำลังมองหาสิ่งที่คล้ายกัน ควรใช้จาวาสคริปต์ทั้งหมด

ฉันชอบคำแนะนำในโพสต์นั้นให้ใช้แฮช md5 แต่ดูเหมือนจะหาวิธีคำนวณผลรวมของไฟล์ CSS หรือ JS ไม่ได้

รหัสจะมีลักษณะดังนี้ (โดยใช้ jQuery):

$.each($("script[type='text\javascript']"),function(){
    $(this).attr("src",$(this).attr("src") + "?v=" + checkMD5Sum($(this).attr("src")) );
});

function checkMD5Sum(url){
    //get the hash or something to auto version the file
    //I could send the url or filename to a webmethod to get the MD5 check sum, but doing this after page load is not usefull, so what to do?
}

หรือบางทีอาจใช้กระบวนการหลังสร้างใน Visual Studio แต่ฉันไม่เคยทำแบบนั้นมาก่อน ดังนั้นฉันจึงลังเลที่จะลอง


แก้ไข

จะลองทำสิ่งนี้ใน web.config ตาม การเพิ่มโปรไฟล์แคช

<configuration>
   <system.webServer>
      <caching enabled="true">
         <profiles>
            <add extension=".js" policy="CacheUntilChange" />
            <add extension=".css" policy="CacheUntilChange" />
         </profiles>
      </caching>
   </system.webServer>
</configuration>

person Daniël Tulp    schedule 14.09.2015    source แหล่งที่มา


คำตอบ (2)


ดูเหมือนว่าโซลูชันของคุณต้องการให้เบราว์เซอร์ดึงไฟล์สองครั้ง และคุณไม่รับประกันสถานะของการดึงข้อมูลครั้งแรก ดังนั้นมันจึงไม่ทำงาน

การแคชถูกกำหนดโดยเซิร์ฟเวอร์ ไม่สามารถตัดสินใจได้ว่าจะมีเวอร์ชันใหม่ให้ใช้งานบนไคลเอ็นต์เมื่อใด เว้นแต่ว่าคุณจะเพิกเฉยต่อแคชและเสมอดึงสำเนาใหม่

มีหลายวิธีในการใช้นโยบายการแคช การพิมพ์ลายนิ้วมือพร้อมหมายเลขเวอร์ชันเป็นหนึ่งในนั้น

ฉันชอบใช้ ETag ให้ ETag เป็นเวลาไฟล์และคุณก็ทำได้ดี

person Halcyon    schedule 14.09.2015
comment
ฉันจะใช้ ETag กับไฟล์ใน IIS ได้อย่างไร - person Daniël Tulp; 14.09.2015
comment
ฉันไม่รู้ว่ามันทำงานอย่างไรบน IIS แต่บน Apache คุณสามารถกำหนดค่าส่วนหัว ETag ใน .htacess ฉันคาดหวังว่าคุณสามารถทำสิ่งที่คล้ายกันกับ IIS ได้ - person Halcyon; 14.09.2015
comment
คุณสามารถทำได้ใน web.config ฉันเชื่อว่าได้ทำไปแล้วในโครงการอื่น แต่ฉันไม่รู้ว่ามีตัวเลือก filemtime ให้ใช้งาน - person Daniël Tulp; 14.09.2015
comment
technet.microsoft.com/en-us/ Library/ee619764(v=ws.10).aspx สำหรับ IIS ทุกเวอร์ชัน ค่า ETag สำหรับออบเจ็กต์ที่ส่งคืนจะขึ้นอยู่กับเวลาไฟล์ที่แก้ไขล่าสุด - person Halcyon; 14.09.2015
comment
ฉันอยู่บนเซิร์ฟเวอร์ที่ใช้ร่วมกัน ดังนั้นจึงไม่สามารถกำหนดค่า IIS ได้ แต่ฉันอาจใช้ iis.net/configreference/system.webserver/caching/profiles/add จะลองดู - person Daniël Tulp; 14.09.2015

  VersionNumber = System.Configuration.ConfigurationManager.AppSettings["Version"];

    //Caching Issues For JS
    public static string JSVersionUpdate(string JsFile)
    {
        StringBuilder str = new StringBuilder();
        str.Append(GetQualifiedPath(JsFile));
        str.Append("?Version=");
        str.Append(VersionNumber);
        return str.ToString();
    }

    public static void DiscardVersion()
    {
        VersionNumber = null;
    }

    //get Full Path for JS File
    private static string GetQualifiedPath(string path)
    {
        var httpRequestBase = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);

        path = path.Replace("~", string.Empty);

        string appPath = string.Empty;
        if (httpRequestBase != null)
        {
            //Formatting the fully qualified website url/name
            appPath = string.Format("{0}://{1}{2}{3}{4}",
                        httpRequestBase.Request.Url.Scheme,
                        httpRequestBase.Request.Url.Host,
                        httpRequestBase.Request.Url.Port == 80 ? string.Empty : ":" + httpRequestBase.Request.Url.Port,
                        httpRequestBase.Request.ApplicationPath,
                        path);
        }
        appPath = appPath.TrimEnd('/');

        return appPath;
    } 
}

ในหน้า UI : script src="JSVersionUpdate("~/Scripts/Application/Abc.js")"

O/p : ~/Scripts/Application/Abc.js/version=1.0

คำขอเบราว์เซอร์สำหรับไฟล์ JS จากเซิร์ฟเวอร์เฉพาะในกรณีที่เวอร์ชันแตกต่างออกไปมิฉะนั้นจะถูกแคชออก ตอนนี้ฉันไม่จำเป็นต้องบอกใครให้ล้างแคชซ้ำแล้วซ้ำอีกหลังจากการปรับใช้ สิ่งเดียวที่ฉันทำคือเปลี่ยนหมายเลขเวอร์ชันใน Web Config

person Pankaj    schedule 11.07.2017