У меня возникли проблемы с преобразованием бритвы в строку внутри одной из моих задач, метод работает правильно, если он сам по себе является результатом действия, как и в другой части веб-сайта.
Ошибка всегда возникает в части кода Render (это метод GetReportMarkupAsString).
using (var sw = new StringWriter()) {
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw); //Issue here
viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
return sw.GetStringBuilder().ToString();
}
Это потому, что это часть задачи и из-за этого возникает проблема, приводящая к результату?
var saveTask = System.Threading.Tasks.Task.Run(async () => {
await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(10));
return GetIdForUploading(PortalContext, command, ctx);
}).ContinueWith(x => {
System.Runtime.Remoting.Messaging.CallContext.HostContext = ctx;
var content = GetReportMarkupAsString(x.Result);
var pdfBytes = PDFFromContent(content, null, null, Request);
/*Extra code that sends up the pdfBytes, never reached of course.*/
return JsonSuccess();
});
Несколько вещей, на которые стоит обратить внимание, причина, по которой я жду 10 секунд, поскольку это быстрый и грязный способ убедиться, что у данных, которые я хочу получить дальше по цепочке выполнения в моем ActionResult, было время длясохранить данные в моей локальной БД (используемый метод ничего не возвращает, поэтому я не уверен, смогу ли я заполнить пустоту в задаче).Передача контекста ctx
в System.Runtime.Remoting.Messaging.CallContext.HostContext
была связана с тем, что внутри Задачи текущий http-контекст становится нулевым, это плохо, так как он мне нужен для запросов LINQ.