讓你的web程序「動」起來。

看到這裏你可能會問,asp.net程序自己就是動態網站,還要如何動?css

我這裏所謂的動起來,是指動態加載,動態更新。好吧可能你又要問了動態網站原本就是動態加載,動態更新的。asp.net的程序依附於IIS(固然不是惟一)運行的,有代碼的更新,只須要拷貝到對應的目錄下面。刷新界面就加載最新程序了。無需重啓IIS。html

可是我這裏所說的是動態加載腳本。這裏的腳本是C#的類文件(*.cs)文件動態編譯加入內存運行實例。web

可能有人要問,這個有什麼必要????編程

若是程序有修改,修改-編譯-拷貝。就是最新程序,不會影響線上程序。但是你想一想,若是是一個很小的問題呢?若是由於不一樣的需求變動,很小的代碼修改就行。那有必要編譯代碼,上傳文件嘛?服務器

又或者你如今身邊的電腦沒有編譯工具,可是須要需改程序的某些功能,在容許範圍內狀況下,你該怎麼辦?asp.net

也許你說這些都是無聊的。沒有必要,沒有使用場景~!、工具

好吧,我只能說你沒有遇到而已,你問問你身邊管理髮布程序部署程序的人,他們的難處吧,每一次小小的bug更新,都要拷貝多個文件上傳至服務器是一件多麼麻煩的事情。post

好吧。不廢話了,我來來說講爲何我要寫這篇文章,我是遇到了什麼狀況吧。測試

這段時間,我給一個公司的門戶網站改版,前臺的展現頁面要求純靜態頁面。網站

純靜態頁面也就要求在後臺更新了網站內容之後,須要發佈生成純靜態頁面放在網站目錄下用於訪問~!

我用到的技術就是,經過模板文件,生成內容頁,而後保存文件。

可是模板文件裏面包含一些內容須要在C#代碼裏面構建,而後替換模板文件內容。

C#裏面構建的HTML裏面或許標籤,或許css樣式。有問題須要更新,或是需求變動須要更新,這個都是常事。可是一旦有更新就去修改代碼,發佈,是一件很是頭疼的事情,我以前就描述過了。

在以前的文章 一步一步開發Game服務器(三)加載腳本和服務器熱更新(二)完整版 介紹過若是加載腳本文件,但是以前的測試有一個問題沒有測試過在asp.net下運行。

問題在於讀取本程序加載的引用的程序集問題。

以前查詢引用程序集,的時候查找了引用的程序集下面引用的程序集,致使在IIS加載了一些沒法加載的文件,

            var asss = AppDomain.CurrentDomain.GetAssemblies();
            foreach (var item in asss)
            {
                foreach (var item222 in item.GetModules(false))
                {
                    ddlNames.Add(item222.FullyQualifiedName);
                }
            }

須要改爲這樣以下,須要查找引用程序集下引用的程序集

            var asss = AppDomain.CurrentDomain.GetAssemblies();
            foreach (var item in asss)
            {
                if (!item.ManifestModule.IsResource() && item.ManifestModule.FullyQualifiedName.EndsWith(".dll") || item.ManifestModule.FullyQualifiedName.EndsWith(".DLL"))
                {
                    ddlNames.Add(item.ManifestModule.FullyQualifiedName);
                }
            }

 

咱們建立一個IScript文件夾建立一個 ICreateScript.cs 接口文件

namespace TestWebLoadScript.IScripts
{
    public interface ICreateScript : IBaseScript
    {

        void CreateHtml(Page page, string type);

    }
}

以前的文章裏面講述了,,就是我定義的腳本加載器,不知道你加載了那些類,因爲是腳本類不知道類名和實例,因此經過接口控制,也可看做接口編程。

 

接下來咱們建立一個 Scripts 文件夾 而後建立 PC 文件 而後下面建立 Default文件夾

建立 Indexhtml.temp 文件存放模板代碼

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>我是Default版本</title>
</head>
<body>
    <form id="form1">
    <div>
    <%string%>
    </div>
    </form>
</body>
</html>

上面的 <%string%> 是替換關鍵字

建立 CreateIndexScript.cs 文件來實現html文件的建立

namespace TestWebLoadScript.Scripts.PC.Default
{
    public class CreateIndexScript : ICreateScript
    {
        string filePath = "C:/html/PC/index.html";
        public void CreateHtml(System.Web.UI.Page page, string type)
        {
            if (type == "Default")
            {
                if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(filePath)))
                {
                    System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(filePath));
                }
                string htmlPath = page.Server.MapPath("/Scripts/PC/Default/Indexhtml.temp");
                string htmlContext = System.IO.File.ReadAllText(htmlPath);
                using (System.IO.StreamWriter sw = System.IO.File.CreateText(filePath))
                {
                    sw.Write(htmlContext.Replace("<%string%>", "我是Default " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")));
                }
            }
        }
    }
}

建立一個 index.aspx 頁面

namespace TestWebLoadScript
{
    public partial class index : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string savePath = Server.MapPath("/") + System.Configuration.ConfigurationManager.AppSettings["scriptPath"].ToString();
            Sz.Network.LoadScriptPool.LoadScriptManager.GetInstance.LoadCSharpFile(new string[] { savePath });
            var scripts = Sz.Network.LoadScriptPool.LoadScriptManager.GetInstance.GetInstances<ICreateScript>();
            string type = this.Request["type"];
            foreach (var script in scripts)
            {
                script.CreateHtml(this, type);
            }
        }
    }
}

這是咱們目前的程序需求狀況,生成index的HTML模板

這時候發佈web程序。

但是忽然需求該了,或者說是模板改變了,若是咱們的生成HTML、模板的程序是寫死了在代碼裏面的話,那麼這時候咱們確定須要更改代碼,。而後編譯。,再次發佈。根據數據生成最新模板頁面;

很麻煩是嘛。

可是咱們作成了腳本生成後,

咱們把這兩個文件複製,拷貝一次,修改一下,換成

QQ版本

固然須要修改一下腳本文件的命名空間

namespace TestWebLoadScript.Scripts.PC.QQ

生成了qq版本的靜態頁面了。

咱們把一樣的代碼在複製一份,建立Mobile版本;

再次生成,就完成了各個版本的靜態頁生成。

看到這裏不知道各位看官有什麼須要吐槽的呢????歡迎留言~!

相關文章
相關標籤/搜索