Кэширование изображений в браузере из ASP.NET Handler со сложным URL не работает - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь кэшировать изображения, которые предоставляются с использованием обработчика ASP.NET того же кода, что и ниже:

Обработчик

public class ResourceHandler : IHttpHandler, IRouteHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.Cache.SetCacheability(HttpCacheability.Private);
        context.Response.Cache.SetMaxAge(new TimeSpan(1, 0, 0));

        RouteData routeData = HttpContext.Current.Request.RequestContext.RouteData;

        string name = routeData.Values["type"].ToString();
        string imagePath = "path/{type}"

        FileInfo fileInfo = new FileInfo(imagePath);

        if (fileInfo == null)
        {
            // Resource not found
            context.Response.StatusCode = 404;
            return;
        }

        string rawIfModifiedSince = context.Request.Headers.Get("If-Modified-Since");
        if (string.IsNullOrEmpty(rawIfModifiedSince))
        {
            // Set Last Modified time
            context.Response.Cache.SetLastModified(fileInfo.LastWriteTimeUtc);
        }
        else
        {
            DateTime ifModifiedSince = DateTime.Parse(rawIfModifiedSince);

            // HTTP does not provide milliseconds, so remove it from the comparison
            if (fileInfo.LastWriteTimeUtc.AddMilliseconds(
                               -fileInfo.LastWriteTimeUtc.Millisecond) == ifModifiedSince)
            {
                // The requested file has not changed
                context.Response.StatusCode = 304;
                return;
            }
        }

        using (Stream stream = fileInfo.OpenRead())
        {
            byte[] buffer = new byte[32];
            while (stream.Read(buffer, 0, 32) > 0)
            {
                context.Response.ContentType = "image/jpeg";
                context.Response.BinaryWrite(buffer);
            }
        }
    }

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return this;
    }

    public bool IsReusable
    {
        get { return true; }
    }
}

}

Маршруты

Я выяснил, что сложность маршрута заставляла браузер всегда запрашивать данные с сервера, а не из кэша.(Я пробовал много, Chrome, Firefox, Edge)

Если я регистрирую простой маршрут, все работает, как задумано:

routes.Add(new Route("image/{type}", new ResourceHandler()));

Пример:

http://localhost/image/CompanyLogo/f8d8c2cc-271c-407e-9bbb-3deae1c577da_f8d8c2cc-271c-407e-9bbb-3deae1c577da_9bc61578-6c05-4532-8dce-ed2d6e28e8fc?size=normal&d=02102018061450

Но каждый браузер отказывается получать изображение из кэша, если URL-адрес такой:

routes.Add(new Route("image/{type}/{authenticatedUserId}/{userId}/{imageid}", new ResourceHandler()));

Пример:

http://localhost/image/CompanyLogo/f8d8c2cc-271c-407e-9bbb-3deae1c577da/f8d8c2cc-271c-407e-9bbb-3deae1c577da/9bc61578-6c05-4532-8dce-ed2d6e28e8fc?size=normal&d=02102018061450

Я перепробовал все возможные заголовки в комбинации, но почему проблема с URL?Простой работает, динамический - нет.

ОБНОВЛЕНИЕ

Он работает с последней версией Firefox.

...