需求描述:

在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文件的更多相关文章

  1. Android 解析XML文件和生成XML文件

    解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...

  2. Java生成XML文件

    我们在数据库中的数据可以将其提取出来生成XML文件,方便传输.例如数据库中有Admin这张表: 我们写一个java类表示admin数据: package xmlDom.vo; import java. ...

  3. Android 使用xml序列化器生成xml文件

    在<Android 生成xml文件>一文中使用流的形式写入xml格式文件,但是存在一定的问题,那就是在短信内容中不能出现<>之类的括号,本文使用xml序列化器来解决 xml序列 ...

  4. C# 生成xml文件

    本篇文章旨在.net环境下生成xml文件,以控制台应用程序为例进行说明. 1.在vs中新建控制台应用程序CreateXml 2.CreateXmlFile:主要生成xml的函数 public void ...

  5. 使用XML序列化器生成XML文件和利用pull解析XML文件

    首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...

  6. LINQ to XML 从逗号分隔值 (CSV) 文件生成 XML 文件

    参考:http://msdn.microsoft.com/zh-cn/library/bb387090.aspx 本示例演示如何使用 语言集成查询 (LINQ) 和 LINQ to XML 从逗号分隔 ...

  7. 生成XML文件,通过实体生成XML文件

    实体 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xm ...

  8. PHP中的生成XML文件的4种方法(转)

    <?xml version="1.0" encoding="utf-8"?> <article> <item> <ti ...

  9. 使用XMl序列化器生成xml文件

    生成XML文件 创建几个虚拟的短信对象,存在list中 备份数据通常都是备份至sd卡 使用StringBuffer拼接字符串 把整个xml文件所有节点append到sb对象里 sb.append(&q ...

随机推荐

  1. Office文件上传自动生成缩略图

    来源:微信公众号CodeL 前不久产品经理提出一个X的需求,说上传office文件的时候需要将首页自动截图,用于显示文件列表的时候将文件第一页缩略图展示给用户.实现的方式有多种,这里给大家介绍一个简单 ...

  2. 关于TouchEvent里面的touches,targetTouches,changedTouches的解释

    touches:手指触摸到屏幕上引起的当前所有触摸点的集合; targetTouches:手指触摸到绑定事件的节点上的触摸点的集合; changedTouches:触摸事件时改变触摸点的集合;  以下 ...

  3. 【ASP.NET 进阶】获取MP3文件信息并显示专辑图片

    突发奇想,想弄个显示MP3文件信息和专辑图片的小Demo,个人不是大牛,遂百度之,总算搞定,现分享如下. 效果图: GIF效果图: 主要是依靠2个DLL文件:ID3.dll 和 Interop.She ...

  4. 【Android UI设计与开发】2.引导界面(二)使用ViewPager实现欢迎引导页面

    1.实现的效果 2.编码前的准备工作 ViewPager是Android3.0之后提供的新特性,所以要想让你的应用向下兼容就必须要android-support-v4.jar这个包的支持,这是一个来自 ...

  5. python中for和if else的使用

    In []: a = set('abcd') In []: b = set('ef') In []: def match(x,y): ....: for i in x: ....: for j in ...

  6. CSU 1060 Nearest Sequence

    题意:求三个序列的最长公共子序列. 思路:一开始以为只要求出前两个的LCS,然后和第三个再求一遍LCS就是答案了.但是样例就对我进行啪啪啪打脸了.实际上就跟两个序列的差不多,换成三维的就行了. 代码: ...

  7. [Unity2D]2D Mobile Joystick

    效果预览 操作步骤 1.下载素材 http://pan.bai du.com/s/1gdkQz8v 2.新建一个GUITexture(Joystick)及一个Sprite(Nyan)   3.添加背景 ...

  8. 【hibernate】<第二节>hibernate的一对多映射(基本类型)

    所需工具与前文一致! 第一部分内容:基本类型的一对多(one to many) 以部门表与员工表为例: 目录结构: hibernate.cfg.xml内容 <?xml version=" ...

  9. 查询OOP课程

    --检测有没有名称为MySchool的数据库 use master if exists (select * from sysdatabases where name='myschool') begin ...

  10. c#解决窗体假死的一种方法

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_C ...