视频播放实时记录日志并生成XML文件
需求描述:
在JWPlayer视频播放过程中,要求实时记录视频观看者播放、暂停的时间,并记录从暂停到下一次播放时所经过的时间。将所有记录保存为XML文件,以方便数据库的后续使用。
实现过程:
尝试1:使用JS操作文件
网上查阅资料得知JS有ActiveXObject(仅用于IE和IE内核浏览器)以及XmlHttpRequest(通用)可以操作XML文件,但实际发现JS并没有写入文件的权限,因此放弃。
尝试2:使用ASPX页面实现网页本地保存
一开始只考虑使用单个ASPX页面,在后台的.cs文件中实现存取,但是后来发现TextBox.TextChanged事件并不是实时触发,也是需要刷新页面的,另外刷新页面之后视频会重新加载,达不到实时记录的目的。因此同样放弃这种方案,考虑使用AJAX配合ASHX一般处理程序来实现。
尝试3:AJAX+ASHX直接存取
本来的构想是:前端页面通过AJAX方式访问到ASHX中的ProcessRequest()方法,通过XmlDocument类及其相关操作生成XML文件,最后通过XmlDocument.Save()方法保存在服务器上。但是实际运行的过程中发现生成的XML文件只保存了最后的一次播放/暂停的时间。通过查阅资料、上网查询以及本地调试后得知,AJAX访问后台处理过程每次都会重新构造请求,而处理请求的逻辑中又包含了创建XML文件的过程,于是新的文件就将旧的文件覆盖了。因此无法采用这种直接存取的方式,并且由于要求实时记录,所以也不能采用Session或是Cache等保存这些时间值,换句话说,不能通过前端页面的.cs文件中去记录cache。因此有了下面的最终方案。
最终方案:AJAX+Stream+ASHX间接存取
既然无法保存在内存中,那么就把它拿出来。基于这种考虑,想到了通过日志文件记录所需记录的时间值(字符串),最后再整体输出成XML文件。
序列图如下:
总结
Ajax每次请求后台处理过程时会重新创建一个HttpHandler,使得一切与该HttpHandler所关联的对象全部都被重新创建,因此做不到将所要构建的对象保存在内存中。
解决方案是:1、通过Http Session或者Cache等方式暂存数据,这种方法适用于非实时更改的,相对固定的数据。2、通过外部文件转移数据,即适用于非实时数据也适用于实时数据,缺点是如果请求的数量比较多,文件大小会快速增长,需要定期清除多余的文件,维护上要麻烦一点。
进一步要解决的问题
如何实现按用户(用户ID或观看视频的IP等信息)分别记录视频进度
视频播放实时记录日志并生成XML文件的更多相关文章
- Android 解析XML文件和生成XML文件
解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...
- Java生成XML文件
我们在数据库中的数据可以将其提取出来生成XML文件,方便传输.例如数据库中有Admin这张表: 我们写一个java类表示admin数据: package xmlDom.vo; import java. ...
- Android 使用xml序列化器生成xml文件
在<Android 生成xml文件>一文中使用流的形式写入xml格式文件,但是存在一定的问题,那就是在短信内容中不能出现<>之类的括号,本文使用xml序列化器来解决 xml序列 ...
- C# 生成xml文件
本篇文章旨在.net环境下生成xml文件,以控制台应用程序为例进行说明. 1.在vs中新建控制台应用程序CreateXml 2.CreateXmlFile:主要生成xml的函数 public void ...
- 使用XML序列化器生成XML文件和利用pull解析XML文件
首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...
- LINQ to XML 从逗号分隔值 (CSV) 文件生成 XML 文件
参考:http://msdn.microsoft.com/zh-cn/library/bb387090.aspx 本示例演示如何使用 语言集成查询 (LINQ) 和 LINQ to XML 从逗号分隔 ...
- 生成XML文件,通过实体生成XML文件
实体 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xm ...
- PHP中的生成XML文件的4种方法(转)
<?xml version="1.0" encoding="utf-8"?> <article> <item> <ti ...
- 使用XMl序列化器生成xml文件
生成XML文件 创建几个虚拟的短信对象,存在list中 备份数据通常都是备份至sd卡 使用StringBuffer拼接字符串 把整个xml文件所有节点append到sb对象里 sb.append(&q ...
随机推荐
- Linux上Eclipse项目右键菜单没有Maven
在Centos 7上安装了eclipse以后,着实很兴奋.eclipse luna版本自带maven.但是用mvn eclipse:eclipse创建的java工程,在右键菜单居然没有Maven按钮, ...
- 【温故而知新-Javascript】图片效果(图像震动效果、闪烁效果、自动切换图像)
1.当鼠标指针经过图像时图像震动效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- JS实现图片上传预览效果:方法一
<script type="text/javascript"> //处理file input加载的图片文件 $(document).ready(function(e) ...
- 第50课 C++对象模型分析(上)
1. 回归本质 (1)class是一种特殊的结构体 ①在内存中class依旧可以看作变量的集合 ②class与struct遵循相同的内存对齐规则 ③class中的成员函数与成员变量是分开存放的.即每个 ...
- jstat使用
jstat -gcutil pid 统计gc信息统计.其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间.
- 分享一例脚本发版和tomcat重启脚本
线上有个网站业务部署在tomcat上,由于频繁上线修改,需要经常启动tomcat.tomcat服务自带的bin下没有重启脚本,下面分享一例脚本发版和tomcat重启脚本: 1)现将业务代码从svn里下 ...
- Python进阶-面向对象
类的成员 类的成员可以分为三类:字段.方法.属性 一:字段: 普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同 普通字段属于对象 静态字段属于类 字段的定义和使用 ...
- 介绍Git版本控制器的使用
Git 简介 Git 是什么?大家肯定会说不就是版本控制器嘛,是的Git是目前世界上最先进的分布式版本控制系统(没有之一). 1.那什么是版本控制器呢? 举个简单的例子,比如我们用Word写文章,那你 ...
- MyEclipse无法启动调试:Cannot connect to VM
MyEclipse无法启动调试:Cannot connect to VM 问题描述:Eclipse普通的Run模式没有问题,Debug模式却启动不了.换了Eclipse,MyEclipse,JDK都不 ...
- Verilog学习笔记基本语法篇(九)········ 任务和函数
task 和 function 说明语句分别用来定义任务和函数,利用任务和函数可以把函数模块分成许多小的任务和函数便于理解和调试.任务和函数往往还是大的程序模块在不同地点多次用到的相同的程序段.输入. ...