public void GenerateSourceFilesHeaderGenerates2047EncodedValue()
        {
            // Arrange
            string headerKey = null, headerValue = null;
            var context = new Mock<HttpContextBase>();
            var response = new Mock<HttpResponseBase>();
            response.Setup(c => c.AddHeader(It.IsAny<string>(), It.IsAny<string>())).Callback(
                (string key, string value) =>
                {
                    headerKey = key;
                    headerValue = value;
                });
            context.Setup(c => c.Response).Returns(response.Object);
            context.Setup(c => c.Items).Returns(new Hashtable());

            var webPageContext = new WebPageContext(context.Object, page: null, model: null);
            webPageContext.SourceFiles.Add("foo");
            webPageContext.SourceFiles.Add("bar");
            webPageContext.SourceFiles.Add("λ");

            // Act
            WebPageHttpHandler.GenerateSourceFilesHeader(webPageContext);

            // Assert
            Assert.Equal(headerKey, "X-SourceFiles");
            Assert.Equal(headerValue, "=?UTF-8?B?Zm9vfGJhcnzOuw==?=");
        }
        public static string RenderWebPage(WebPage page, StartPage startPage = null, HttpRequestBase request = null)
        {
            var writer = new StringWriter();

            // Create an actual dummy HttpContext that has a request object
            var filename = "default.aspx";
            var url = "http://localhost/default.aspx";

            request = request ?? CreateTestRequest(filename, url).Object;
            var httpContext = CreateTestContext(request);

            var pageContext = new WebPageContext { HttpContext = httpContext.Object };
            page.ExecutePageHierarchy(pageContext, writer, startPage);
            return writer.ToString();
        }
        public static string Render(this WebViewPage view, HttpContextBase httpContext, object model = null)
        {
            StringWriter writer = new StringWriter();

            view.Initialize(httpContext, writer);
            view.ViewData.Model = model;
            WebPageContext webPageContext = new WebPageContext(view.ViewContext.HttpContext, null, model);

            // Using private reflection to access some internals
            // Also make sure the use the same writer used for initializing the ViewContext in the OutputStack
            // Note: ideally we would not have to do this, but WebPages is just not mockable enough :(

            // Add the writer to the output stack
            PropertyInfo       outputStackProp = typeof(WebPageContext).GetProperty("OutputStack", BindingFlags.Instance | BindingFlags.NonPublic);
            Stack <TextWriter> outputStack     = (Stack <TextWriter>)outputStackProp.GetValue(webPageContext, null);

            outputStack.Push(writer);

            // Push some section writer dictionary onto the stack. We need two, because the logic in WebPageBase.RenderBody
            // checks that as a way to make sure the layout page is not called directly
            PropertyInfo sectionWritersStackProp = typeof(WebPageContext).GetProperty("SectionWritersStack", BindingFlags.Instance | BindingFlags.NonPublic);
            Stack <Dictionary <string, SectionWriter> > sectionWritersStack = (Stack <Dictionary <string, SectionWriter> >)sectionWritersStackProp.GetValue(webPageContext, null);
            Dictionary <string, SectionWriter>          sectionWriters      = new Dictionary <string, SectionWriter>(StringComparer.OrdinalIgnoreCase);

            sectionWritersStack.Push(sectionWriters);
            sectionWritersStack.Push(sectionWriters);

            // Set the body delegate to do nothing
            PropertyInfo bodyActionProp = typeof(WebPageContext).GetProperty("BodyAction", BindingFlags.Instance | BindingFlags.NonPublic);

            bodyActionProp.SetValue(webPageContext, (Action <TextWriter>)(w => { }), null);

            // Set the page context on the view (the property is public, but the setter is internal)
            PropertyInfo pageContextProp = typeof(WebPageRenderingBase).GetProperty("PageContext", BindingFlags.Instance | BindingFlags.Public);

            pageContextProp.SetValue(view, webPageContext, BindingFlags.NonPublic, null, null, null);

            // Execute/render the view
            view.Execute();

            return(writer.ToString());
        }
