目标

使用razorengine编译cshtml页面生静态html

制作一个vs2017的插件,实现右击cshtml文件时,编译该文件.

环境

razorengine4.5 / netframework4.6 / vs2017插件项目

razorengine参考文档  https://antaris.github.io/RazorEngine/index.html

测试实现

思路很简单,右击cshtml文件后,调用razorengine引擎,执行run方法得到编译后的html.

首先在控制台程序中测试了主要方法,发现没有问题.很快就编译出html了.编写cshtml页的语法部分支持razor,可以使用layout 程序语句 加载分部页等等.但在移到插件项目后,发现各种问题.

最大的问题在于速度很慢.简直无法使用.

以下是测试cshtml页面 使用了母板页,分部页,程序代码,raw函数,ViewBag.xxx,等常用的razor能力

// 主cshtml页

@{
layout="/layout.cshtml";
  ViewBag.Title="test-razorengine";
}
<div>@Raw("<h1>test razorengine</h1>")</div>
<table>
@for(int i=0;i<;i++){
<tr><td>@i</td><td>@i</td></tr>
}
</table>
@Include("part1.cshtml")

// razorengine编译使用

var config = new TemplateServiceConfiguration();
config.CachingProvider = new DefaultCachingProvider(t => { });
config.Language = Language.CSharp;
config.AllowMissingPropertiesOnDynamic = true;
config.DisableTempFileLocking = true;
using (Engine.Razor = RazorEngineService.Create(config))
{
// 添加这个cshtml页面以及它引用的母版页和片段页
foreach (string item in alltemps.Keys)
{
service.AddTemplate(item, alltemps[item]);
}
// 编译并运行得到编译后的静态html
string html =Engine.Razor.RunCompile("index.cshtml");
File.WriteAllText("index.html", html);
}

问题

1.页面缓存

测试时发现compile方法会编译cshtml然后缓存起来,即使修改了这个cshtml文件,重新添加到模板,依然不行,还是会使用之前编译过的缓存

此时需要重新添加模板,并且再编译之.在添加cshtml模板页到引擎时,每个页面的key是固定的,所以,需要先删除这个key再添加.否则会报key重复

// 删除KEY

((DelegateTemplateManager)config.TemplateManager).RemoveDynamic(k);

// 重新添加,依然是这个KEY,可以使用文件路径做KEY.

Engine.Razor.AddTemplate(k, alltemps[key]);

// 一定要编译,否则会使用缓存,即使重新添加了模板也不行

Engine.Razor.Compile(k);

2.编译卡死问题

在控制台中测试时并没有速度问题,即使每次重新编译都会很快,using()的作用是每次使用完引擎后,就释放资源,故每次都是重新初始化引擎,重新编译模板.

即使如此,依然很快.但是将代码移入到插件后,发现编译过程挂掉了.VS一直在运行,razorengine.compile这个方法卡住了,过了十分钟才结束运行...原因不知

这个问题的解决方法是使用roslyn这个新的编译器来编译.

config.CompilerServiceFactory = new RazorEngine.Roslyn.RoslynCompilerServiceFactory();
config.CompilerServiceFactory.CreateCompilerService(Language.CSharp);

3.编译过慢

Engine.Razor.Compile(k); 这个过程最慢,需要几百毫秒,但如果这个Key的页面是编译过的(缓存了),那么很快.

编译一个cshtml页面的相关页面比如母板页或者片段页,可能并不会一起修改.所以可以在每次重新加载模板前,判断文件是否修改过.

修改过的文件才重新添加编译,否则不用编译.如此,只耗废时间在那个修改过的文件上.

通过比较文件的MD5值来决定是否重新编译

优缺点

razor是个不错的工具,不仅可以用于写html,像代码生成器之类的都可以用它.确实是C#程序员的利器.比起T4模板来,更加友好一些,嵌套模板时也很容易理解.

razorengine这个编译工具有点慢,对于不会修改的模板存只存在首次慢的问题,但对于频繁修改模板那就麻烦了,每次都要重新编译,速度不行.另外,引擎缓存问题如果处置不当容易造成巨大内存占用.

