এমভিসি 4-তে ক্যাশে স্ক্রিপ্ট বান্ডিলগুলি ফ্লাশ করতে কীভাবে বান্ডেল কালেকশনকে জোর করা যায়


85

... বা কীভাবে আমি দুশ্চিন্তা বন্ধ করতে এবং মাইক্রোসফ্ট থেকে সম্পূর্ণ অননুমোদিত APIs এর বিরুদ্ধে কোড লিখতে শিখেছি । অফিসিয়াল System.Web.Optimizationরিলিজের কোন আসল দলিল আছে ? 'কিউজ আমি নিশ্চিত যে কোনও খুঁজে পাচ্ছে না, কোনও এক্সএমএল ডক্স নেই, এবং সমস্ত ব্লগ পোস্ট আরসি এপিআই-কে উল্লেখ করে যা যথেষ্ট আলাদা। যাইহোক ..

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

তবে, বান্ডিল সংগ্রহ পরিবর্তিত হয়ে থাকলেও দৃশ্যত BundleTablesইউআরএলকে ক্যাশে করে । উদাহরণস্বরূপ, আমার নিজের কোডে যখন আমি একটি বান্ডিলটি আবার তৈরি করতে চাই তখন আমি এই জাতীয় কিছু করি:

// remove an existing bundle
BundleTable.Bundles.Remove(BundleTable.Bundles.GetBundleFor(bundleAlias));

// recreate it.
var bundle = new ScriptBundle(bundleAlias);

// dependencies is a collection of objects representing scripts, 
// this creates a new bundle from that list. 

foreach (var item in dependencies)
{
    bundle.Include(item.Path);
}

// add the new bundle to the collection

BundleTable.Bundles.Add(bundle);

// bundleAlias is the same alias used previously to create the bundle,
// like "~/mybundle1" 

var bundleUrl = BundleTable.Bundles.ResolveBundleUrl(bundleAlias);

// returns something like "/mybundle1?v=hzBkDmqVAC8R_Nme4OYZ5qoq5fLBIhAGguKa28lYLfQ1"

আমি যখনই একই উরফ দিয়ে কোনও বান্ডিল সরিয়ে ও পুনরায় তৈরি করি তখন একেবারেই কিছুই ঘটে না: আমি বান্ডেলটি সরিয়ে ও পুনরায় তৈরি করার আগে bundleUrlথেকে ফিরে ResolveBundleUrlআসাটি একই। "একই" দ্বারা আমি বোঝাতে চাইছি যে বান্ডেলের নতুন সামগ্রীগুলি প্রতিফলিত করতে সামগ্রীর হ্যাশ অপরিবর্তিত।

সম্পাদনা করুন ... আসলে এর চেয়েও খারাপ। বান্ডিল নিজেই একরকম বাইরে ক্যাসে নিয়ে যাওয়া হয় Bundlesসংগ্রহ। ব্রাউজারটিকে স্ক্রিপ্টটি ক্যাশে করা থেকে বিরত রাখতে আমি যদি কেবল নিজের নিজস্ব এলোমেলো হ্যাশ তৈরি করি তবে এএসপি.নেট পুরানো স্ক্রিপ্টটি ফিরিয়ে দেয় । সুতরাং, স্পষ্টতই, এর থেকে একটি বান্ডিল সরানো BundleTable.Bundlesআসলে কিছুই করে না।

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

সুতরাং মনে হচ্ছে কোনও স্ক্রিপ্ট পরিবেশন করা হলে এটি আসল BundleTables.Bundlesবস্তুর থেকে পৃথক হয়ে যায় । সুতরাং আপনি যদি কোনও ইউআরএল পুনরায় ব্যবহার করেন, এমনকি যদি আপনি এটি পুনরায় ব্যবহারের আগে উল্লেখযোগ্য বান্ডিলটি সরিয়ে ফেলে থাকেন তবে তা তার ক্যাশে যা আছে তার সাথে প্রতিক্রিয়া জানায় এবং Bundlesঅবজেক্ট পরিবর্তন করে ক্যাশে ফ্লাশ হয় না - তাই কেবলমাত্র নতুন আইটেম (বা বরং, আলাদা নামের নতুন আইটেমগুলি) ব্যবহৃত হবে।

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

