ASPX, который возвращает изображение - вывод с кэшем? - PullRequest
6 голосов
/ 14 апреля 2009

Привет!

Я создал веб-форму APSX, которая возвращает удаленное изображение на основе некоторых предоставленных параметров. Это можно использовать так:

<img src="/ImageGetter.aspx?param1=abc&param2=123" />

Разметка и код ImageGetter.aspx выглядят примерно так:

<%@ OutputCache Duration="100000" VaryByParam="*" Location="ServerAndClient" %>
<%@ Page Language="C#" AutoEventWireup="false" EnableSessionState="False" CodeBehind="ImageGetter.aspx.cs" Inherits="ACME.Helpers.ImageGetter" %>

Этот код вызывается в методе Page_Load ImageGetter.aspx:

byte[] data = null;
Dictionary<string, string> file_locations = GetImageLocations(param1, param2);
try
{
    data = new WebClient().DownloadData(file_locations["main"]);
}
catch (WebException wex)
{
    try
    {
        data = new WebClient().DownloadData(file_locations["backup"]);
    }
    catch (Exception e)
    {
        throw;
    }
}
Response.ContentType = "image/jpeg";
Response.OutputStream.Write(data, 0, data.Length);
Response.End();

Судя по моему тестированию, это не похоже на кеширование. Можно ли это сделать с выходным кэшированием или я должен прибегнуть к написанию собственного кэша для хранения массивов байтов в зависимости от параметров строки запроса?

Ответы [ 3 ]

10 голосов
/ 14 апреля 2009

Попробуйте отбросить Response.End (), так как это преждевременно завершит поток и предотвратит кэширование вывода.

См .: http://bytes.com/groups/net-asp/323363-cache-varybyparam-doesnt-work

Вы можете хотите рассмотреть возможность использования обработчика ASHX и использования собственного метода кэширования.

2 голосов
/ 14 апреля 2009

Используйте общий обработчик ASHX и используйте HttpRuntimeCache (объект Cache) для выполнения работы, как сказал Codebrain. Это будет быстрее и намного гибче.

0 голосов
/ 08 июня 2010

Ваша проблема может быть ошибкой в IE - она ​​не может кэшироваться, если используется заголовок ответа Vary:* HTTP, но IIS возвращает его по умолчанию, потому что это в спецификации HTTP 1.1. *

Попробуйте добавить следующее в ваш файл web.config:

<system.web> 
    <caching>
        <outputCache omitVaryStar="true" />
    </caching>
</system.web> 
...