高性能页面加载技术(流水线加载)BigPipe的C#简单实现(附源码)
一,BigPipe简介
BigPipe是一个重新设计的基础动态网页服务体系。大体思路是,分解网页成叫做Pagelets的小块,然后通过Web服务器和浏览器建立管道并管理他们在不同阶段的运行。这是类似于大多数现代微处理器的流水线执行过程:多重指令管线通过不同的处理器执行单元,以达到性能的最佳。虽然BigPipe是对现有的服务网络基础过程的重新设计,但它却不需要改变现有的网络浏览器或服务器,它完全使用PHP和JavaScript来实现。(来源百度百科)
BigPipe可以简单理解为:将网页分为若干个块(pagelet),请求到达服务器后先初始化pagelet布局并Response.Write(这时用户能看到网页的大致布局),然后使用多线程并行执每个pagelet 的业务逻辑,每个pagelet线程执行完后立即Response.Write,对于用户来说,他看到的网页是一块块同时或先后呈现出来,和ajax异步加载比较类似。

二,实现思路
1, 前端实现:需要一个js接收服务端输出的HTML,并显示到对应的pagelet中,每个pagelet是一个局部视图(partialView), 代码如下:
var PageLet = PageLet || {};
PageLet = (function () {
var LoadCss = function (css) {
var c = document.createElement("link");
c.setAttribute("type", "text/css");
c.setAttribute("rel", "stylesheet");
c.setAttribute("href", css);
document.getElementsByTagName("head")[0].appendChild(c);
}
var LoadJs = function (js) {
var s = document.createElement("script");
s.setAttribute("type", "text/javascript");
s.setAttribute("src", js);
document.getElementsByTagName("head")[0].appendChild(s);
}
//PageLet对象公开InitHtml方法,在后台的输出HTML时会带上该方法。
var InitHtml = function (json) { $('#' + json.Pid).html(json.Html); LoadCss(json.Css); LoadJs(json.Js); } return { InitHtml: InitHtml } })();
2,服务端实现:先初始化页面pagelet布局并输出,然后用多线程并行执行没个pagelet里的业务,执行完后立即输出,这里需要注意的是:输出的HTML代码(partailView)需要做一个JS包裹,只有这样这段HTML代码才能在对应的pagelet显示。代码如下:
HomeController.cs
using MyBigPipe.Common;
using MyBigPipe.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc; namespace MyBigPipe.Controllers
{
public class HomeController : Controller
{
private static readonly object _sysRoot = new object(); public void Index()
{
InitHomeHtml(); Parallel.Invoke(() =>
{
//模拟操作1秒
Thread.Sleep();
//头部块
InitTop(); }, () =>
{
Thread.Sleep();
InitLeft(); }, () =>
{
Thread.Sleep();
//右边块
InitRight(); }, () =>
{
Thread.Sleep();
//底部块
InitFoot();
});
} private void InitTop()
{
ViewBag.Top = "TopTopTopTopTopTopTopTopTopTopTopTopTopTopTopTopTopTopTopTopTopTopTopTopTopTopTop"; Pagelet pagelet = new Pagelet()
{
Css = "",
Html = Helper.RenderPartialViewToString(this, "TopPartial"),
//Js = "/Scripts/BigPipeT1.js",
Js = "",
Pid = "topId"
};
lock (_sysRoot)
{
Response.Write("<script type='text/javascript'>PageLet.InitHtml(" + JsonConvert.SerializeObject(pagelet) + ");</script>");
Response.Flush();
Response.Clear();
}
} private void InitLeft()
{
ViewBag.Left = "bbbbbbbbbbbbbbbbbbbbbbb"; Pagelet pagelet = new Pagelet()
{
Css = "",
Html = Helper.RenderPartialViewToString(this, "LeftPartial"),
Js = "",
Pid = "leftId"
};
lock (_sysRoot)
{
Response.Write("<script type='text/javascript'>PageLet.InitHtml(" + JsonConvert.SerializeObject(pagelet) + ");</script>");
Response.Flush();
Response.Clear();
}
} private void InitRight()
{ Pagelet pagelet = new Pagelet()
{
Css = "",
Html = Helper.RenderPartialViewToString(this, "RightPartial"),
Js = "",
Pid = "rightId"
};
lock (_sysRoot)
{
Response.Write("<script type='text/javascript'>PageLet.InitHtml(" + JsonConvert.SerializeObject(pagelet) + ");</script>");
Response.Flush();
Response.Clear();
}
} private void InitFoot()
{
lock (_sysRoot)
{
Response.Write(
new Pagelet()
{
Css = "",
Html = Helper.RenderPartialViewToString(this, "FootPartial"),
Js = "",
Pid = "footId",
PartialViewName = "FootPartial" }.RenderHtml(this));
Response.Flush();
Response.Clear();
}
} /// <summary>
/// 初始化HTML网页框架
/// </summary>
private void InitHomeHtml()
{
var str = Helper.RenderPartialViewToString(this, "Index");
Response.Write(str);
Response.Flush();
Response.Clear();
}
}
}
三,总结
BigPipe和Ajax二者区别:对于一个分成若干个块的页面而言,如果使用Ajax的话,每一块都需要单独发送一个HTTP请求,而如果使用BigPipe的话,不管有多少块,都仅有一个HTTP请
求。所以Ajax对服务器造成的压力会是BigPipe的若干倍。
BigPipe优点:速度快,将页面分割成多个pagelet,后台代码会为每个pagelet开启线程执行代码逻辑,执行完后立即输出到前端
BigPipe缺点:不利于SEO, 对于这点可以写两份代码,一份使用bigpipe,一份不使用, 用User Agen判断访问者是用户还是搜索引擎,分别执行对应的那份代码。当然这样工作量增加了。
高性能页面加载技术(流水线加载)BigPipe的C#简单实现(附源码)的更多相关文章
- AJAX技术之网易滚动新闻的简单实现(附源码)--AJAX
1.AJAX简介: AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法 ...
- ArcGIS紧凑型切片读取与应用2-webgis动态加载紧凑型切片(附源码)
1.前言 上篇主要讲了一下紧凑型切片的的解析逻辑,这一篇主要讲一下使用openlayers动态加载紧凑型切片的web地图服务. 2.代码实现 上篇已经可以通过切片的x.y.z得对应的切片图片,现在使用 ...
- 2款不同样式的CSS3 Loading加载动画 附源码
原文:2款不同样式的CSS3 Loading加载动画 附源码 我们经常看到的Loading加载很多都是转圈圈的那种,今天我们来换一种有创意的CSS3 Loading加载动画,一种是声波形状的动画,另一 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(2)-easyui构建前端页面框架[附源码]
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(2)-easyui构建前端页面框架[附源码] 开始,我们有了一系列的解决方案,我们将动手搭建新系统吧. 用 ...
- C#中的WinFrom技术实现串口通讯助手(附源码)
C#中的WinFrom技术实现串口通讯助手(附源码) 实现的功能: 1.实现自动加载可用串口. 2.打开串口,并且使用C#状态栏显示串口的状态. 3.实现了串口的接收数据和发送数据功能. 4.串口 ...
- Vue路由实现之通过URL中的hash(#号)来实现不同页面之间的切换(图表展示、案例分析、附源码详解)
前言 本篇随笔主要写了Vue框架中路由的基本概念.路由对象属性.vue-router插件的基本使用效果展示.案例分析.原理图解.附源码地址获取. 作为自己对Vue路由进行页面跳转效果知识的总结与笔记. ...
- 超详细的php用户注册页面填写信息完整实例(附源码)
这篇文章主要介绍了一个超详细的php用户注册页面填写信息完整实例,内容包括邮箱自动匹配.密码强度验证以及防止表单重复等,小编特别喜欢这篇文章,推荐给大家. 注册页面是大多数网站必备的页面,所以很有必要 ...
- 微信小程序中如何实现分页下拉加载?(附源码)
转眼间坚持写教你微信小程序系列已经有十节系列课程了,每天的工作压力繁重,小女子也不知道自己还能坚持这样的系列教程多久.只希望每篇教程真的对大家有帮助.这节课我们要介绍的就是如何实现分页的下拉加载,我们 ...
- 【JavaScript】使用纯JS实现多张图片的懒加载(附源码)
一.效果图如下 上面的效果图,效果需求如下 1.还没加载图片的时候,默认显示加载图片背景图 2.刚开始进入页面,自动加载第一屏幕的图片 3.下拉界面,当一张图片容器完全显露出屏幕,即刻加载图片,替换背 ...
随机推荐
- 经典SQL语句大全之基本函数
SQL Server基本函数 1.字符串函数 长度与分析用 1,datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格2,substring(expression,sta ...
- Android 中 更新视图的函数ondraw() 和dispatchdraw()的区别
绘制VIew本身的内容,通过调用View.onDraw(canvas)函数实现 绘制自己的孩子通过dispatchDraw(canvas)实现 View组件的绘制会调用draw(Canvas canv ...
- TCP keepalive under Linux
TCP Keepalive HOWTO Prev Next 3. Using TCP keepalive under Linux Linux has built-in support for ke ...
- careercup-链表 2.3
2.3 实现一个算法,删除单向链表中间的某个结点,假设你只能访问该结点.(即你不知道头结点) 这个问题的关键是你只有一个指向要删除结点的指针,如果直接删除它,这条链表就断了. 但你又没办法得到该结点之 ...
- PureMVC(JS版)源码解析(十一):Model类
这篇博文讲PureMVC三个核心类——Model类.Model类的构造函数及工厂函数[即getInstance()方法]和View类.Controller类是一样的,这里就不重复讲解了,只 ...
- Java基础知识强化之IO流笔记34:OutputStreamWriter(Writer字符流的子类)5种write数据方式
1. OutputStreamWriter (转换流) OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节. 同时OutputS ...
- linux lsof nmap netstat
lsof -i :22 # 显示22端口当前运行的程序 lsof -c ssh # 显示ssh进程打开的文件 lsof -p 2120 #显示进程id2120打开的文件 nmap -sP ...
- spring参数类型异常输出,SpringMvc参数类型转换错误输出
spring参数类型异常输出, SpringMvc参数类型转换错误输出 >>>>>>>>>>>>>>>> ...
- 第二篇:web之前端之css
前端之css 前端之css 本节内容 css概述及引入 css选择器 css常用属性 1.css概述及引入 CSS概述 CSS是Cascading Style Sheets的简称,中文称为层叠样式 ...
- Android 设计随便说说之简单实践(模块划分)
上篇随笔随(Android 设计随便说说)便说了一下什么是设计以及设计的原则,这里举一个简单的例子来进一步的说Android设计.我们以应用商店的设计来举例. 在设计之前,需要把握两部分内容,才能使得 ...