কোন ধারণা আমি এই কিভাবে করব?

এই ResetAllপদ্ধতিটির একটি অজানা উদ্দেশ্য রয়েছে তবে এটি কেবল যাইহোক জিনিসগুলি ভেঙে দেয় তাই এটি নয়।


এখানেও একই সমস্যা। আমি মনে করি আমি আমার সমাধান করতে পেরেছি। চেষ্টা করুন এবং দেখুন যদি এটি আপনার পক্ষে কার্যকর হয়। সম্পূর্ণ একমত. System.Web.Optimization এর জন্য ডকুমেন্টেশন আবর্জনা এবং ইন্টারনেটে আপনি যে সমস্ত নমুনা সন্ধান করতে পারেন তা পুরানো।
লেফটিএক্স

4
এমএসের আস্থার প্রত্যাশা সম্পর্কে মন্তব্য কামড়ানোর সাথে একত্রে দুর্দান্ত রেফারেন্সের জন্য +1। এবং প্রশ্ন জিজ্ঞাসা করার জন্য আমি একটি উত্তর চাই।
রাইফ

উত্তর:


33

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

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

  1. আমরা অনুরোধ করা বান্ডিল url থেকে একটি উত্পন্ন কী ব্যবহার করে এএসপি.এনইটি ক্যাশের ভিতরে বান্ডিল প্রতিক্রিয়া সংরক্ষণ Context.Cache["System.Web.Optimization.Bundle:~/bundles/jquery"]করি , অর্থাৎ আমরা এই বান্ডিলটি তৈরি করতে ব্যবহৃত সমস্ত ফাইল এবং ডিরেক্টরিগুলির বিরুদ্ধেও ক্যাশে নির্ভরতা সেটআপ করি। সুতরাং অন্তর্নিহিত ফাইল বা ডিরেক্টরিগুলির কোনও পরিবর্তন হলে ক্যাশে এন্ট্রি ফ্লাশ হয়ে যাবে।

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

সুতরাং আপনার অ্যাপ্লিকেশন ডোমেনটিকে পুনর্ব্যবহার না করে আপনার বান্ডিল সংজ্ঞা সংশোধন করা এড়ান। আপনি আপনার বান্ডিলের ভিতরে প্রকৃত ফাইলগুলি সংশোধন করতে মুক্ত, যা স্বয়ংক্রিয়ভাবে সনাক্ত হওয়া উচিত এবং আপনার বান্ডিল urlগুলির জন্য নতুন হ্যাশকোড তৈরি করা উচিত।


4
আপনার প্রত্যক্ষ জ্ঞান এখানে বহন করার জন্য আপনাকে ধন্যবাদ! হ্যাঁ - আমি বান্ডিল সংগ্রহটি গতিশীলভাবে পরিবর্তন করার চেষ্টা করছি। বান্ডিলগুলি অন্য স্ক্রিপ্টে বর্ণিত নির্ভরতার একটি সেট (যা নিজেই, প্রয়োজনীয়ভাবে বান্ডেলের অংশ নয়) এর উপর ভিত্তি করে তৈরি করা হয়েছে - যার কারণে আমার এই সমস্যা হচ্ছে। যেহেতু একটি স্ক্রিপ্ট যা একটি বান্ডলে রয়েছে তা পরিবর্তনের ফলে ফ্লাশকে চাপ দেওয়া হবে, তাই এটি করা যায় - ম্যানুয়াল ফ্লাশ পদ্ধতি যুক্ত করার কোনও সম্ভাবনা আছে কি? এটি গুরুতর নয় - এটি উন্নয়নের সময় সুবিধার জন্য - তবে আমি এমন কোড তৈরি করা ঘৃণা করি যা ভুলক্রমে প্রোডে ব্যবহার করা হলে সমস্যা তৈরি করতে পারে।
জেমি ট্রেওয়ারগি

