ব্রাউজারগুলিকে এএসপিএন অ্যাপ্লিকেশনটিতে সর্বশেষ জেএস এবং সিএসএস ফাইল পেতে বাধ্য করুন


104

কিছু ব্রাউজার জেএসএস এবং সিএসএস ফাইলগুলিকে ক্যাশে করে, আপনি যদি তাদের বাধ্য না করেন তবে তা রিফ্রেশ করতে ব্যর্থ হন। সবচেয়ে সহজ উপায় কি।

আমি সবেমাত্র এই সমাধানটি কার্যকর করে যাব বলে মনে করেছি implemented

আপনার পৃষ্ঠায় একটি সংস্করণ পরিবর্তনশীল ঘোষণা করুন

  public string version { get; set; }

ওয়েবকনফিগ কী থেকে সংস্করণ নম্বরটি পান

 version = ConfigurationManager.AppSettings["versionNumber"];

আপনার এসপেক্স পৃষ্ঠায় জাভাস্ক্রিপ্ট এবং স্টাইলশিটগুলিতে কল করুন

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

সুতরাং আপনি যদি আপনার ওয়েবকনফিগের ১.০ থেকে সংস্করণ = ১.১ সেট করে থাকেন তবে আপনার ব্রাউজারটি সর্বশেষতম ফাইলগুলি ডাউনলোড করবে যা আশা করি আপনি এবং আপনার ব্যবহারকারীদের কিছুটা হতাশাকে বাঁচাতে পারবেন।

আরও একটি সমাধান রয়েছে যা আরও ভাল কাজ করে, বা এটি কোনও ওয়েবসাইটের জন্য কোনও অপ্রত্যাশিত সমস্যার কারণ হবে?


আকর্ষণীয় প্রশ্ন, আমার সম্প্রতি একই সমস্যা ছিল, তবে উন্নয়ন পরীক্ষার সময় এটি ছিল কেবল একটি সমস্যা। প্রবর্তনের পরে এই ফাইলগুলি পরিবর্তন করার আমাদের উদ্দেশ্য নেই বলে এ সম্পর্কে খুব একটা পাত্তা দেয়নি। ভবিষ্যতের রেফারেন্সের জন্য যদিও একটি সমাধান জানতে পছন্দ করবেন!
ব্রেট অ্যালেন 16

কেবলমাত্র আমি দেখতে পাচ্ছি যে ওয়েলকনফাইগের পরিবর্তনগুলি, পটভূমিতে একটি অ্যাপ্লিকেশন পুনঃসূচনা কল করবে: এমএসডিএন.মাইক্রোসফট.ফেন
মন্টি

এই প্রশ্নের জন্য আপনাকে ধন্যবাদ। এটি আমাকে একটি বড় সমস্যা সমাধানে সহায়তা করেছে।
রেড্ডি

উত্তর:


76

আমি স্ক্রিপ্টগুলিতে ক্যোয়ারী প্যারামিটার হিসাবে একটি সর্বশেষ পরিবর্তিত টাইমস্ট্যাম্পটি পরীক্ষা করে এটি সমাধান করেছি।

আমি এটি একটি এক্সটেনশন পদ্ধতিতে করেছি এবং এটি আমার সিএসএইচটিএমএল ফাইলগুলিতে ব্যবহার করছি। দ্রষ্টব্য: এই বাস্তবায়নটি 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;
        }
    }
}

এবং তারপরে সিএসএইচটিএমএল পৃষ্ঠায়:

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

রেন্ডার করা এইচটিএমএল এ এটি প্রদর্শিত হবে:

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

1
এটি এমভিসি-র জন্য দুর্দান্ত, আমি ভাবছি সর্বশেষতম এমভিসি 5 কাঠামো যদি এই সমস্যাটি পরিচালনা করে? Nd সংস্করণ} ওয়াইল্ডকার্ডের
সাহায্যে বান্ডিলিংয়ের ব্যবহারটি

আমি একটি ওয়েবফর্ম ওয়েবসাইটে আপনার এমভিসি উদাহরণের বেসিকগুলি ব্যবহার করছি এবং এটি দুর্দান্ত কাজ করছে, তাই ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ!
ব্রায়ান

রিসোর্স ফাইলগুলির জন্য সর্বশেষ পরিবর্তিত তারিখ / সময় স্ট্যাম্পটি প্রদর্শন করার বিষয়ে উদ্বিগ্ন হওয়ার কোনও কারণ থাকতে হবে? যদি কোনও ফাইল ব্যবহৃত হওয়ার কয়েক বছর আগে একটি তারিখ / সময় স্ট্যাম্প থাকে, তবে কোনও সংস্থা তাদের ব্যবহারকারীদের কাছে সর্বজনীন হতে না চাওয়ার তথ্য হতে পারে?
ব্রায়ান

