2015-04-27 6 views
2

Я создаю метод расширения для HttpContext. Этот метод генерирует файлы PDF.HttpContext становится NULL в задачах

public static Task GeneratePdfTask(this HttpContext context, string path, int submissionId, string pdfName, Action<int, byte[]> postAction = null) 
    { 
     var local = context; 
     return Task.Factory.StartNew(() => 
     { 
      HttpContext.Current = local; 
      SessionHelper.Set(SessionKey.IsPdfRendering, true); 
      var pdfFile = new PdfGenerator().Generate(path, pdfName, submissionId); 
      if (postAction != null && pdfFile != null) 
      { 
       postAction(submissionId, pdfFile); 
      } 
     }); 
    } 

Иногда Session (HttpContext.Current) становятся NULL, и я получаю исключение. Но не знаю почему. Есть ли ограничение на создание расширений для сеанса? Может быть, есть еще одно решение, как безопасно использовать текущий сеанс?

+0

Почему 'Task.Factory.StartNew' вместо' Task.Run'? Вы работаете в .NET 4.0 или 4.5? 4.5 исправляет несколько проблем с настройкой HTTP-контекста в асинхронном ASP.NET. –

+0

@PanagiotisKanavos, .NET 4.5.1 – demo

ответ

1

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

Чтобы понять, что вы видите: HttpContext.Current зависит от текущего потока (на самом деле это контекст логического вызова). Не устанавливайте его на некоторое значение. Теперь вы захватили HttpContext.Current невинного несвязанного потока ниток. Теперь вы можете обнаружить, что различные HTTP-запросы начинают взаимодействовать. Это тяжелые и неприятные ошибки.

+0

Спасибо за ответ. Хорошо, это решение (ваш совет), но, пожалуйста, скажите мне, если отправка коллекции файлов cookie в качестве параметра является хорошей практикой? – demo

+0

Нет, потому что этот объект не является потокобезопасным. Почти ни один из объектов ASP.NET не существует. Только те, которые документированы поточно-безопасными. Извлеките необходимую информацию cookie в поток запроса и передайте ее. – usr

 Смежные вопросы

  • Нет связанных вопросов^_^