Когда используется универсальный HttpHandler (ashx, интерфейс IHttpHandler)?

Я использовал Ashx вместе с jQuery. Я читал msdn, я говорю о свойстве IHttpHandler.IsReusable.

Получает значение, указывающее, может ли другой запрос использовать Экземпляр IHttpHandler.

Что они означают "the IHttpHandler instance."? Стремятся ли это сделать так, чтобы все могли видеть и использовать? Возможно ли повторное использование тем же , что? (QueryString, файлы cookie и т.д.?)

Если я пишу это:

public class MyHttpHandler : IHttpHandler
   {
      public void ProcessRequest(HttpContext context)
      {
         context.Response.Write(DateTime.Now.Ticks.ToString());      
      }

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

Кажется, что каждый запрос получит свое собственное обновленное значение - Datetime.

Ответ 1

В вашем примере вы не управляете каким-либо состоянием. Любой пользователь может вызывать ProcessRequest столько раз, сколько захочет в одном экземпляре, и они получат новое значение DateTime.

Но что если вы сделали это:

private DateTime _dateTime = DateTime.Now;

public void ProcessRequest(HttpContext context)
{
    context.Response.Write(_dateTime);
}

Теперь вы получите тот же ответ каждый раз после создания экземпляра обработчика. Если ASP.NET не генерирует новый каждый раз.

IsReusable может указывать, управляет ли ваш класс обработчиком любое состояние, которое доступно для совместного использования между отдельными запросами. Если он управляет состоянием, которое не подходит для совместного использования, то он вряд ли будет внешне идемпотентным или, возможно, даже не потокобезопасным. Вызов ProcessRequest с теми же условиями ввода может не привести к тому же выводу, потому что в вашей конкретной реализации обработчика также есть некоторые переменные уровня экземпляра, которые не могут делиться, когда он определяет выход. (И на самом деле, технически ваша текущая реализация является примером этого). В этих случаях экземпляр, вероятно, не "повторно используется", и ASP.NET должен каждый раз генерировать новый экземпляр для обеспечения предсказуемости.

Итак, для случаев, когда вы не управляете состоянием, или у вас очень простые обработчики, где состояние "очевидно" (например, пример здесь), IsResuable может показаться бессмысленным. Но если у вас есть очень сложный обработчик - возможно, тот, который поддерживает некоторое состояние, которое дорого инициализирует, но ОК для совместного использования - вы хотели бы указать ASP.NET, чтобы он повторно использовал его для повышения производительности.

Ответ 2

Извините, что просто разместил ссылку на ответ, но отличное объяснение IsReusable:

Сообщение IsReusable в блоге

По существу, включите его, если ваш код полностью потокобезопасен, оставьте его, если это не так. Ну, вот что я собираю из этого.

Ответ 3

Если у вас есть переменная экземпляра, я думаю, вы найдете ее разделенной между многочисленными вызовами, поэтому, если ваше время датирования было задано как переменная экземпляра, и вы просто вернете это в своем processrequest, я думаю, что он вернет то же самое значение, тогда как оно не будет, если isreusable = false, поскольку оно создаст новый экземпляр вашего обработчика.

Ответ 4

По-видимому, это удерживает обработчик в памяти и способно обрабатывать несколько запросов. Когда установлено значение false, он должен создать новый экземпляр обработчика для каждого входящего запроса.

public bool IsReusable
{
    get
    {
        return true;
    }
}