এটি স্ট্যান্ডার্ড উপায়, বেশিরভাগ অ্যাপ্লিকেশন অনুসরণ করে। তবে সেই সময় স্ট্যাম্পটি কেবল তখনই পরিবর্তন করা উচিত যখন আপনি আপনার অ্যাপ্লিকেশন মোতায়েন করেন বা তৈরি করেন। অন্যথায় প্রতিবার ব্যবহারকারী পুনরায় সতেজ করুন বা আপনার অ্যাপ্লিকেশনের অন্যান্য পৃষ্ঠায় স্যুইচ করুন। ব্রাউজারটি আপনার সমস্ত স্টাইলশিট এবং জাভাস্ক্রিপ্ট আবার ডাউনলোড করবে, যা ভাল নয়
তরুণ

2
পৃষ্ঠার কর্মক্ষমতা উপর প্রভাব কি? পৃষ্ঠাটি লোড করতে এটি কত দেরি করতে পারে?
দুর্গেশ সোনাওয়ানে

28

আপনার সমাধান কাজ করে। এটি বাস্তবে বেশ জনপ্রিয়।

এমনকি স্ট্যাক ওভারফ্লো একই জাতীয় পদ্ধতি ব্যবহার করে:

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

কোথায় v=6184সম্ভবত SVN সংস্করণ সংখ্যা।


এটি গ্রহণযোগ্য উত্তরে বর্ণিত বর্ণনার চেয়ে অনেক বেশি ট্যাক্সিং পদ্ধতির হবে। প্রতিবার কোনও পৃষ্ঠা পরিবেশন করা হওয়ার পরে ফাইলটির এসভিএন সংস্করণ চেক করা একটি কার্যকারিতা ওভারহেড, বিশেষত সময়ের সাথে সাথে ব্যবহারকারী সংখ্যা বৃদ্ধি পায়।
নিওলিস্ক

4
আপনি বিল্ড চলাকালীন পুনর্বিবেচনা নম্বর পেতে পারেন, একটি ফাইল (যেমন আংশিক .cs ফাইল) এ লিখুন, আপনার প্রকল্পে সেই ফাইলটি অন্তর্ভুক্ত করুন, সুতরাং রানটাইমের সময় আপনার এসএনএন থেকে পড়ার দরকার নেই। আমি এসএসএন থেকে আমার এসেম্বলিআইএনফোস ফাইলগুলিতে সংশোধন নম্বরগুলি রাখার জন্য এমএসবিল্ডের সাথে এই পদ্ধতির ব্যবহার করেছি।
রমজান বিনারবাসী

2
বিশ্বব্যাপী সংস্করণ / পুনর্বিবেচনা নম্বর ব্যবহার করার ক্ষেত্রে কমপক্ষে একটি অসুবিধা রয়েছে: একটি ওয়েবসাইট আপডেট প্রকাশ করা সমস্ত .js এবং .css ফাইলগুলির জন্য ব্রাউজারের ক্যাশেগুলিকে অবৈধ করে দেয়, কেবল পরিবর্তিত পরিবর্তনগুলি নয়। এটি সম্ভবত বেশিরভাগ অ্যাপ্লিকেশনের ক্ষেত্রে গুরুত্বপূর্ণ নয়, তবে আমি এটি সম্পূর্ণতার জন্য উল্লেখ করেছি।
অ্যাডাম তেগেন

আপনি যদি কোনও স্থাপনা বা বিল্ড করার সময় আপনার অ্যাসেম্বলিনফো ফাইলগুলির সংস্করণটি স্বয়ংক্রিয়ভাবে আপডেট করেন তবে এই সংখ্যার জন্য ছোটখাটো সংস্করণ ব্যবহার করা যেতে পারে।
ক্রিশ্চিয়ানপ

28

ইন 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" />

1
আমাদের জানতে দেওয়ার জন্য ধন্যবাদ! আমি এটা আগে জানতাম না!
ফেডেরিকো নাভারেরেট

18

আপনি যদি আপনার জেএস / সিএসএসের জন্য বান্ডিল ব্যবহার করেন তবে এএসপি.নেট এমভিসি এটি আপনার জন্য পরিচালনা করবে। এটি স্বয়ংক্রিয়ভাবে আপনার বান্ডিলগুলিতে একটি জিইউডি আকারে একটি সংস্করণ নম্বর সংযোজন করবে এবং বান্ডিলটি আপডেট হওয়ার পরে কেবল এই জিইউডি আপডেট করবে (উত্স ফাইলের কোনওরকমের পরিবর্তন আছে)।

