585 lines · 30.0 KB · C#
RawDownload
//******************************************************************************************************//  WebPageController.cs - Gbtc////  Copyright © 2016, Grid Protection Alliance.  All Rights Reserved.////  Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See//  the NOTICE file distributed with this work for additional information regarding copyright ownership.//  The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this//  file except in compliance with the License. You may obtain a copy of the License at:////      http://opensource.org/licenses/MIT////  Unless agreed to in writing, the subject software distributed under the License is distributed on an//  "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the//  License for the specific language governing permissions and limitations.////  Code Modification History://  ----------------------------------------------------------------------------------------------------//  01/12/2016 - Ritchie Carroll//       Generated original version of source code.////****************************************************************************************************** using System;using System.Collections.Generic;using System.Net.Http;using System.Threading;using System.Threading.Tasks;using System.Web.Http;using System.Web.Http.Dependencies;using GSF.Data;using GSF.Web.Model; namespace GSF.Web.Hosting{    /// <summary>    /// Defines a mini-web server with Razor support using the self-hosted API controller.    /// </summary>    public class WebPageController : ApiController    {        #region [ Members ]         // Nested Types         // Web page controller dependency resolver        private sealed class WebPageControllerResolver : IDependencyResolver        {            private readonly WebServer m_webServer;            private readonly string m_defaultWebPage;            private readonly object m_model;            private readonly Type m_modelType;            private readonly AdoDataConnection m_database;             public WebPageControllerResolver(WebServer webServer, string defaultWebPage, object model, Type modelType, AdoDataConnection database)            {                m_webServer = webServer;                m_defaultWebPage = defaultWebPage;                m_model = model;                m_modelType = modelType;                m_database = database;            }             void IDisposable.Dispose()            {            }             public object GetService(Type serviceType)            {                if (serviceType == typeof(WebPageController))                    return new WebPageController(m_webServer)                    {                        DefaultWebPage = m_defaultWebPage,                        Model = m_model,                        ModelType = m_modelType,                        Database = m_database                    };                 return null;            }             public IEnumerable<object> GetServices(Type serviceType)            {                if (serviceType == typeof(WebPageController))                    return new[]                    {                        new WebPageController(m_webServer)                        {                            DefaultWebPage = m_defaultWebPage,                            Model = m_model,                            ModelType = m_modelType,                            Database = m_database                        }                    };                 return new List<object>();            }             public IDependencyScope BeginScope() => this;        }         // Fields        private readonly WebServer m_webServer;         #endregion         #region [ Constructors ]         /// <summary>        /// Creates a new <see cref="WebPageController"/> using the default configured <see cref="WebServer"/> instance.        /// </summary>        public WebPageController() : this(null)        {        }         /// <summary>        /// Creates a new <see cref="WebPageController"/> using specified <paramref name="webServer"/>.        /// </summary>        /// <param name="webServer"><see cref="WebServer"/> instance to use for controller; uses default instance if not provided.</param>        public WebPageController(WebServer webServer)        {            m_webServer = webServer ?? WebServer.Default;            DefaultWebPage = "Index.html";        }         #endregion         #region [ Properties ]         /// <summary>        /// Gets or sets default web page to use for this <see cref="WebPageController"/>.        /// </summary>        public string DefaultWebPage        {            get;            set;        }         /// <summary>        /// Gets or sets the <see cref="RazorView"/> model instance for this <see cref="WebPageController"/>, if any.        /// </summary>        public object Model        {            get;            set;        }         /// <summary>        /// Gets or sets the <see cref="RazorView"/> model <see cref="Type"/> for this <see cref="WebPageController"/>, if any.        /// </summary>        public Type ModelType        {            get;            set;        }         /// <summary>        /// Gets or sets database connection to provide to <see cref="RazorView"/> instances in this <see cref="WebPageController"/>, if any.        /// </summary>        public AdoDataConnection Database        {            get;            set;        }         /// <summary>        /// Gets the <see cref="Hosting.WebServer"/> instance used by this <see cref="WebPageController"/>.        /// </summary>        public WebServer WebServer => m_webServer;         #endregion         #region [ Methods ]         /// <summary>        /// Default page request handler.        /// </summary>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page.</returns>        [Route, HttpGet]        public Task<HttpResponseMessage> GetPage(CancellationToken cancellationToken)        {            return GetPage(DefaultWebPage, cancellationToken);        }         /// <summary>        /// Common page request handler.        /// </summary>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page.</returns>        [Route("{pageName}"), HttpGet]        public Task<HttpResponseMessage> GetPage(string pageName, CancellationToken cancellationToken)        {            return m_webServer.RenderResponse(Request, pageName, false, cancellationToken, Model, ModelType, Database);        }         /// <summary>        /// Common post request handler.        /// </summary>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page.</returns>        [Route("{pageName}"), HttpPost]        public Task<HttpResponseMessage> PostPage(string pageName, CancellationToken cancellationToken)        {            return m_webServer.RenderResponse(Request, pageName, true, cancellationToken, Model, ModelType, Database);        }         #region [ Sub-folder Handlers ]         /// <summary>        /// Sub-folder request handler - depth 1.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{pageName}"), HttpGet]        public Task<HttpResponseMessage> GetPage(string folder1, string pageName, CancellationToken cancellationToken)        {            return GetPage($"{folder1}/{pageName}", cancellationToken);        }         /// <summary>        /// // Sub-folder post handler - depth 1.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{pageName}"), HttpPost]        public Task<HttpResponseMessage> PostPage(string folder1, string pageName, CancellationToken cancellationToken)        {            return PostPage($"{folder1}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder request handler - depth 2.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{pageName}"), HttpGet]        public Task<HttpResponseMessage> GetPage(string folder1, string folder2, string pageName, CancellationToken cancellationToken)        {            return GetPage($"{folder1}/{folder2}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder post handler - depth 2.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{pageName}"), HttpPost]        public Task<HttpResponseMessage> PostPage(string folder1, string folder2, string pageName, CancellationToken cancellationToken)        {            return PostPage($"{folder1}/{folder2}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder request handler - depth 3.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="folder3">Third folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{folder3}/{pageName}"), HttpGet]        public Task<HttpResponseMessage> GetPage(string folder1, string folder2, string folder3, string pageName, CancellationToken cancellationToken)        {            return GetPage($"{folder1}/{folder2}/{folder3}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder post handler - depth 3.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="folder3">Third folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{folder3}/{pageName}"), HttpPost]        public Task<HttpResponseMessage> PostPage(string folder1, string folder2, string folder3, string pageName, CancellationToken cancellationToken)        {            return PostPage($"{folder1}/{folder2}/{folder3}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder request handler - depth 4.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="folder3">Third folder.</param>        /// <param name="folder4">Fourth folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{folder3}/{folder4}/{pageName}"), HttpGet]        public Task<HttpResponseMessage> GetPage(string folder1, string folder2, string folder3, string folder4, string pageName, CancellationToken cancellationToken)        {            return GetPage($"{folder1}/{folder2}/{folder3}/{folder4}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder post handler - depth 4.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="folder3">Third folder.</param>        /// <param name="folder4">Fourth folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{folder3}/{folder4}/{pageName}"), HttpPost]        public Task<HttpResponseMessage> PostPage(string folder1, string folder2, string folder3, string folder4, string pageName, CancellationToken cancellationToken)        {            return PostPage($"{folder1}/{folder2}/{folder3}/{folder4}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder request handler - depth 5.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="folder3">Third folder.</param>        /// <param name="folder4">Fourth folder.</param>        /// <param name="folder5">Fifth folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{pageName}"), HttpGet]        public Task<HttpResponseMessage> GetPage(string folder1, string folder2, string folder3, string folder4, string folder5, string pageName, CancellationToken cancellationToken)        {            return GetPage($"{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder post handler - depth 5.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="folder3">Third folder.</param>        /// <param name="folder4">Fourth folder.</param>        /// <param name="folder5">Fifth folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{pageName}"), HttpPost]        public Task<HttpResponseMessage> PostPage(string folder1, string folder2, string folder3, string folder4, string folder5, string pageName, CancellationToken cancellationToken)        {            return PostPage($"{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder request handler - depth 6.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="folder3">Third folder.</param>        /// <param name="folder4">Fourth folder.</param>        /// <param name="folder5">Fifth folder.</param>        /// <param name="folder6">Sixth folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{folder6}/{pageName}"), HttpGet]        public Task<HttpResponseMessage> GetPage(string folder1, string folder2, string folder3, string folder4, string folder5, string folder6, string pageName, CancellationToken cancellationToken)        {            return GetPage($"{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{folder6}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder post handler - depth 6.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="folder3">Third folder.</param>        /// <param name="folder4">Fourth folder.</param>        /// <param name="folder5">Fifth folder.</param>        /// <param name="folder6">Sixth folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{folder6}/{pageName}"), HttpPost]        public Task<HttpResponseMessage> PostPage(string folder1, string folder2, string folder3, string folder4, string folder5, string folder6, string pageName, CancellationToken cancellationToken)        {            return PostPage($"{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{folder6}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder request handler - depth 7.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="folder3">Third folder.</param>        /// <param name="folder4">Fourth folder.</param>        /// <param name="folder5">Fifth folder.</param>        /// <param name="folder6">Sixth folder.</param>        /// <param name="folder7">Seventh folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{folder6}/{folder7}/{pageName}"), HttpGet]        public Task<HttpResponseMessage> GetPage(string folder1, string folder2, string folder3, string folder4, string folder5, string folder6, string folder7, string pageName, CancellationToken cancellationToken)        {            return GetPage($"{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{folder6}/{folder7}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder post handler - depth 7.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="folder3">Third folder.</param>        /// <param name="folder4">Fourth folder.</param>        /// <param name="folder5">Fifth folder.</param>        /// <param name="folder6">Sixth folder.</param>        /// <param name="folder7">Seventh folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{folder6}/{folder7}/{pageName}"), HttpPost]        public Task<HttpResponseMessage> PostPage(string folder1, string folder2, string folder3, string folder4, string folder5, string folder6, string folder7, string pageName, CancellationToken cancellationToken)        {            return PostPage($"{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{folder6}/{folder7}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder request handler - depth 8.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="folder3">Third folder.</param>        /// <param name="folder4">Fourth folder.</param>        /// <param name="folder5">Fifth folder.</param>        /// <param name="folder6">Sixth folder.</param>        /// <param name="folder7">Seventh folder.</param>        /// <param name="folder8">Eighth folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{folder6}/{folder7}/{folder8}/{pageName}"), HttpGet]        public Task<HttpResponseMessage> GetPage(string folder1, string folder2, string folder3, string folder4, string folder5, string folder6, string folder7, string folder8, string pageName, CancellationToken cancellationToken)        {            return GetPage($"{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{folder6}/{folder7}/{folder8}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder post handler - depth 8.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="folder3">Third folder.</param>        /// <param name="folder4">Fourth folder.</param>        /// <param name="folder5">Fifth folder.</param>        /// <param name="folder6">Sixth folder.</param>        /// <param name="folder7">Seventh folder.</param>        /// <param name="folder8">Eighth folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{folder6}/{folder7}/{folder8}/{pageName}"), HttpPost]        public Task<HttpResponseMessage> PostPage(string folder1, string folder2, string folder3, string folder4, string folder5, string folder6, string folder7, string folder8, string pageName, CancellationToken cancellationToken)        {            return PostPage($"{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{folder6}/{folder7}/{folder8}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder request handler - depth 9.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>        /// <param name="folder3">Third folder.</param>        /// <param name="folder4">Fourth folder.</param>        /// <param name="folder5">Fifth folder.</param>        /// <param name="folder6">Sixth folder.</param>        /// <param name="folder7">Seventh folder.</param>        /// <param name="folder8">Eighth folder.</param>        /// <param name="folder9">Ninth folder.</param>        /// <param name="pageName">Page name to render.</param>        /// <param name="cancellationToken">Propagates notification from client that operations should be canceled.</param>        /// <returns>Rendered page result for given page and path.</returns>        [Route("{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{folder6}/{folder7}/{folder8}/{folder9}/{pageName}"), HttpGet]        public Task<HttpResponseMessage> GetPage(string folder1, string folder2, string folder3, string folder4, string folder5, string folder6, string folder7, string folder8, string folder9, string pageName, CancellationToken cancellationToken)        {            return GetPage($"{folder1}/{folder2}/{folder3}/{folder4}/{folder5}/{folder6}/{folder7}/{folder8}/{folder9}/{pageName}", cancellationToken);        }         /// <summary>        /// Sub-folder post handler - depth 9.        /// </summary>        /// <param name="folder1">First folder.</param>        /// <param name="folder2">Second folder.</param>

Lines 1–500 of 585.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t