এছাড়াও আপনি ওয়েব ফার্ম ইস্যুতে বিস্তারিত বলতে পারেন? অ্যাপ্লিকেশন শুরুর পরে কোনও নতুন বান্ডেল যুক্ত করার ফলে এটি তৈরি করা সার্ভারে কেবল এটি উপলব্ধ হয়ে উঠবে - বা কেবল একটি বিদ্যমান পরিবর্তন করার চেষ্টা করছে? নির্ভরতার রানটাইম রেজোলিউশন করা দরকার বলে আমি যা করার চেষ্টা করছি এটির জন্য এটি একটি ডিলকিলার হবে bit
জেমি ট্রেওয়ারগি

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

4
ক্যাশে আপডেটটি অলস, প্রথমবার বান্ডিলটি ব্যবহার করা হয় (সাধারণত বান্ডেলের কোনও রেফারেন্স সরবরাহের মাধ্যমে), এটি ক্যাশে যুক্ত হয়। আপনি যদি অনুরোধগুলি পরিচালনা করা শুরু করার আগে আপনার ওয়েব ব্রান্ডেলগুলি সেটআপ করেন এমন সমতুল্য অ্যাপ্লিকেশন হুক থাকে তবে তা ঠিক হওয়া উচিত।
হাও কুং

4
আমি যতদূর বলতে পারি এটি কাজ করে না। এটি হ'ল, যদি আমি উপাদান ফাইল (গুলি) পরিবর্তন করি তবে সার্ভারের ক্যাশেটি এখানে বর্ণিত হিসাবে সাফ করা হয়নি। সেখানে কোনও পরিবর্তন আনতে আপনাকে জিনিসটিকে পুনরায় ব্যবহার করতে হবে। যে অফিসিয়াল ডকুমেন্টেশন আসলে সেখানে যে কেউ জানেন?
ফিলিউ

21

আমি একই সমস্যা পেয়েছি।
আমার ক্লাসে BundleConfigআমি চেষ্টা করে দেখছিলাম যে ব্যবহারের প্রভাব কী ছিল BundleTable.EnableOptimizations = true

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        BundleTable.EnableOptimizations = true;

        bundles.Add(...);
    }
}

সবকিছু ঠিকঠাক কাজ করছিল।
এক পর্যায়ে আমি কিছু ডিবাগিং করছিলাম এবং সম্পত্তিটিকে মিথ্যাতে সেট করেছিলাম।
আমি কী ঘটছে তা বোঝার জন্য সংগ্রাম করেছিলাম বলে মনে হয়েছিল যে jquery (প্রথমটি) এর বান্ডিলটি সমাধান হবে না এবং লোড হবে না ( /bundles/jquery?v=)।

কিছু শপথ নেওয়ার পরে আমি মনে করি (?!) আমি জিনিসগুলি বাছাই করতে পেরেছি। যুক্ত করার চেষ্টা করুন bundles.Clear()এবং bundles.ResetAll()নিবন্ধের শুরুতে এবং জিনিসগুলি আবার কাজ শুরু করা উচিত।

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.Clear();
        bundles.ResetAll();

        BundleTable.EnableOptimizations = false;

        bundles.Add(...);
    }
}

আমি উপলব্ধি করেছি যে আমি যখন EnableOptimizationsসম্পত্তি পরিবর্তন করি তখনই এই দুটি পদ্ধতি চালানো দরকার ।

হালনাগাদ:

আরও গভীর খনন করে আমি এটি খুঁজে পেয়েছি BundleTable.Bundles.ResolveBundleUrlএবং @Scripts.Urlবান্ডিল পথটি সমাধান করতে সমস্যা আছে বলে মনে হচ্ছে।

সরলতার জন্য আমি কয়েকটি চিত্র যুক্ত করেছি:

চিত্র 1

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

চিত্র 2

একই বান্ডিলটি শরীরে অন্তর্ভুক্ত।

চিত্র 3

@Scripts.Urlযথাযথটি @Scripts.Renderউত্পন্ন করার সময় আমাকে বান্ডিলটির "অনুকূলিত" পথ দেয় ।
একই জিনিস ঘটে BundleTable.Bundles.ResolveBundleUrl

আমি ভিজ্যুয়াল স্টুডিও 2010 + এমভিসি 4 + ফ্রেমওয়ার্ক ব্যবহার করছি। নেট 4.0।