Example #4
0
        public void Render(ViewContext viewContext, System.IO.TextWriter writer)
        {
            if (string.IsNullOrEmpty(template))
            {
                template = "default";
            }
            string      viewPath = "~/Views/" + template + "/" + viewContext.RouteData.GetRequiredString("controller") + "/" + viewContext.RouteData.GetRequiredString("action") + ".cshtml";
            Type        viewType = BuildManager.GetCompiledType(viewPath);
            WebViewPage page     = Activator.CreateInstance(viewType) as WebViewPage;

            page.Layout      = layout;
            page.VirtualPath = viewPath;
            page.ViewContext = viewContext;
            page.ViewData    = viewContext.ViewData;
            page.InitHelpers();
            WebPageContext       pageContext = new WebPageContext(viewContext.HttpContext, null, null);
            WebPageRenderingBase startPage   = StartPage.GetStartPage(page, "_ViewStart", new string[] { "cshtml", "vbhtml" });

            page.ExecutePageHierarchy(pageContext, writer, startPage);
        }
        private StringWriter RenderTemplate(string virtualPath, dynamic model)
        {
            var page        = WebPageBase.CreateInstanceFromVirtualPath(virtualPath);
            var httpContext = new HttpContextWrapper(HttpContext.Current);
            var pageContext = new WebPageContext(httpContext, page, model);

            var writer = new StringWriter();

            if (page is WebPage)
            {
                page.ExecutePageHierarchy(pageContext, writer);
            }
            else
            {
                var razorEngine = new RazorEngine(virtualPath, null, null);
                razorEngine.Render <dynamic>(writer, model);
            }

            return(writer);
        }
        private static string RenderTemplate(string virtualPath, dynamic model)
        {
            var page        = WebPageBase.CreateInstanceFromVirtualPath(virtualPath);
            var httpContext = new HttpContextWrapper(HttpContext.Current);
            var pageContext = new WebPageContext(httpContext, page, model);

            using (var writer = new StringWriter())
            {
                if (page is WebPage)
                {
                    page.ExecutePageHierarchy(pageContext, writer);
                }
                else
                {
                    throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "The webpage at '{0}' must inherit from System.Web.WebPages.WebPage", virtualPath));
                }

                return(writer.ToString());
            }
        }
        public void CreateNestedPageContextCopiesPropertiesFromParentPageContext()
        {
            // Arrange
            var httpContext = new Mock<HttpContextBase>();
            var pageDataDictionary = new Dictionary<object, dynamic>();
            var model = new { Hello = "World" };
            Action<TextWriter> bodyAction = writer => { };
            var sectionWritersStack = new Stack<Dictionary<string, SectionWriter>>();
            var basePageContext = new WebPageContext(httpContext.Object, null, null) { BodyAction = bodyAction, SectionWritersStack = sectionWritersStack };

            // Act
            var subPageContext = WebPageContext.CreateNestedPageContext(basePageContext, pageDataDictionary, model, isLayoutPage: false);

            // Assert
            Assert.Equal(basePageContext.HttpContext, subPageContext.HttpContext);
            Assert.Equal(basePageContext.OutputStack, subPageContext.OutputStack);
            Assert.Equal(basePageContext.Validation, subPageContext.Validation);
            Assert.Equal(pageDataDictionary, subPageContext.PageData);
            Assert.Equal(model, subPageContext.Model);
            Assert.Null(subPageContext.BodyAction);
        }
Example #8
0

        
Example #9
0
        /// <summary>
        /// Initializes a module and prepares it to handle requests.
        /// </summary>
        /// <param name="context">An <see cref="T:System.Web.HttpApplication"/> that provides access to the methods, properties, and events common to all application objects within an ASP.NET application </param>
        public void Init(HttpApplication context)
        {
            const string errorPage = "~/Views/Shared/Error.cshtml";

            // When ever an error occurs on the Http Application, we'll now handle it, here.
            context.Error += (sender, e) =>
            {
                HttpContext.Current.ClearError();

                IWebObjectFactory webObjectFactory = BuildManager.GetObjectFactory(errorPage, true);

                WebPageBase webPageBase = webObjectFactory.CreateInstance() as WebPageBase;

                if (webPageBase == null)
                {
                    throw new InvalidOperationException("Failed to create an instance of the following page: " + errorPage);
                }

                var wrapper        = new HttpContextWrapper(HttpContext.Current);
                var webPageContext = new WebPageContext(wrapper, null, null);

                webPageBase.ExecutePageHierarchy(webPageContext, HttpContext.Current.Response.Output);
            };
        }