RazorEngine的更多相关文章

  1. “RazorEngine.Templating.TemplateCompilationException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理

    错误信息: "RazorEngine.Templating.TemplateCompilationException"类型的异常在 RazorEngine.NET4.0.dll 中 ...

  2. 第四篇 基于.net搭建热插拔式web框架(RazorEngine实现)

    在开头也是先给大家道个歉,由于最近准备婚事导致这篇文章耽误了许久,同时也谢谢老婆大人对我的支持. 回顾上篇文章,我们重造了一个controller,这个controller中用到了视图引擎,我们的视图 ...

  3. RazorEngine 3.3 在Mono 3.2上正常运行

    RazorEngine 是一个简化的模板引擎基于微软新的Razor 解析引擎, Razor是在 ASP.NET MVC3 和 Web Pages中引入的.RazorEngine 提供了一个外包装和额外 ...

  4. ASP.NET MVC 解析模板生成静态页一(RazorEngine)

    简述 Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项.在早期的MVC版本中默认使用的是ASPX模板引擎,Razor在语法上的确不错,用起来非常方便,简洁的语法 ...

  5. 用Razor語法寫範本-RazorEngine組件介紹【转——非常好,可以用它来代替NVelocity】

    RazorEngine 官網網址:http://razorengine.codeplex.com 在找到RazorEngine之前曾經想過其他的方案,如T4與V8 Engine載jquery.temp ...

  6. 使用RazorEngine对ASP.NET MVC的Views进行UnitTest

    有的时候我们需要对Razor最后生产的文本(HTML OR XML OR..)进行单元测试. 使用Nuget安装RazorEngine. 新建一个ASP.NET MVC项目,并且带有测试项目. 修改I ...

  7. RazorEngine 3.6.5.0

    public class Person { public string Name { get; set; } public string Code { get; set; } } var templa ...

  8. RazorEngine(未解决,留底)

    TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration { BaseTemplateType = ...

  9. DIY RazorEngine 的程序集生成方式

    最近遇到一个项目,要使用RazorEngine做模板引擎,然后完成简易的CMS功能,以减轻重复的CDRU操作,同时复用管理后台.没错,使用的正是GIT HUB上的开源项目:https://github ...

  10. RazorEngine在非MVC下的使用,以及使用自定义模板

    ---恢复内容开始--- RazorEngine模板引擎大大的帮助了我们简化字符串的拼接与方法的调用,开源之后,现在在简单的web程序,winform程序,甚至控制台程序都可以利用它来完成. 但如何在 ...

随机推荐

  1. 一对多Excel自定义函数:SVLOOKUP

    语法规则 该函数的语法规则如下: SVLOOKUP(lookup_value,table_array,col_index_num,nth_appearance,unique_value) 参数 简单说 ...

  2. 互联网安全中心(CIS)发布新版20大安全控制

    这些最佳实践最初由SANS研究所提出,名为“SANS关键控制”,是各类公司企业不可或缺的安全控制措施.通过采纳这些控制方法,公司企业可防止绝大部分的网络攻击. 有效网络防御的20条关键安全控制 对上一 ...

  3. centos7 + python 2.7 + pip + openvswitch 杂项问题

    问题1: virtual box 安装centos7 后,网口无ip, 解决方法是:配置网口上电后,默认状态为down,  修改“onboot=yes”, 修改后保存配置重启系统. 2. 安装pip的 ...

  4. 总结:BGP和静态路由并存,达到故障自动倒换的目的。

    总体结论: 在上云的场景中,客户需要本地数据中心到云上VPC,出现网络故障时做到自动倒换,保证业务不中断. 一.客户需求 1.客户有总厂.分厂.总厂是通过专线和VPN连接上云,分厂是通过专线先连接到总 ...

  5. 阿里云 API调用实践(python语言)

    1.结论:阿里云的SDK开发,其实就是远程调用API,python的代码就是一个外壳,核心是封装成一个http报文,利用json格式,进行RPC调用. 2.SDK调用API的套路如下: # -*- c ...

  6. ADB和Fastboot最新版的谷歌官方下载链接

    ADB和Fastboot for Windows https://dl.google.com/android/repository/platform-tools-latest-windows.zip ...

  7. SQLServer之事务简介

    事务定义 事务是单个的工作单元.事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序自动执行. 事务分类 自动提交事务 每条单独的语句都是一个事务. 在自动提 ...

  8. 什么是TLB?

    TLB:Translation Lookaside Buffer. 根据功能可以译为快表,直译可以翻译为旁路转换缓冲,也可以把它理解成页表缓冲.里面存放的是一些页表文件(虚拟地址到物理地址的转换表). ...

  9. oracle nvl2函数

    nvl2(v1, v2, v3) 定义:如果v1为空,返回v3: 不为空,返回v2 nvl2要求v2,v3的类型一致,不一致会发生类型转换.问题:最终返回值类型是v2的类型还是v3的类型? 看题目:n ...

  10. 删除网络中的本地连接*x等

    1.运行-regedit 打开注册表 定位到 HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Control Network {4D36E972-E325-11 ...