এটি আপনার কাছে যদি টন জেএস / সিএসএস ফাইল থাকে তবে এটি সামগ্রীতে লোডের সময়ের উন্নতি করতে পারে তাও সহায়তা করে!

এখানে দেখো


আপনি কী বোঝাতে চাইছেন যে আমরা যদি এমভিসি অ্যাপ্লিকেশনটিতে বান্ডিল ব্যবহার করি তবে এখানে পোস্ট করা উত্তরের কোনও পদ্ধতির দরকার নেই? যদি তাই হয়, বান্ডিলিং সত্যিই অনেক বেশি গুরুত্বপূর্ণ যা আমি কখনও ভাবিনি। আপনি দয়া করে এই সমস্যা সম্পর্কে আমাদের পরিষ্কার করতে পারেন? ধন্যবাদ।
জ্যাক

1
হ্যাঁ অবশ্যই. আপনার স্ক্রিপ্টগুলি যতক্ষণ না কোনও বান্ডলে অন্তর্ভুক্ত করা হয়, ততক্ষণ প্রতিটি বান্ডেলের জন্য স্বয়ংক্রিয়ভাবে একটি সংস্করণ নম্বর উত্পন্ন হবে যখন কোনও বান্ডেলের উত্স ফাইলগুলিতে পরিবর্তনগুলি সনাক্ত করা যায়।
jonesy827

এবং ভুলে যাবেন না যে এখনও আপনার বিকাশকারী হিসাবে মাথা ব্যথা রয়েছে। ASP.NET বান্ডিলিং ডিবাগিং এবং বিকাশের সময় কোনওভাবে সহায়তা করে।
it3xl

12

এর জন্য এসপ নেট-তে অন্তর্নির্মিত উপায় রয়েছে: বান্ডিলিং । শুধু এটি ব্যবহার করুন। প্রতিটি নতুন সংস্করণে অনন্য প্রত্যয় থাকবে "? V = XXXXXXX"। ডিবাগ মোডে বন্ডলিং বন্ধ রয়েছে, ওয়েবকনফাইগে মেকিং সেটিংটি স্যুইচ করার জন্য:

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

অথবা RegisterBundles (বান্ডেল সংগ্রহের বান্ডিল) পদ্ধতিতে যুক্ত করুন:

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"));

_লয়আউট.একএসটিএমএল:

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

তবে এটি কেবল মুক্তি বা উত্পাদন পরিবেশে কাজ করবে। ডিবাগ মোড চালু থাকাকালীন উন্নয়নের কী হবে? বান্ডেলটি এখনও এই সমস্যাটি সমাধান করে?
ভিএএএ

হ্যাঁ, বান্ডিলাইন্ডটি বিকাশকারীদের সহজতর করে তোলে না। প্রতিটি স্ক্রিপ্ট পরিবর্তনের পরে আপনাকে Ctrl-F5 টিপতে হবে। এবং যদি আপনার ফ্রেম থাকে তবে এটি আরও মজার হবে।
it3xl

6

প্রশ্নে অপের দেওয়া জবাবের চেয়ে এর সহজ সরল উত্তর রয়েছে (পদ্ধতিটি একই)

ওয়েবকনফাইগে কীটি সংজ্ঞায়িত করুন:

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

সরাসরি এসপেক্স পৃষ্ঠা থেকে অ্যাপসেটেটিংগুলিতে কল করুন:

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

আমি এটি পছন্দ করি, তবে কেন এই সমাধানটিতে এত কম ভোট পড়েছে তা নিয়ে আমি উদ্বিগ্ন ...
সিম্পলিঙ্ক

@ সিম্প্লিআইঙ্ক আমি জানি না, তবে ২০ টির বিভিন্ন উত্তর রয়েছে, যাতে এটির সাথে কিছু করার থাকে। যদি এটি কাজ করে এবং আপনি এটি পছন্দ করেন তবে নির্দ্বিধায় এটিকে আপলোড করুন।
জ্যাকআরবিটার

4

অ্যাডম তেগানের উত্তরের ভিত্তিতে , ওয়েব ফর্ম অ্যাপ্লিকেশনটিতে ব্যবহারের জন্য পরিবর্তিত।

.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);
    }
}

এসপেক্স মার্কআপে:

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

এবং রেন্ডার করা এইচটিএমএলে এটি প্রদর্শিত হবে

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