Example #10
0
        public void CreateNestedPageContextCopiesPropertiesFromParentPageContext()
        {
            // Arrange
            var httpContext        = new Mock <HttpContextBase>();
            var pageDataDictionary = new Dictionary <object, dynamic>();
            var model = new { Hello = "World" };
            Action <TextWriter> bodyAction = writer => { };
            var sectionWritersStack        = new Stack <Dictionary <string, SectionWriter> >();
            var basePageContext            = new WebPageContext(httpContext.Object, null, null)
            {
                BodyAction = bodyAction, SectionWritersStack = sectionWritersStack
            };

            // Act
            var subPageContext = WebPageContext.CreateNestedPageContext(basePageContext, pageDataDictionary, model, isLayoutPage: false);

            // Assert
            Assert.Equal(basePageContext.HttpContext, subPageContext.HttpContext);
            Assert.Equal(basePageContext.OutputStack, subPageContext.OutputStack);
            Assert.Equal(basePageContext.Validation, subPageContext.Validation);
            Assert.Equal(pageDataDictionary, subPageContext.PageData);
            Assert.Equal(model, subPageContext.Model);
            Assert.Null(subPageContext.BodyAction);
        }
            private WebPageBase CreatePage(ViewContext viewContext, System.IO.TextWriter writer, out WebPageContext pageContext, out WebPageRenderingBase startPage)
            {
                var basePage = (WebPageBase)Activator.CreateInstance(Compiled);

                basePage.VirtualPath        = Path;
                basePage.VirtualPathFactory = new PrecompiledVirtualPathFactory(CompiledTypeLookup, basePage.VirtualPathFactory);

                pageContext = new WebPageContext(viewContext.HttpContext, basePage, null);

                startPage = RunViewStart
                    ? StartPage.GetStartPage(basePage, "_ViewStart", ViewEngine.FileExtensions)
                    : null;

                var viewPage = basePage as WebViewPage;

                if (viewPage != null)
                {
                    if (!string.IsNullOrEmpty(MasterPath))
                    {
                        LayoutSetter(viewPage, MasterPath);
                    }

                    viewPage.ViewContext = viewContext;
                    viewPage.ViewData    = viewContext.ViewData;
                    viewPage.InitHelpers();
                }

                return(basePage);
            }
Example #12
0
 private static Mock<WebPage> CreatePage(Mock<HttpContextBase> context) {
     var page = new Mock<WebPage>() { CallBase = true };
     var pageContext = new WebPageContext();
     page.Object.Context = context.Object;
     page.Object.PageContext = pageContext;
     return page;
 }
 protected override string GetETag(WebPageContext context)
 {
     return(context.Request.QueryString["key"].ToBase64(Encoding.UTF8));
 }
Example #14
0
 public abstract void Validate(WebPageContext context);
Example #15
0
 protected IWebSecurity CreateSecurity(WebPageContext context)
 {
     return(WebSecurityFactory.Create(context));
 }
Example #16
0
 // html generated from non-section html
 public void ExecutePageHierarchy(WebPageContext pageContext,
                                  TextWriter writer)
 {
     writer.Write("<div>My Body</div>");
 }
Example #17
0
 public override void Validate(WebPageContext context)
 {
     _guard.Validate(context);
 }
 /// <summary>
 /// 拥有角色
 /// </summary>
 /// <param name="roles"></param>
 /// <returns></returns>
 public bool InRole(WebPageContext context, string[] roles)
 {
     return(true);
 }
Example #19
0
 public IWebSecurity Create(WebPageContext context)
 {
     return(_security ?? WebSecurityPrincipal.Instance);
 }
Example #20
0
 public static IWebSecurity Create(WebPageContext context)
 {
     return(InjectionSecurityFactory.Instance.Create(context));
 }
Example #21
0
        private WebPageBase CreatePage(ViewContext viewContext, System.IO.TextWriter writer, out WebPageContext pageContext, out WebPageRenderingBase startPage)
        {
            var basePage = (WebPageBase)Activator.CreateInstance(_viewType);

            basePage.VirtualPath        = _virtualPath;
            basePage.VirtualPathFactory = _viewEngine.VirtualPathFactory;

            pageContext = new WebPageContext(viewContext.HttpContext, basePage, viewContext.ViewData?.Model);

            startPage = _runViewStart
                ? StartPage.GetStartPage(basePage, "_ViewStart", _viewEngine.FileExtensions)
                : null;

            var viewPage = basePage as WebViewPage;

            if (viewPage != null)
            {
                if (!string.IsNullOrEmpty(_masterPath))
                {
                    Hacks.SetOverriddenLayoutPath(viewPage, _masterPath);
                }

                viewPage.ViewContext = viewContext;
                viewPage.ViewData    = viewContext.ViewData;
                viewPage.InitHelpers();
            }

            return(basePage);
        }
 public bool InPermission(WebPageContext context, string[] permissions)
 {
     return(true);
 }