হুম ... জিনিসটি আসলে আমি বান্ডিল টেবিলটি পরিষ্কার করতে চাই না, কারণ এতে বিভিন্ন পৃষ্ঠা থেকে প্রচুর পরিমাণে অন্যান্য রয়েছে (নির্ভরতার বিভিন্ন সেট থেকে তৈরি)। তবে যেহেতু এটি কেবলমাত্র একটি উন্নয়ন পরিবেশে কাজ করার জন্য, তাই আমি মনে করি এটির বিষয়বস্তুগুলি অনুলিপি করতে পারলাম, তারপর এটি পরিষ্কার করুন, তারপরে আবার যুক্ত করুন, যদি এটি ক্যাশে ফ্লাশ করে। ভয়ঙ্করভাবে অদক্ষ তবে এটি যদি কাজ করে তবে দেবের পক্ষে এটি যথেষ্ট ভাল।
জেমি ট্রেওয়ারগি

সম্মত হন তবে এটি আমার কাছে একমাত্র বিকল্প ছিল। সমস্যাটি কী তা বোঝার চেষ্টা করে পুরো দুপুর কাটিয়েছি।
লেফটিক্স

4
আমি শুধু চেষ্টা করেছিলাম, এখনও ক্যাশে ফ্লাশ করছি না !! আমি এটি সাফ করে দিয়েছি ResetAll, এবং EnableOptimizationsযখন আমার ক্যাশে পুনরায় সেট করার দরকার হয় তখন কিছুই শুরু না হয়ে শুরু এবং ইনলাইন উভয় ভুয়াতে সেট করার চেষ্টা করেছি । আঃ।
জেমি ট্রওয়ার্গি

এটি নিশ্চিত
হ'ল যদি বিকাশকারী

6
সুতরাং এই পদ্ধতিগুলি কী তা বোঝানোর জন্য: স্ক্রিপ্টস.আরল বান্ডিলটিবল.বান্ডলস. রিসলববান্ডলআরল এর কেবলমাত্র একটি নাম, এটি বান্ডিলবিহীন ইউআরএলগুলিও সমাধান করবে, তাই এটি একটি জেনেরিক ইউআরএল রিসলভার যা বান্ডিল সম্পর্কে জানার জন্য ঘটে। স্ক্রিপ্টস R
হাও কুং

8

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

BundleTable.Bundles.ResetAll(); //or something more specific if neccesary
var bundle = new Bundle("~/bundles/your-bundle-virtual-path");
//add your includes here or load them in from a config file

//this is where the magic happens
var context = new BundleContext(new HttpContextWrapper(HttpContext.Current), BundleTable.Bundles, bundle.Path);
bundle.UpdateCache(context, bundle.GenerateBundleResponse(context));

BundleTable.Bundles.Add(bundle);

আপনি যে কোনও সময় উপরের কোডটিতে কল করতে পারেন এবং আপনার বান্ডিলগুলি আপডেট হবে। সক্ষম-অপ্টিমাইজেশানগুলি সত্য বা মিথ্যা উভয় ক্ষেত্রেই এটি কার্যকর হয় - অন্য কথায়, এটি ডিবাগ বা লাইভ পরিস্থিতিতে সঠিক মার্কআপটি ছড়িয়ে দেবে, এর সাথে:

@Scripts.Render("~/bundles/your-bundle-virtual-path")

এখানে আরও পড়ুন যা ক্যাশে সম্পর্কে কিছুটা আলোচনা করে এবংGenerateBundleResponse
জ্যাক

4

আমি পুনর্নির্মাণ না করেও বান্ডিল আপডেট করার বিষয়ে সমস্যা নিয়েছিলাম। এখানে গুরুত্বপূর্ণ বিষয়গুলি বুঝতে হবে:

  • ফাইলের পাথ পরিবর্তন হলে বান্ডেলটি আপডেট হয় না।
  • যদি বান্ডেলের ভার্চুয়াল পাথ পরিবর্তন হয় তবে বান্ডেলটি আপডেট হবে।
  • ডিস্কের ফাইলগুলি পরিবর্তন হলে বান্ডেলটি আপডেট হয়ে যায়।

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