2
হে! আপনার উদাহরণটি কাজ করছে, তবে ক্যাশিং রেফারেন্সগুলি সরিয়ে ফেলতে হবে বা ক্যাশে ব্যবহার করার জন্য কোডটি ঠিক করা উচিত কারণ আপনি কেন এটি ব্যবহার করছেন তা বিভ্রান্তিকর হতে পারে। ক্যাশে ব্যবহার করার জন্য আপনার প্রসঙ্গটি ব্যবহার করে ক্যাশের সাথে ফাইলের সংস্করণ যুক্ত করা উচিত case কেস. কেস প্রসঙ্গে পদ্ধতিটি যুক্ত করুন C ক্যাশে [ফাইলের নাম] == নাল। যদি প্রসঙ্গ.ক্যাশ [ফাইলের নাম]! = নাল তাহলে আপনার ক্যাশেড মানটি ফেরত দেওয়া উচিত (প্রসঙ্গ। ক্যাশে [ফাইলের নাম])
ফ্ল্যাভিয়া ওব্রেজা

1
ফ্ল্যাভিয়া, আমি মনে করি আপনার ব্যাখ্যাটি বোধগম্য হয়েছে এবং আমি মনে করি এটি একটি সহজ, আরও দক্ষ বাস্তবায়ন। সহায়ক মন্তব্য এবং প্রতিক্রিয়া পোস্ট করার জন্য ধন্যবাদ।
ব্রায়ান

4

মজার বিষয় হল, এই সাইটটিতে ব্যর্থ-নিরাপদ হওয়া সত্ত্বেও কিছু প্রক্সি সেটআপগুলির সাথে সংযোগে আপনি যে পদ্ধতির বর্ণনা করেছেন তাতে সমস্যা রয়েছে।

এই মেটা স্ট্যাক ওভারফ্লো আলোচনাটি দেখুন।

সুতরাং এর আলোকে, এটি আপডেট করার জন্য কোনও জিইটি প্যারামিটার ব্যবহার না করার অর্থ হতে পারে তবে প্রকৃত ফাইলের নাম:

href="/css/scriptname/versionNumber.css" 

যদিও এটি করা আরও কাজ, কারণ আপনাকে আসলে ফাইলটি তৈরি করতে হবে, বা এর জন্য একটি ইউআরএল পুনর্লিখন তৈরি করতে হবে।


4

ক্যাশে বুস্ট করার জন্য পথটিকে অনন্য করার জন্য আমি একটি সাধারণ একটি লাইনার চেয়েছিলাম। এটি আমার পক্ষে কাজ করেছে:

<script src="scripts/main.js?bust_js_cache=<%=System.IO.File.GetLastWriteTime(Server.MapPath("scripts/main.js")).ToString("HH:mm:ss")%>" type="text/javascript"></script>

ফাইলটি যখন পৃষ্ঠায় লোড হওয়ার পরে সর্বশেষ সময় থেকে সংশোধন করা হয়েছে তবে ব্রাউজার আপডেট হওয়া ফাইলটি টানবে।

এটি ফাইলটি last modifiedথেকে স্ট্যাম্প তৈরি করে .jsএবং সেখানে সংস্করণটির পরিবর্তে এটি ছাঁটাই করে যা অ্যাক্সেস করা সহজ হতে পারে না।

<script src="scripts/main.js?bust_js_cache=10:18:38" type="text/javascript"></script>

অন্য বিকল্পটি ফাইলের চেকসাম পাওয়া যেতে পারে।


1
এটি করার সবচেয়ে সহজ উপায় এবং সম্ভবত সর্বনিম্ন ওভারহেড।
টনি হিঙ্কল

1
নিখুঁত সমাধান. ক্যাচিং আসলে কাজ করছে তা নিশ্চিত করার জন্য আমি ক্রোম 70, ফায়ারফক্স 63 এবং আইই 11 পরীক্ষা করেছি tested এইটা. কমপক্ষে ব্রাউজারগুলির সর্বশেষতম সংস্করণগুলিতে এটি কেবলমাত্র ফাইলের নতুন সংস্করণে ক্যাশে করে ts আমি অন্য কোথাও উল্লেখ শুনেছি যে কিছু ব্রাউজার প্রতিটি ফাইলকে কোয়েরিস্ট্রিং (?) দিয়ে পুনরায় লোড করে। সম্ভবত এটি ব্যবহৃত হতে পারে বা এটি এখনও সাফারি এবং অপেরার সাথে সত্য। ডিকে।
ব্র্যাড ম্যাথিউজ

3

এখানে ASP.NET 5 / MVC 6 / vNext এর সাথে কাজ করে এমন একটি পদ্ধতি রয়েছে

পদক্ষেপ 1: এই থ্রেডের অন্যান্য উত্তরের অনুরূপ ফাইলের শেষ লেখার সময়টি ফেরত দিতে একটি শ্রেণী তৈরি করুন। দ্রষ্টব্য, এর জন্য ASP.NET 5 (বা অন্যান্য) নির্ভরতা ইনজেকশন প্রয়োজন।

