Отключить etags без сервера

Здравствуйте, я только начал с ASP.NET MVC 4, и я стажируюсь в бизнесе, который сказал мне создать базовый интернет- магазин без сервера, а затем проверить HTML и скорость работы сайта с помощью YSlow.

Я был занят, и когда я закончил интернет-магазин, я начал использовать YSlow, чтобы применить скорость к веб-сайту, но есть одна вещь, которую я не могу исправить, и это неправильно настроенные ETags:
"Есть 5 компонентов с неверно сконфигурированными ETag"<- это мои CSS-файлы и картинки, которые я использовал. Я изучал, что такое ETag, и до сих пор точно не знаю, что они делают.

Я знаю, что в Apache вы можете отключить их, указав FileETag none, но в этом случае я не использую сервер, и я все же хотел бы отключить их, потому что они не удовлетворены результатом 99.

То, что я ищу, - это ответ на то, что именно делают ETag, и решение моей проблемы.

Спасибо

1 ответ

Решение

Согласно комментариям ниже, это упражнение, и, очевидно, ПК не будет очень производительным. Вы можете использовать httpHandler. Вот один из них, который я использую для изображений, которые помогут вам в работе (но учтите, что это не является гарантией производительности и предназначено для руководства очень загруженным сайтам).

public class ImageHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.Cache.SetCacheability(HttpCacheability.Public);
            context.Response.Cache.SetMaxAge(new TimeSpan(28, 0, 0, 0, 0));

            // Setting the last modified date to the creation data of the assembly
        Assembly thisAssembly = Assembly.GetExecutingAssembly();
        string thisPath = thisAssembly.CodeBase.Replace(@"file:///", "");
        string assemblyName = "yourAssembly";
        string assemblyPath = thisPath.Replace(thisAssembly.ManifestModule.ScopeName, assemblyName);

        var assemblyInfo = new FileInfo(assemblyPath);
        var creationDate = assemblyInfo.CreationTime;
        string eTag = GetFileETag(assemblyPath, creationDate);      
        // set cache info
        context.Response.Cache.SetCacheability(HttpCacheability.Private);
        context.Response.Cache.VaryByHeaders["If-Modified-Since"] = true;
        context.Response.Cache.VaryByHeaders["If-None-Match"] = true;
        context.Response.Cache.SetLastModified(creationDate);
        context.Response.Cache.SetETag(eTag);
if (IsFileModified(assemblyPath, creationDate, eTag, context.Request))
        {
            //context.Response.ContentType = <specify content type>;
            // Do resource processing here
            context.Response.TransmitFile(context.Request.PhysicalPath);
        }
        else
        {
            // File hasn't changed, so return HTTP 304 without retrieving the data 
            context.Response.StatusCode = 304;
            context.Response.StatusDescription = "Not Modified";

            // Explicitly set the Content-Length header so the client doesn't wait for
            //  content but keeps the connection open for other requests 
            context.Response.AddHeader("Content-Length", "0");         
        }


        context.Response.End();


        }


        public bool IsReusable
        {
            get { return false; }
        }


        /// <summary>
        /// Checks if the resource assembly has been modified based on creation date.
        /// </summary>
        /// <remarks>
        /// </remarks>
        /// <seealso cref="GetFileETag"/>
        private bool IsFileModified(string fileName, DateTime modifyDate, string eTag, HttpRequest request)
        {
            // Assume file has been modified unless we can determine otherwise 
            bool FileDateModified = true;
            DateTime ModifiedSince;
            TimeSpan ModifyDiff;
            bool ETagChanged;

            // Check If-Modified-Since request header, if it exists 
            string ifModifiedSince = request.Headers["If-Modified-Since"];
            if (!string.IsNullOrEmpty(ifModifiedSince) && ifModifiedSince.Length > 0 && DateTime.TryParse(ifModifiedSince, out ModifiedSince))
            {
                FileDateModified = false;
                if (modifyDate > ModifiedSince)
                {
                    ModifyDiff = modifyDate - ModifiedSince;
                    // Ignore time difference of up to one seconds to compensate for date encoding
                    FileDateModified = ModifyDiff > TimeSpan.FromSeconds(1);
                }
            }
            // Check the If-None-Match header, if it exists. This header is used by FireFox to validate entities based on the ETag response header 
            ETagChanged = false;
            string ifNoneMatch = request.Headers["If-None-Match"];
            if (!string.IsNullOrEmpty(ifNoneMatch) && ifNoneMatch.Length > 0)
            {
                ETagChanged = ifNoneMatch != eTag;
            }
            return ETagChanged || FileDateModified;
        }

        /// <summary>
        /// Generates a caching ETag based on file name and creation date.
        /// </summary>
        /// <remarks>
        /// </remarks>
        /// <seealso cref="GetFileETag"/>
        private string GetFileETag(string fileName, DateTime modifyDate)
        {
            string fileString;
            Encoder stringEncoder;
            int byteCount;
            Byte[] stringBytes;

            // Use file name and modify date as the unique identifier 
            fileString = fileName + modifyDate.ToString();

            // Get string bytes 
            stringEncoder = Encoding.UTF8.GetEncoder();
            byteCount = stringEncoder.GetByteCount(fileString.ToCharArray(), 0, fileString.Length, true);
            stringBytes = new Byte[byteCount];

            stringEncoder.GetBytes(fileString.ToCharArray(), 0, fileString.Length, stringBytes, 0, true);

            //{ Hash string using MD5 and return the hex-encoded hash }
            MD5 Enc = MD5CryptoServiceProvider.Create();
            return "\"" + BitConverter.ToString(Enc.ComputeHash(stringBytes)).Replace("-", string.Empty) + "\"";

        }
    }
}

а затем укажите обработчик в вашей конфигурации (также выполните в разделе httphandlers, если не используете iis7)

  <add name="pngs" verb="*" path="*.png" type="yourAssembly.HttpHandlers.ImageHandler, hcs.web" preCondition="managedHandler" />
  <add name="jpgs" verb="*" path="*.jpg" type="yourAssembly.HttpHandlers.ImageHandler, hcs.web" preCondition="managedHandler" />
  <add name="gif" verb="*" path="*.gif" type="yourAssembly.HttpHandlers.ImageHandler, hcs.web" preCondition="managedHandler" />
Другие вопросы по тегам