public void ProcessRequest(string controllerName, string actionName, Dictionary <string, object> parameters, TextWriter output) { MemoryStream bodyContent = _streamingMode ? null : new MemoryStream(); TextWriter bodyWriter = _streamingMode ? null : new StreamWriter(bodyContent); _pipelineFilter.BeginRequest(controllerName, actionName, parameters); var controller = _controllerFactory.CreateController(controllerName); InitializeController(controller); var actionRunner = _actionFinder.FindAction(controller, controllerName, actionName); ExecuteActionWithFilter(controllerName, actionName, parameters, controller, actionRunner); string layoutName = null; if (ViewLoader.HasViewStart()) { var viewStart = FindAndExecuteSharedView(SharedViewRole.ViewStart, "_ViewStart", _streamingMode ? output : bodyWriter, controller, null, null, null); layoutName = viewStart.Layout; } var view = FindAndExecuteView(controllerName, actionName, parameters, _streamingMode ? output : bodyWriter, controller, layoutName); if (view.Layout != null) { if (_streamingMode) { throw new Exception("Can't use layouts in streaming mode, set MiniMvc.Engine.StreamingMode to false"); } bodyWriter.Flush(); view.InitializeView(output, this, new RenderContext()); FindAndExecuteSharedView(SharedViewRole.Layout, view.Layout, output, null, view, bodyContent, view.Sections); } else { if (!_streamingMode) { bodyWriter.Flush(); bodyContent.Seek(0, SeekOrigin.Begin); var bodyReader = new StreamReader(bodyContent); CopyStream(bodyReader, output); } } _pipelineFilter.RequestComplete(controller, controllerName, actionName, parameters); }