public class FileVersionService
{
    private IHostingEnvironment _hostingEnvironment;
    public FileVersionService(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }

    public string GetFileVersion(string filename)
    {
       var path = string.Format("{0}{1}", _hostingEnvironment.WebRootPath, filename);
       var fileInfo = new FileInfo(path);
       var version = fileInfo.LastWriteTimeUtc.ToString("yyyyMMddhhmmssfff");
       return version;
     }
}

পদক্ষেপ 2: নিবন্ধন সেবা ভিতরে ইনজেকশনের করা startup.cs :

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddScoped<FileVersionService>();
    ...
}

পদক্ষেপ 3: তারপরে, এএসপি.নেট 5 এ, _ লেআউটআরসিএসটিএমএলের মতো লেআউট ভিউতে সরাসরি পরিষেবাটি ইনজেক্ট করা সম্ভব :

@inject Namespace.Here.FileVersionService fileVersionService
<!DOCTYPE html>
<html lang="en" class="@ViewBag.HtmlClass">
<head>
    ...
    <link href="/css/styles.css?v=@fileVersionService.GetFileVersion("\\css\\styles.css")" rel="stylesheet" />
    ...
</head>
<body>
    ...
</body>

শারীরিক পাথকে আরও ভালভাবে সংহত করতে এবং সিন্টেক্সের সাথে আরও সামঞ্জস্যপূর্ণ স্টাইলে ফাইলের নামটি পরিচালনা করতে এমন কিছু সমাপ্তি স্পর্শ রয়েছে। তবে এটি একটি সূচনা পয়েন্ট। আশা করি এটি এএসপি.এনইটি 5 এ যেতে লোককে সহায়তা করবে।


এই আচরণটি আসলে বাক্সের বাইরে সমর্থিত, আমার উত্তরটি দেখুন
ধাতবশত

3

আমি আমার এসপেট এমভিসি 4 সাইটে কিছুটা আলাদা কৌশল নিযুক্ত করেছি:

_ViewStart.cshtml:

@using System.Web.Caching
@using System.Web.Hosting
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    PageData.Add("scriptFormat", string.Format("<script src=\"{{0}}?_={0}\"></script>", GetDeployTicks()));
}

@functions
{

    private static string GetDeployTicks()
    {
        const string cacheKey = "DeployTicks";
        var returnValue = HttpRuntime.Cache[cacheKey] as string;
        if (null == returnValue)
        {
            var absolute = HostingEnvironment.MapPath("~/Web.config");
            returnValue = File.GetLastWriteTime(absolute).Ticks.ToString();
            HttpRuntime.Cache.Insert(cacheKey, returnValue, new CacheDependency(absolute));
        }
        return returnValue;
    }
}

তারপরে প্রকৃত দর্শনগুলিতে:

 @Scripts.RenderFormat(PageData["scriptFormat"], "~/Scripts/Search/javascriptFile.min.js")

3

<?php $rand_no = rand(10000000, 99999999)?> <script src="scripts/myjavascript.js?v=<?=$rand_no"></script>

এটি আমার জন্য সমস্ত ব্রাউজারে কাজ করে। এখানে আমি পিএইচপি ব্যবহার করেছি র্যান্ডম নম্বর উত্পন্ন করতে। আপনি নিজের সার্ভারের পাশের ভাষা ব্যবহার করতে পারেন use


উত্তম উত্তর, তবে এএসপি এমভিসি কিছুটা সমস্যাযুক্ত হতে পারে যদি আপনি অ্যাডামের ব্যাখ্যাটি বিবেচনা না করেন কারণ আমি চেষ্টা করেছিলাম এবং আপনি এমভিসি 5 এর সাথে কাজ করেন তবে বান্ডেল ফোল্ডারটি এটি সনাক্ত করতে পারে না তবে পরামর্শের জন্য ধন্যবাদ!
ফেডেরিকো নাভারেরেট

2

উপরের উত্তর থেকে শুরু করে আমি সিএসএস ফাইলগুলির সাথেও সহায়ককে কাজ করতে কোডটি কিছুটা সংশোধন করেছি এবং প্রতিবার আপনি যখন ফাইলগুলিতে কিছু পরিবর্তন করেন কেবল তখনই কোনও সংস্করণ যোগ করেন এবং আপনি যখন বিল্ড করেন তখনই না

