让你的web程序“动”起来。

看到这里你可能会问,asp.net程序本身就是动态网站,还要如何动?

我这里所谓的动起来,是指动态加载,动态更新。好吧可能你又要问了动态网站本来就是动态加载,动态更新的。asp.net的程序依附于IIS(当然不是唯一)运行的,有代码的更新,只需要拷贝到对应的目录下面。刷新界面就加载最新程序了。无需重启IIS。

但是我这里所说的是动态加载脚本。这里的脚本是C#的类文件(*.cs)文件动态编译加入内存运行实例。

可能有人要问,这个有什么必要????

如果程序有修改,修改-编译-拷贝。就是最新程序,不会影响线上程序。可是你想想,如果是一个很小的问题呢?如果因为不同的需求变更,很小的代码修改就行。那有必要编译代码,上传文件嘛?

又或者你现在身边的电脑没有编译工具,但是需要需改程序的某些功能,在允许范围内情况下,你该怎么办?

也许你说这些都是无聊的。没有必要,没有使用场景~!、

好吧,我只能说你没有遇到而已,你问问你身边管理发布程序部署程序的人,他们的难处吧,每一次小小的bug更新,都要拷贝多个文件上传至服务器是一件多么麻烦的事情。

好吧。不废话了,我来来讲讲为什么我要写这篇文章,我是遇到了什么情况吧。

这段时间,我给一个公司的门户网站改版,前台的展示页面要求纯静态页面。

纯静态页面也就要求在后台更新了网站内容以后,需要发布生成纯静态页面放在网站目录下用于访问~!

我用到的技术就是,通过模板文件,生成内容页,然后保存文件。

但是模板文件里面包含一些内容需要在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版本;

再次生成,就完成了各个版本的静态页生成。

看到这里不知道各位看官有什么需要吐槽的呢????欢迎留言~!

时间: 2024-10-05 21:26:04

让你的web程序“动”起来。的相关文章

Pycharm+Django搭建第一个Python Web程序

1.安装django 无论是Python2.x还是Python3.x版本,都可以使用pip来安装Django.在控制台使用如下命令:pip install django 如: 2.检查dgango是否安装成功 安装成功后,在ipython里面或者Pycharm的Python console控制台导入django,并查看版本信息,使用如下命令: a. import django b. django.VERSION 如: 3. 创建一个django程序 命令:django-admin  startp

java web 程序---购物车选商品,购买,付款

虚函数使用的时机 为什么虚函数不总是适用? 1. 虚函数有事会带来很大的消耗: 2. 虚函数不总是提供所需的行为: 3. 当我们不考虑继承当前类时,不必使用虚函数. 必须使用虚函数的情况: 1. 当你想删除一个表面上指向基类对象,实际却是指向派生类对象的指针,就需要虚析构函数. java web 程序---购物车选商品,购买,付款,布布扣,bubuko.com

使用MyEclipse开发第一个Web程序

MyEclipse环境配置 首先,安装一个MyEclipse,然后进行一些相关的环境配置(Window->Preferences): 比如字体.Formatter等. 也可以从Eclipse中导出配置,然后在MyEclipse中导入. 这里需要特别注意的是两个配置: 1.JSP的打开方式: 选为用编辑器打开: Window->Preferences->General->File Associations 然后在右边窗口选jsp,下面选择MyEclipse JSP Editor,在右

《Python入门》第一个Python Web程序——简单的Web服务器

上一篇讲了<Python入门>Windows 7下Python Web开发环境搭建笔记,接下来讲一下Python语言Web服务的具体实现:第一个Python Web程序--简单的Web服务器. 与其它Web后端语言不同,Python语言需要自己编写Web服务器. 如果你使用一些现有的框架的话,可以省略这一步: 如果你使用Python CGI编程的话,也可以省略这一步: 用Python建立最简单的web服务器 利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录

使用Node.js的socket.io模块开发实时web程序

首发:个人博客,更新&纠错&回复 今天的思维漫游如下:从.net的windows程序开发,摸到nodejs的桌面程序开发,又熟悉了一下nodejs,对“异步”的理解有了上上周对操作系统的学习而更能理解.然后发现了Node.js中的socket.io这个模块,又觉得跟前几天用.net做客户端的socket游戏了.技术世界,兜兜转转,相逢一笑,疑是故人. socket.io用来做实时web程序,解决之前的B/S程序只有无状态连接,特定需求还需要用长连接这种“奇技淫巧”的问题.当然,这是html

[Ruby on Rails系列]3、初试Rails:使用Rails开发第一个Web程序

本系列前两部分已经介绍了如何配置Ruby on Rails开发环境,现在终于进入正题啦! Part1.开发前的准备 本次的主要任务是开发第一个Rails程序.需要特别指出的是,本次我选用了一个(PaaS开发平台),也就是Rails教程中介绍的Cloud 9平台,该平台已经自动为我们作好了环境配置的工作:只要你有一个浏览器就可以使用该云端开发环境.非常的方便快捷!简直赞!平台网址如下:https://c9.io/ Cloud 9开发平台的实质是为每一个注册的开发者在服务器端分配一个Linux虚拟机

java web程序 登陆验证页面 4个页面人性化设置

到这里,快期末考试了,老师不讲课,我心里有苦不想说,也许没有考虑到老师的感受,让老师难堪了 但是我的行为已不再是我可以做的了.不可能了,我只是职业性的机械的做事了. 思路: 1.第一个是form表单,用户输入用户名和密码,点击登陆按钮 a.jsp 2.第二是验证页面,如果不是那个用户名和密码,则显示登陆失败或错误,点击链接重新登陆ok.jsp d.jsp 3.当用户为输入任何数据,即为空的时候,则提示用户先登录,c.jsp 第一个页面,就不写了 验证页面 ok.jsp ? 1 2 3 4 5 6

web程序快速开发

关于web程序快速开发个人见解以及经历 由于在之前公司业务的发展,需要在基于核心业务的基础上开发其他较为独立的业务系统,所以就有了这个基于Dapper,DDD概念的基础框架,由于个人基于这个框架已经经历过两个系统的开发,也因为其他项目团队需要基于这个框架进行其他系统的一些开发,所以需要对此框架有一些简单介绍和使用说明. 1.主要框架主体介绍 Dapper,DapperExtensions:Dapper框架集成. Topever.AutoMapper:对象映射扩展,这个项目其实可以集成到公共项目T

javaweb回顾第二篇tomcat和web程序部署

前言这篇主要说下关于tomcat中一些属性和web程序的简单部署,可能在实际开发有更好的部署方式,但是这也是一个基础. 1:tomcat 关于tomcat估计只要接触java的人都听过这个名字,那我们都知道Servlet运行的话需要一个运行环境,也就是我们常说的Servlet容器,那么tomcat就是一个免费开源的Servlet容器.做过.net开发的应该知道IIS,其实tomcat和IIS一样都是具有处理HTMl页面的能力,当然也能处理Servlet和jsp. 下面是一个tomcat服务器接收