Example #23
0
    public static RazorViewExecutionResult ExecuteTemplate(WebViewPage <T> viewPage, T model, HttpContextBase httpContext)
    {
        var result = new RazorViewExecutionResult();

        // Warning: lots of mocking below

        // mock HTTP state objects
        var context = new Mock <HttpContextBase>();

        context.Setup(x => x.Items).Returns(new Dictionary <object, object>());
        var response = new Mock <HttpResponseBase>();

        response.Setup(x => x.ApplyAppPathModifier(It.IsAny <string>()))
        .Returns(new Func <string, string>(x => x));
        context.Setup(x => x.Response).Returns(response.Object);
        var request = new Mock <HttpRequestBase>();

        context.Setup(x => x.Request).Returns(request.Object);
        request.Setup(x => x.ApplicationPath).Returns("/");
        request.Setup(x => x.IsLocal).Returns(true);
        var requestRouteContext = new RequestContext(context.Object, new RouteData());
        // mock page view context
        var view = new Mock <ViewContext>();

        view.Setup(x => x.HttpContext).Returns(context.Object);
        var viewMock = new Mock <IView>();

        view.Setup(x => x.View).Returns(viewMock.Object);
        view.Setup(x => x.TempData).Returns(new TempDataDictionary());
        view.Setup(x => x.ViewData).Returns(new ViewDataDictionary <T>(model));
        var viewDataContainer = new Mock <IViewDataContainer>();

        // mock view data used by the page
        viewDataContainer.Setup(c => c.ViewData).Returns(new ViewDataDictionary <T>(model));
        // mock html helper
        var html      = new Mock <HtmlHelper <T> >(view.Object, viewDataContainer.Object);
        var urlHelper = new Mock <UrlHelper>(requestRouteContext);
        // mock viewengine (for partial views fake resolution)
        var viewEngine = new Mock <IViewEngine>();

        viewEngine.Setup(x => x.FindPartialView(
                             It.IsAny <ControllerContext>(),
                             It.IsAny <string>(),
                             It.IsAny <bool>()))
        .Returns(new ViewEngineResult(viewMock.Object, viewEngine.Object));
        using (var tw = new StringWriter())
            using (var twNull = new StringWriter()) // this writer is used to discard unnecessary results
            {
                view.Setup(x => x.Writer).Returns(tw);

                // inject mocked context
                viewPage.Context = httpContext;

                var pageContext = new WebPageContext(context: context.Object, page: null, model: null);
                viewPage.ViewContext = view.Object;
                if (model != null)
                {
                    viewPage.ViewData = new ViewDataDictionary <T>(model);
                }

                viewPage.Html = html.Object;
                viewPage.Url  = urlHelper.Object;

                // insert mocked viewEngine for fake partial views resolution
                ViewEngines.Engines.Clear();
                ViewEngines.Engines.Add(viewEngine.Object);

                // prepare view for execution, discard all generated results
                viewPage.PushContext(pageContext, twNull);
                viewPage.ExecutePageHierarchy(pageContext, twNull);
                // inject textwriter
                viewPage.OutputStack.Push(tw);
                // execute compiled page
                viewPage.Execute();

                // find all sections and render them too
                var dynMethod = pageContext.GetType().GetProperty("SectionWritersStack", BindingFlags.NonPublic | BindingFlags.Instance);
                var res       = (Stack <Dictionary <string, SectionWriter> >)dynMethod.GetValue(pageContext, null);
                foreach (var section in res.Peek())
                {
                    section.Value();
                    result.SectionNames.Add(section.Key);
                }

                result.Text = tw.ToString();
                return(result);
            }
    }
Example #24
0
 public bool InPermission(WebPageContext context, string[] permissions)
 {
     throw new ApplicationException("尚未实现WebSecurityPrincipal.InPermission");
 }