public static class HtmlHelperExtensions
{
    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>");
    }

    public static MvcHtmlString IncludeVersionedCss(this HtmlHelper helper, string filename)
    {
        string version = GetVersion(helper, filename);
        return MvcHtmlString.Create("<link href='" + filename + version + "' type ='text/css' rel='stylesheet'/>");
    }

    private static string GetVersion(this HtmlHelper helper, string filename)
    {
        var context = helper.ViewContext.RequestContext.HttpContext;
        var physicalPath = context.Server.MapPath(filename);
        var version = "?v=" +
        new System.IO.FileInfo(physicalPath).LastWriteTime
        .ToString("yyyyMMddHHmmss");
        context.Cache.Add(physicalPath, version, null,
          DateTime.Now.AddMinutes(1), TimeSpan.Zero,
          CacheItemPriority.Normal, null);

        if (context.Cache[filename] == null)
        {
            context.Cache[filename] = version;
            return version;
        }
        else
        {
            if (version != context.Cache[filename].ToString())
            {
                context.Cache[filename] = version;
                return version;
            }
            return context.Cache[filename] as string;
        }
    }
}

1

নীচে প্রদর্শিত হিসাবে ফাইল পরিবর্তিত সময় পান

private static string GetLastWriteTimeForFile(string pathVal)
    {
        return System.IO.File.GetLastWriteTime(HostingEnvironment.MapPath(pathVal)).ToFileTime().ToString();
    }

এটিকে ইনপুট সহ ক্যোরিস্ট্রিং হিসাবে যুক্ত করুন

public static string AppendDateInFile(string pathVal)
    {
        var patheWithDate = new StringBuilder(pathVal);
        patheWithDate.AppendFormat("{0}x={1}",
                               pathVal.IndexOf('?') >= 0 ? '&' : '?',
                               GetLastWriteTimeForFile(pathVal));
        return patheWithDate.ToString();
    }

মার্কআপ থেকে এই কল করুন।

এমভিসি এক্সটেনশন হেল্পার অ্যাপ্রোচ

একটি এক্সটেনশন পদ্ধতি যুক্ত করুন

namespace TNS.Portal.Helpers
{
    public static class ScriptExtensions
    {
        public static HtmlString QueryStringScript<T>(this HtmlHelper<T> html, string path)
        {
            var file = html.ViewContext.HttpContext.Server.MapPath(path);
            DateTime lastModified = File.GetLastWriteTime(file);
            TagBuilder builder = new TagBuilder("script");
            builder.Attributes["src"] = path + "?modified=" + lastModified.ToString("yyyyMMddhhmmss");
            return new HtmlString(builder.ToString());
        }

       public static HtmlString QueryStringStylesheet<T>(this HtmlHelper<T> html, string path)
       {
        var file = html.ViewContext.HttpContext.Server.MapPath(path);
        DateTime lastModified = File.GetLastWriteTime(file);
        TagBuilder builder = new TagBuilder("link");
        builder.Attributes["href"] = path + "?modified=" + lastModified.ToString("yyyyMMddhhmmss");
        builder.Attributes["rel"] = "stylesheet";
        return new HtmlString(builder.ToString());
      }

    }
}

ওয়েবকনফিগে এই নেমস্পেস যুক্ত করুন

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="TNS.Portal" />
        <add namespace="TNS.Portal.Helpers" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

হিসাবে দেখুন হিসাবে এটি ব্যবহার করুন

@Html.QueryStringScript("/Scripts/NPIAjaxCalls.js")
@Html.QueryStringStylesheet("/Content/StyledRadio.css")

1

.NET ওয়েব ফর্ম বিকাশকারীদের জন্য পূর্বের পরামর্শ এবং কোড সরবরাহ করার জন্য সরলীকৃত।

এটি রিসোর্সের ফাইল পথে আপেক্ষিক ("and /") এবং পরম ইউআরএল উভয়কেই গ্রহণ করবে।

একটি স্থিতিশীল এক্সটেনশান ক্লাস ফাইল রাখুন, নিম্নলিখিত:

public static string VersionedContent(this HttpContext httpContext, string virtualFilePath)
{
    var physicalFilePath = httpContext.Server.MapPath(virtualFilePath);
    if (httpContext.Cache[physicalFilePath] == null)
    {
        httpContext.Cache[physicalFilePath] = ((Page)httpContext.CurrentHandler).ResolveUrl(virtualFilePath) + (virtualFilePath.Contains("?") ? "&" : "?") + "v=" + File.GetLastWriteTime(physicalFilePath).ToString("yyyyMMddHHmmss");
    }
    return (string)httpContext.Cache[physicalFilePath];
}

এবং তারপরে এটি আপনার মাস্টার পৃষ্ঠায় কল করুন:

<link type="text/css" rel="stylesheet" href="<%= Context.VersionedContent("~/styles/mystyle.css") %>" />
<script type="text/javascript" src="<%= Context.VersionedContent("~/scripts/myjavascript.js") %>"></script>