এখানে কোডটি আমার সাথে সমস্যার সমাধান করে শেষ হয়েছে:

    public static IHtmlString RenderStyleBundle(string bundlePath, string[] filePaths)
    {
        // Add a hash of the files onto the path to ensure that the filepaths have not changed.
        bundlePath = string.Format("{0}{1}", bundlePath, GetBundleHashForFiles(filePaths));

        var bundleIsRegistered = BundleTable
            .Bundles
            .GetRegisteredBundles()
            .Where(bundle => bundle.Path == bundlePath)
            .Any();

        if(!bundleIsRegistered)
        {
            var bundle = new StyleBundle(bundlePath);
            bundle.Include(filePaths);
            BundleTable.Bundles.Add(bundle);
        }

        return Styles.Render(bundlePath);
    }

    static string GetBundleHashForFiles(IEnumerable<string> filePaths)
    {
        // Create a unique hash for this set of files
        var aggregatedPaths = filePaths.Aggregate((pathString, next) => pathString + next);
        var Md5 = MD5.Create();
        var encodedPaths = Encoding.UTF8.GetBytes(aggregatedPaths);
        var hash = Md5.ComputeHash(encodedPaths);
        var bundlePath = hash.Aggregate(string.Empty, (hashString, next) => string.Format("{0}{1:x2}", hashString, next));
        return bundlePath;
    }

আমি বারবার ব্যবহারে Aggregateঅন্তর্নিহিত শ্লেমিয়েল পেইন্টারের অ্যালগরিদম সম্পর্কে কেউ চিন্তা না করার ঝুঁকির কারণে আমি সাধারণত স্ট্রিং কনটেনটেশন থেকে বিরত থাকার পরামর্শ দিই +। পরিবর্তে, শুধু না string.Join("", filePaths)। এমনকি এটি খুব বড় ইনপুটগুলির ক্ষেত্রেও এই সমস্যাটি থাকবে না।
এরিক

3

আপনি কি ( স্টাইলবাণ্ডল বা স্ক্রিপ্টবান্ডেল ) থেকে প্রাপ্ত , আপনার নির্মাণকারীর মধ্যে কোনও অন্তর্ভুক্তি যোগ না করে এবং পরে ওভাররাইড করার চেষ্টা করেছেন

public override IEnumerable<System.IO.FileInfo> EnumerateFiles(BundleContext context)

ডায়নামিক স্টাইল শীটগুলির জন্য আমি এটি করি এবং প্রতিটি অনুরোধের জন্য এনিউমারেট ফাইলগুলি কল হয়। এটি সম্ভবত সবচেয়ে বড় সমাধান নয় তবে এটি কার্যকর।


0

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

আমার কাছে ইতিমধ্যে কোডটি ছিল (স্টাইলশিটের অন-সেভ পদ্ধতিতে):

 BundleTable.Bundles.Add(new StyleBundle("~/bundles/styles.min.css").Include(
                           "~/css/main.css"
                        ));

এবং (অনপ্লিকেশনস্টার্ট):

BundleTable.EnableOptimizations = true;

আমি যা চেষ্টা করেছি তা বিবেচনা না করেই, "bu / বান্ডিল / স্টাইলস.মিন.সি.এস.এস" ফাইলটি পরিবর্তন হতে পারে বলে মনে হচ্ছে না। আমার পৃষ্ঠার শিরোনামে, আমি মূলত এমন স্টাইলশীটে লোড করছি:

<link rel="stylesheet" href="~/bundles/styles.min.css" />

যাইহোক, আমি এটি এটিকে পরিবর্তন করে এটি কাজে লাগিয়েছি:

@Styles.Render("~/bundles/styles.min.css")

স্টাইলস.রেন্ডার পদ্ধতিটি ফাইলের নামের শেষে একটি ক্যোয়ারী স্ট্রিংয়ের মধ্যে টানছে যা আমি অনুমান করছি যে উপরের হাও দ্বারা বর্ণিত ক্যাশে কী।

আমার জন্য, এটি হিসাবে সহজ ছিল। আশা করি এটি আমার মতো অন্য যে কেউ এই ঘন্টার পর ঘন্টা গুগল করছে এবং কেবল কয়েক বছরের পুরানো পোস্টগুলি খুঁজে পেতে সহায়তা করবে!

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