Example #25
0
        private void RendererPage(object sender, EventArgs e)
        {
            Guid templateId    = _job.Page.TemplateId;
            var  renderingInfo = _renderingInfo[templateId];

            if (renderingInfo == null)
            {
                Exception loadingException = _loadingExceptions[templateId];
                if (loadingException != null)
                {
                    throw loadingException;
                }

                Verify.ThrowInvalidOperationException("Missing template '{0}'".FormatWith(templateId));
            }

            string output;
            FunctionContextContainer functionContextContainer;

            RazorPageTemplate webPage = null;

            try
            {
                webPage = WebPageBase.CreateInstanceFromVirtualPath(renderingInfo.ControlVirtualPath) as AspNet.Razor.RazorPageTemplate;
                Verify.IsNotNull(webPage, "Razor compilation failed or base type does not inherit '{0}'",
                                 typeof(AspNet.Razor.RazorPageTemplate).FullName);

                webPage.Configure();

                functionContextContainer = PageRenderer.GetPageRenderFunctionContextContainer();

                using (Profiler.Measure("Evaluating placeholders"))
                {
                    TemplateDefinitionHelper.BindPlaceholders(webPage, _job, renderingInfo.PlaceholderProperties,
                                                              functionContextContainer);
                }

                // Executing razor code
                var httpContext = new HttpContextWrapper(HttpContext.Current);
                var startPage   = StartPage.GetStartPage(webPage, "_PageStart", new[] { "cshtml" });
                var pageContext = new WebPageContext(httpContext, webPage, startPage);
                pageContext.PageData.Add(RazorHelper.PageContext_FunctionContextContainer, functionContextContainer);

                var sb = new StringBuilder();
                using (var writer = new StringWriter(sb))
                {
                    using (Profiler.Measure("Executing Razor page template"))
                    {
                        webPage.ExecutePageHierarchy(pageContext, writer);
                    }
                }

                output = sb.ToString();
            }
            finally
            {
                if (webPage != null)
                {
                    webPage.Dispose();
                }
            }

            XDocument resultDocument = XDocument.Parse(output);

            var     controlMapper = (IXElementToControlMapper)functionContextContainer.XEmbedableMapper;
            Control control       = PageRenderer.Render(resultDocument, functionContextContainer, controlMapper, _job.Page);

            using (Profiler.Measure("ASP.NET controls: PagePreInit"))
            {
                _aspnetPage.Controls.Add(control);
            }
        }
        /// <summary>
        /// Executes the razor page.
        /// </summary>
        /// <param name="webPage">The web page.</param>
        /// <param name="setParameters">Delegate to set the parameters.</param>
        /// <param name="resultType">The type of the result.</param>
        /// <param name="functionContextContainer">The function context container</param>
        /// <returns></returns>
        public static object ExecuteRazorPage(
            WebPageBase webPage,
            Action<WebPageBase> setParameters, 
            Type resultType, 
            FunctionContextContainer functionContextContainer)
        {
            HttpContext currentContext = HttpContext.Current;

            var startPage = StartPage.GetStartPage(webPage, "_PageStart", new[] { "cshtml" });
            
            // IEnumerable<PageExecutionListener> pageExecutionListeners;
            HttpContextBase httpContext;

            if (currentContext == null)
            {
                httpContext = new NoHttpRazorContext();
                // pageExecutionListeners = new PageExecutionListener[0];
            }
            else
            {
                httpContext = new HttpContextWrapper(currentContext);
                // pageExecutionListeners = httpContext.PageInstrumentation.ExecutionListeners;
            }


            var pageContext = new WebPageContext(httpContext, webPage, startPage);

            if (functionContextContainer != null)
            {
                pageContext.PageData.Add(PageContext_FunctionContextContainer, functionContextContainer);
            }


            if (setParameters != null)
            {

                setParameters(webPage);
            }
                
            var sb = new StringBuilder();
            using (var writer = new StringWriter(sb))
            {
                //// PageExecutionContext enables "Browser Link" support
                //var pageExecutionContext = new PageExecutionContext
                //{
                //    TextWriter = writer,
                //    VirtualPath = PathUtil.Resolve(webPage.VirtualPath),
                //    StartPosition = 0,
                //    IsLiteral = true
                //};

                //pageExecutionListeners.ForEach(l => l.BeginContext(pageExecutionContext));

                webPage.ExecutePageHierarchy(pageContext, writer);

                //pageExecutionListeners.ForEach(l => l.EndContext(pageExecutionContext));
            }

            string output = sb.ToString();
            

			if (resultType == typeof(XhtmlDocument))
			{
			    if (string.IsNullOrWhiteSpace(output)) return new XhtmlDocument();

				try
                {
                    return XhtmlDocument.ParseXhtmlFragment(output);
				}
				catch (XmlException ex)
				{
				    string[] codeLines = output.Split(new [] { Environment.NewLine, "\n" }, StringSplitOptions.None);

				    XhtmlErrorFormatter.EmbedSourceCodeInformation(ex, codeLines, ex.LineNumber);

				    throw;
				}
			}

			return ValueTypeConverter.Convert(output, resultType);
        }