খুব ভাল পন্থা!
ফেডেরিকো নাভারেরেট

0

উপরের উত্তরের ভিত্তিতে আমি সিএসএস এবং জেএস ফাইলগুলির সাথে কাজ করার জন্য একটি ছোট এক্সটেনশন ক্লাস লিখেছি:

public static class TimestampedContentExtensions
{
    public static string VersionedContent(this UrlHelper helper, string contentPath)
    {
        var context = helper.RequestContext.HttpContext;

        if (context.Cache[contentPath] == null)
        {
            var physicalPath = context.Server.MapPath(contentPath);
            var version = @"v=" + new FileInfo(physicalPath).LastWriteTime.ToString(@"yyyyMMddHHmmss");

            var translatedContentPath = helper.Content(contentPath);

            var versionedContentPath =
                contentPath.Contains(@"?")
                    ? translatedContentPath + @"&" + version
                    : translatedContentPath + @"?" + version;

            context.Cache.Add(physicalPath, version, null, DateTime.Now.AddMinutes(1), TimeSpan.Zero,
                CacheItemPriority.Normal, null);

            context.Cache[contentPath] = versionedContentPath;
            return versionedContentPath;
        }
        else
        {
            return context.Cache[contentPath] as string;
        }
    }
}

পরিবর্তে যেমন কিছু লিখতে:

<link href="@Url.Content(@"~/Content/bootstrap.min.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content(@"~/Scripts/bootstrap.min.js")"></script>

আপনি এখন লিখতে পারেন:

<link href="@Url.VersionedContent(@"~/Content/bootstrap.min.css")" rel="stylesheet" type="text/css" />
<script src="@Url.VersionedContent(@"~/Scripts/bootstrap.min.js")"></script>

অর্থাত কেবল প্রতিস্থাপন Url.Contentসঙ্গে Url.VersionedContent

উত্পন্ন URL গুলি দেখতে এমন কিছু দেখায়:

<link href="/Content/bootstrap.min.css?v=20151104105858" rel="stylesheet" type="text/css" />
<script src="/Scripts/bootstrap.min.js?v=20151029213517"></script>

আপনি যদি এক্সটেনশান ক্লাস ব্যবহার করেন তবে MapPathকলটি কাজ না করার ক্ষেত্রে আপনি ত্রুটি পরিচালনা করার ক্ষেত্রে যুক্ত করতে চাইতে পারেন , যেহেতু contentPathকোনও দৈহিক ফাইল নয়।


0

প্রতিটি পৃষ্ঠা পরিবর্তন না করে আপনি যা করছেন তা করার জন্য আমি একইভাবে ব্যবহার করি। একটি পূর্বরেন্ডার ইভেন্ট যুক্ত হয়েছে মাস্টার ফাইল। এটি আমার যুক্তিকে এক জায়গায় রাখে এবং উভয় জেএস এবং সিএসএস ফাইলের জন্য প্রযোজ্য।

protected void Page_PreRender(object sender, EventArgs e)
    {
        HtmlLink link = null;
        LiteralControl script = null;


        foreach (Control c in Header.Controls)
        {
            //StyleSheet add version
            if (c is HtmlLink)
            {
                link = c as HtmlLink;


                if (link.Href.EndsWith(".css", StringComparison.InvariantCultureIgnoreCase))
                {
                    link.Href += string.Format("?v={0}", ConfigurationManager.AppSettings["agVersion"]);
                }

            }

            //Js add version
            if (c is LiteralControl)
            {
                script = c as LiteralControl;

                if (script.Text.Contains(".js"))
                {
                    var foundIndexes = new List<int>();


                    for (int i = script.Text.IndexOf(".js\""); i > -1; i = script.Text.IndexOf(".js\"", i + 1))
                    {

                        foundIndexes.Add(i);
                    }

                    for (int i = foundIndexes.Count - 1; i >= 0; i--)
                    {

                        script.Text = script.Text.Insert(foundIndexes[i] + 3, string.Format("?v={0}", ConfigurationManager.AppSettings["agVersion"]));
                    }
                }

            }

        }
    }

0

আপনি স্ক্রিপ্টস বা স্টাইলগুলির ডিফল্ট ট্যাগ ফর্ম্যাট বৈশিষ্ট্যটিকে ওভাররাইড করতে পারেন।

Scripts.DefaultTagFormat = @"<script src=""{0}?v=" + ConfigurationManager.AppSettings["pubversion"] + @"""></script>";
Styles.DefaultTagFormat = @"<link href=""{0}?v=" + ConfigurationManager.AppSettings["pubversion"] + @""" rel=""stylesheet""/>";

0

আমার এএসপি.নেট আজাক্স অ্যাপ্লিকেশনটিতে এই সমস্যাটি সমাধান করার জন্য, আমি একটি এক্সটেনশান তৈরি করেছি এবং তারপরে মাস্টার পৃষ্ঠাতে কল করেছি।

আরও তথ্যের জন্য, আপনি লিঙ্কটি মাধ্যমে যেতে পারেন ।


0

নীচের ধারণার মাধ্যমে। নেট অ্যাপ্লিকেশনটিতে সিএসএস সংস্করণ প্রয়োগের সহজ ও স্মার্ট উপায় .. ব্যাক-এন্ড কোড লেখার দরকার নেই।

<link href="<%="../../App_Themes/Base/css/main.css?v="+ DateTime.Now.ToString("yyyyMMddhhmmss") +""%>" rel="stylesheet" />

ফাইলগুলি একেবারে পরিবর্তন না হলেও, এই পৃষ্ঠায় রেন্ডার করে প্রতিটি পৃষ্ঠায় ডাউনলোড করুন।
থানাসিস আইওনানিডিস

@ থানাসিস আইওনানিডিস এটি যেখানে ফাইলগুলি নিয়মিত পরিবর্তিত হয় তা ব্যবহার করতে পারে। আরেকটি বিকল্প হ'ল ওয়েবকনফিগে অ্যাপ্লিকেশন কী যুক্ত করুন এবং ফাইলগুলির নাম ব্যবহার করুন .. তবে আপনি যখন অ্যাপ্লিকেশনটির জন্য অ্যাপ্লিকেশনটি প্রকাশ করবেন তখন আপনাকে আপডেট করতে হবে।
সন্তোষকে

-1

এইভাবে এটি করার মূল সমস্যাটি হ'ল মূলত: আপনার সিএসএস বা জেএস ফাইলগুলিতে আপনি যখনই কোনও পরিবর্তন আনবেন তখন আপনার কোডটিতে আপনার সংস্করণ নম্বরটি আপডেট করতে হবে remember

এটি করার সর্বোত্তম উপায় হ'ল আপনার প্রতিটি সিএসএস বা জেএস ফাইলের সাথে একটি গ্যারান্টিযুক্ত অনন্য প্যারামিটার সেট করা যেমন:

<script src="scripts/myjavascript.js?_=<%=DateTime.Now.Ticks%>" type="text/javascript"></script>
<link href="styles/mystyle.css?_=<%=DateTime.Now.Ticks%>" rel="stylesheet" type="text/css" />

এটি প্রতিবারই সার্ভারের থেকে ফাইলগুলি ফাইলগুলির অনুরোধ করতে বাধ্য করে, যার অর্থ এটিও হ'ল যে আপনার সাইট পৃষ্ঠা লোডের সময় পারফরম্যান্ট হবে না, যেহেতু এই ফাইলগুলি কখনই ক্যাশে হবে না এবং প্রতিবার অবিবাহিত ব্যান্ডউইথ ব্যবহার করবে।

মূলত, আপনি যদি প্রতিবার পরিবর্তন হওয়ার পরে সংস্করণ নম্বরটি আপডেট করতে মনে করতে পারেন তবে আপনি কীভাবে করছেন তা থেকে দূরে সরে যেতে পারেন।


9
এবং প্রচুর পরিমাণে ব্যান্ডউইথ ব্যবহার করে।
ড্যারেন কোপ

2
ঠিক আছে, আপনি প্রতিটি পৃষ্ঠার লোডে জেএসের একটি নতুন সংস্করণ চান না ... আপনি কেবল একবার ব্রাউজারটি নতুন সংস্করণ সন্ধান করতে চান যখনই আপনি আসলে একটি আপডেট সংস্করণ পাবেন।
কিংডাঙ্গো

বিকাশে থাকাকালীন 50KB সিএসএস ফাইলের অস্থায়ী সমাধানের জন্য এটি পুরোপুরি গ্রহণযোগ্য। +1
কলবস

-2

ASP.NET পৃষ্ঠাগুলির জন্য আমি নিম্নলিখিতগুলি ব্যবহার করছি

আগে

<script src="/Scripts/pages/common.js" type="text/javascript"></script>

পরে (বল পুনরায় লোড)

 <script src="/Scripts/pages/common.js?ver<%=DateTime.Now.Ticks.ToString()%>" type="text/javascript"></script>

ডেটটাইম.নাউ.টিক্স যুক্ত করা খুব ভাল কাজ করে।


উপরে মন্তব্যে মত - হ্যাঁ, সমস্যা ব্যান্ডউইডথ সাথে আছেন stackoverflow.com/a/2185918/59508
কিয়েভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.