BingBlog 鹏之徙于南冥也,水击三千里,抟扶摇而上者九万里,去以六月息者也。

Archive for the ‘ASP.NET’ Category

WediaFlvPlayer Beta1.0

04.09.2008 · Posted in ASP.NET · with No Comments

WediaFlvPlayer是使用Flash8.0开发完成的,具有如下特点:

  • 界面模仿WindowsMediaPlayer11制作完成
  • 具有光晕效果的按钮
  • 能够选择播放Flv格式的视频
  • 使用MVC开发模式完成
  • 即时跳转到视频点

下载 WediaFlvPlayer Beta1.0

群组Blog系统开发

04.03.2008 · Posted in ASP.NET · with 1 Comment

单个Blog系统开发和群组Blog系统的开发有着天壤之别,关键的关键还在于访问量,对于CSDN这样的Blog群,如何高效的运行,并具有很好扩展性和可维护性也是我们在做构架设计时考虑的重点。下面就如何在单台服务器上做到高效和高扩展性我做如下阐述:

高效:
对于应用程序,在每天上百万的访问量足以将我们少的可怜的服务器拖垮,效率成为我们关注的重点,如何有效减少和数据库的连接次数以及IO流是我们遇到的主要瓶颈。对于目前的CSDN Blog前端系统,我们将做如下优化:

  • 使用标准的XHTML,并使用优化的CSS,减少HTML生成量,并能减少相应的缓存量。将所有的CSS合并到一个CSS文件,将所有的JS文件也合并到同一个JS文件,并进行压缩,这样对客户是比较负责的处理方法。
  • 替换掉浏览器端的Calender控件,使用Javascript制作浏览器端控件,并使用Ajax获取后端数据进行动态填充,减少回发。
  • 将页面动态数据进行提取,比如主页面文章显示的评论次数,在每次加载的时候使用Ajax获取后端数据进行动态填充,这样能在一定程度上的减少们服务器端的IO流写操作。
  • 页面采用分割成控件的方式进行HTML静态化处理,并在请求链接的时候生成缓存,这能极大的提高运行程序的整体效率。
  • 尽可能的减少缓存所存的数据为复杂类,而是字符串。这样能减少对内存的占用,并减少装箱和拆箱操作,提高运行效率。
  • 直接处理Request请求,除去所有的.ascx用户控件文件和.aspx文件,然后Response.End()。这样能极大的减少我们的IO文件流读取,并在很大程度优化我们的程序,因为除去读取IO流后,我们的页面或用户控件页面将不存在,也就是不存在反序列化以及在数据绑定时涉及到的反射。反序列化和反射经过我们的测试是非常耗性能的过程。

高扩展性:
在追求效率的时候,扩展性往往并不能得到很好的发挥,甚至有时被人误认为是一对天生的矛盾。当然扩展性提升的时候,毫无疑问效率会有损失,然而好的设计能使损失降到很低的水准,却能使整个构架看上去一目了然,具有很好扩展性,并能很好的进行维护。对于目前的CSDN Blog系统,我们有如下考虑:

  • 尽量将功能单一的功能模块化。提取出来的功能可以作为一个黑匣子,处理来自各方的请求,比如Cache处理和HTML静态化处理。
  • 模块化的开发。尽量做到对于前端和后端的开发互不影响,调用各自的DLL文件。
  • 使用抽象工厂,做到可插件化开发。通过对配置文件的设置,生成应用程序运行时的实体类,通过抽象基类调用实体方法可以调用完全不同的处理方式,比如使用SQL数据库访问和Oracle数据库访问。

由于个人目前研究时间和天赋有限,现在只能有这些领悟,如有更好的想法可以交流啊,明天清明节,能回家的朋友尽量回家好好聚一聚吧!

Wedia Stock Alpha1.0

11.21.2007 · Posted in ASP.NET, Products · with No Comments

Wedia Stock
题外话:BingBlog已经进入Pro1.4版本的开发了,由于时间匆忙,完全的后台改版还没有发布,前端已经修正了几个Bug,同时再次对搜索引擎进行了优化,现在本Blog的每天访问量已经开始有了不少提升,对个人简介也做了比较多的改变,CSS更加标准化。

另外由于我决定转入金融界,已从十月二十号开始尝试学习这方面的知识,因而我将专门提出一个类别(Financial),可能会发表一些我个人对股票、基金、房地产、宏观经济、货币、汇率……方面的知识。技术层面的东西我已经没有太大的讨论欲望。可能会推荐几只股票吧(最近强烈推荐“安琪酵母(600298)”,有兴趣的人可以对这支股票进行长期关注。另外推荐的股票包括鲁泰A(000726)、横宝股份(002104)、宜华木业(600978))

Wedia Stock的由来:上个星期我决定要在这个星期进入股市,来试试自己的身手,同时也来籍此来验证一下自己近一个月的所学。首先我给自己定了一个选股计划,“首先得到从-06-04至-11-12期间所有股票的最高价格(MaxPrice)和最低价格(MinPrice),我的理论是:如果在印花税影响到底后的次段时间类如果没有大的涨幅,那么我便会觉得缺乏上升的潜力。然后比较MaxPrice / MinPrice,然后依次选择从高到低的支股。最开始我手动记录数据,然后想认为比较数据,结果记录完十条后我就觉得这几乎是件不可能完成的工作量。于是我开始想如果我有所有股票的历史数据的话,那么不就可以按自己的意愿进行任何的数据挖掘,然后选择关注的股票。实际上我这方法可行。

关于Wedia Stock:为了达到自己编程选股的目的,我找到了可以获取历史数据的网站(新浪网),然后我使用Ajax不停的Post得到所有数据,然后剪辑HTML,得到需要的数据。然后再利用Ajax引发后端程序代码,将数据插入到我的数据库。整个过程只需要操作者点击一次按钮,然后数据就会源源不断地从新浪的数据库移植到自己的数据库上。

Wedia Stock优点:一键即可完成所有的股票数据的收集,存入到本机数据库上。使用者在Wedia Stock运行期间,可以不用关心它的整个运行过程,而进行其它的任何工作。大概一到半天后,数据转移会完成,一共大概有近万条数据。

Wedia Stock缺点:Wedia Stock需要不少专业的软件知识操作,包括数据库的配置和链接。另外就是数据取出完后,进行数据挖掘不仅需要专业的数据库操作知识,还需要编写复杂的逻辑代码。Wedia Stock应该说非常适合专业软件开发人员用来做数据挖掘,选择牛股。上面推荐的几支股就是经筛选后,然后综合分析其各项技术指标和财务报表分析出来的。在三天前就分析完成了,不过很抱歉在今天才拿出来和大家分享。

Wedia Stock留给开发人员和使用人员的说明:

  • Wedia Stock是一个WebForm软件。利用Ajax获取数据后,然后将数据放到本机数据库。
  • Wedia Stock目录下具有如下几个文件:
    • WediaStock.htm:该文件是用来展示使用的,只获取数据,并不存储数据。
    • Default.aspx:该文件可以用来获取数据,并同时存储数据。使用者需要在Default.aspx.cs中配置您的数据库链接信息,比如我机器上是:@”Data Source=.\SQLEXPRESS;Initial Catalog=WediaStock;Integrated Security=True”,使用的是SQLServer2005。
    • WediaStock.sql:该文件为sql文件,可以在SQLServer2005种执行该文件,来帮您创建需要使用的表。WediaAjaxStock.js:该文件是JS文件,可发者可以通过调用最后面的两个函数“SaveHuStock()”和“SaveShenStock()”来完成沪A股、深A股的数据。

下载:Wedia Stock Alpha1.0

WediaOnlineEditor Pro1.01

09.12.2007 · Posted in ASP.NET, Products · with No Comments

WediaOnlineEditor Pro1.01相比于Pro1.0有如下改变:

  • 优化JS代码,提高运行效率
  • 纠正了插入图片后回发无法获得数据的Bug
  • 使呈现的HTML更加标准化
  • 增加了WillReplacePTagToBRTag属性,该属性决定是否将HTML中的<p>转变成<br />

Source Code Download: WediaOnlineEditor Pro1.01

WediaOnlineEdtior Pro1.0

06.28.2007 · Posted in ASP.NET, Products · with No Comments

WediaOnlineEditor

WediaImageGallery

看FCKEditor和FreeTextBox不爽,所以自己开发了WediaOnlineEditor。我是一个喜欢追求效率和标准的人。

WediaOnlieEditor是一个针对ASP.NET2.0开发的一个简洁、高效、符合XHTML标准的、具有普通编辑器常用功能的在线编辑器。方便客户编辑文字和图片的,可以作为Blog系统、论坛系统或者新闻发布系统的文章编辑控件。用户可以自定义显示工具、主题和界面设计。

该项目属于开源项目,任何人可以使用,并修改它,如果有任何商业用途,请在使用前与我联系,如发现侵权,后果自负

WediaOnlieEditor是一个针对ASP.NET2.0开发的一个简洁、高效、符合XHTML标准的、具有普通编辑器常用功能的在线编辑器。方便客户编辑文字和图片的,可以作为Blog系统、论坛系统或者新闻发布系统的文章编辑控件。

该项目属于开源项目,任何人可以使用,并修改它,如果有任何商业用途,请在使用前与我联系,如发现侵权,后果自负

WediaOnlineEditor具有如下特点:

  1. 高效。从WediaRss、WediaAjax开始,我们所开发的任何产品都是基于高效这一概念展开的,而这个WediaOnlineEditor在带给用户灵活的使用上,效率依旧值得称道。速度要比FreeTextBox和FCKEditor不知道快多少倍。
  2. 合乎XHTML标准。WediaOnlineEditor生成的代码是合乎标准的XHTML代码,完全使用CSS布局和设计完成。
  3. 灵活可控制的界面。WediaOnlineEditor通过XML来控制工具栏的显示,并且全部通过CSS完成布局,用户可以完全按照自己的想法来自定义界面和工具显示。
  4. 内置WediaImageGallery。WediaImageGallery是一个图片管理器,允许用户上传并管理图片,还能创建和删除文件夹。

WediaOnlineEditor给使用者的说明:

  • public String ClientFilePath : 该属性是提供WediaOnlineEditor的支持文件路径,可以是相对路径或“~”路径。默认值:WediaClientFile,不可邦定。
  • public Boolean WillShowViewSource : 该属性决定是否显示右上角的那个“ViewSouce”(察看源码)。默认值:false,不可邦定。
  • public Boolean WillDectectPaste : 该属性决定是否侦查“Ctrl+V” 粘贴功能。如果设置为true,表示如果客户按下“Ctrl+V”键,那么WediaOnlineEditor将自动将其内部内容中的所有HTML标签全部去掉,该功能可以防止影响整体网站布局和主题的HTML的嵌入。默认值:flase,不可邦定。
  • public String TextViewSource : 该属性决定右上方“ViewSource”(察看源码)功能显示的文字。默认值:“ViewSource”,不可邦定。
  • public String TextDesign : 该属性决定右上方“Design”(回到可视编辑器)功能中显示的文字。默认值:“Design”,不可邦定。
  • public String Text : WediaOnlineEditor中的HTML字符串。默认值:null,可邦定。

WediaImageGallery给使用者的说明:

  • public String ClientFilePath : 该属性是提供WediaOnlineEditor的支持文件路径,可以是相对路径或“~”路径。默认值:WediaClientFile,不可邦定。
  • public String ImagesRootPath : 要管理的图片的根目录。默认值:null,如果该值为空,则会报错。
  • public Boolean AllDeleteImage : 是否允许客户删除图片。默认值:false。
  • public Boolean AllDeleteFolder : 是否允许客户删除文件夹。默认值:false。
  • public Boolean AllCreateImage : 是否允许客户上传图片。默认值:false。
  • public Boolean AllCreateFolder : 是否允许客户创建文件夹。默认值:false。

客户支持文件给使用者的说明:

  • WediaOnlineEditor支持文件夹下的文件适用说明:
  • CSS文件夹:该文件夹包含两个CSS文件,分别针对WediaOnlineEditor和WediaImageGallery两个控件的CSS文件。开发者可以通过修改该CSS文件来控制页面的布局和显示。
  • Data文件夹:该文件包括三个XML文件,它们决定了WediaOnlineEditor上显示的工具条、图片地址和ToolTip。使用这可以非常方便的对该软件进行扩充。
    • ToolItem.xml :该文件决定了控件显示项。
      • id : 控件的ID
      • title: 控件的ToolTip
      • commandName : 控件对应的JS命令的名称。
      • dataSource : 控件对应的Image源或XML源。FontColor和FontSize属于XML源,而Bold,Italic等属于Image源。
      • type : 控件对应的具体形式。FontColor和FontSize属于DropDownList,而Bold,Italic等属于Image。
    • FontColor.xml : 该文件决定了FontColor的下拉列表的显示。
      • value : 该颜色的RGB值。
      • text : 该颜色的文本显示。
    • FontSize.xml : 该文件决定了FontSize下拉列表的显示。
      • value : 该字体大小的值。
      • text : 该字体大小的文本。
  • Images文件夹 : 存放所有的图片。
  • JS文件夹: 存放所有Javascript的文件。
  • Faces.aspx : 作为插入表情的页面。
  • ImageGallery.aspx : 作为图片管理器的页面。

Demo及源代码下载:WediaOnlineEdtior.rar

关于ExecuteReader()获得参数值和返回值的方法

06.26.2007 · Posted in ASP.NET · with No Comments

在ADO.NET里面,我往往是通过ExecuteReader()得到SqlDataReader,然后再将其邦定到Reapter控件中,这样以最高效率读取数据,并高效邦定数据。在最开始使用SQL2005进行开发时,就遇到过这样一个问题:在邦定控件前需要读出数据总量,而使用SqlDataCommand的ExecuteReader方法并没有获得参数值和返回值得方法。具体代码可以参考如下:

假如我们现在有张表Article,里面有id和title两个字段,共条数据。我们的存储过程名称是LoadArticles,代码如下:

CREATE PROC LoadArticles @totalArticles int output
AS
SET NOCOUNT ON;
BEGIN
    SELECT @totalArticles = COUNT(id) FROM Article
    SELECT id, title FROM Article
END

我们现在来执行以下ADO.NET程序:

SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=Blog");
conn.Open();
SqlCommand command = new SqlCommand("LoadArticles", conn);
command.CommandType = CommandType.StoredProcedure;

command.Parameters.Add(new SqlParameter("@totalArticles", SqlDbType.Int));
command.Parameters["@totalArticles"].Direction = ParameterDirection.Output;

SqlDataReader reader = command.ExecuteReader();

Console.WriteLine(command.Parameters["@totalArticles"].Value); // Output: 0;

return reader;

如果是新手,那么一定会对这段代码没什么感觉,因为一般人估计都没有用过这段代码,甚至根本没有考虑过这个事情。但是什么时候我们最需要它呢?分页!那么普通的开发人估计还是没有想过,因为一般情况下人们都酷爱使用GridView。而GridView恰恰是使用之大忌,虽然使用方便,但是对性能的损伤也是大的可以。同时大部分都是使用的DataSet,而不是SqlDataReader,因而上述情况也不会发生。那么对于追求高效的人来说,Repeater是经典也是首选控件,SqlDataReader也将是首选数据源,那么如果有很多数据的时候,为了能够分页,那么唯一必要的数据就是数据总量,才有可能遇到上述问题。有人说我可以另外来个存储过程,得到相应的数据总量就可以了,对的,但是这样会对设计模式有些影响,并且代码也会变得更多。好的做法还是将其放到一个存储过程里面。

那么上面的代码为什么会输出为零呢?错不在代码本身,而在没有很好的把握SqlDataReader,在没有释放SqlDataReader之前,是不能获得参数值的,因为SqlDataReader中的数据是在随邦定过程中读取的。下面我们换段代码看看:

SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=Blog");
conn.Open();
SqlCommand command = new SqlCommand("LoadArticles", conn);
command.CommandType = CommandType.StoredProcedure;

command.Parameters.Add(new SqlParameter("@totalArticles", SqlDbType.Int));
command.Parameters["@totalArticles"].Direction = ParameterDirection.Output;

SqlDataReader reader = command.ExecuteReader();
reader.Dispose();

Console.WriteLine(command.Parameters["@totalArticles"].Value); // Output: 10;

return reader;

哦,这段代码正确,验证了我上面说的理论。但是事实上,我们在设计软件的时候,遇到的问题是在还没有进行数据邦定前,数据是不能销毁的,同时为顾及设计模式的问题,我们又该如何是好?首先更改我们的存储过程

ALTER PROC LoadArticles
AS
SET NOCOUNT ON;
BEGIN
    SELECT COUNT(id) FROM Article
    SELECT id, title FROM Article
END

然后更改我们的数据访问代码:

SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=Blog");
conn.Open();
SqlCommand command = new SqlCommand("LoadArticles", conn);
command.CommandType = CommandType.StoredProcedure;

SqlDataReader reader = command.ExecuteReader();
if(reader.Read())
    Console.WriteLine(reader.GetInt32(0)); // Output: 10;

reader.NextResult();
return reader;

呵呵,怎么样?我们就数据总量当作一条数据选择,在SqlDataReader中读取出来,然后将数据集移向下一个数据集,以此来达到既得到数据总量,又能在进行数据邦定之后再对SqlDataReader进行销毁,重要的是可以不必改变设计模式上的变动。

WediaAjax Pro1.0

05.07.2007 · Posted in Ajax, ASP.NET, Products · with No Comments

关于WediaAjax

WediaAjax是一个专门针对ASP.NET2.0的一个小型Ajax 框架,其目的是在尽量不改变传统开发模式的基础上,提供一种灵活、快捷、高效的桌面应用开发,避免不必要的资源浪费。其最终运行在客户端的JS代码不到14K,服务器端代码约10000行。其有以下特点:

  • 高效。WediaAjax其最初的设计目标就是提供一个访问高效、开发便捷、资源低损耗的Ajax框架,能兼容所有的ASP.NET2.0控件,并提供一组继承自ASP.NET2.0的控件,使其能够更加高效的渲染。同时我对整个的渲染过程进行了我力所能及的最大优化,很高兴,我们的渲染过程很快,并且消耗资源很低。我们在客户端和服务器端使用我们自己的一套编码方式来编码和解码,而不是使用XML,这样使得整个个回传当中的字节数大大减小,并且速度很快。
  • 灵活。在我后来使用WediaAjax进行桌面论坛和桌面Blog的开发中,我意识到:当将所有的页面合并到一个页面上的时候,要想不改变我以前的设计模式,并非常高效的渲染,这需要使WediaAjax能非常精准的控制页面当中需要加载和需要渲染的控件,这并不容易。于是WediaAjax对灵活性的要求高了起来,在实际的开发当中,WediaAjax的灵活性得到了很大的飞跃。
  • 简便。没有什么东西比让人一看就明白怎么是怎么回事要重要的多,而事实上,WediaAjax并没有提供多少新的控件,大部分是扩展了已有的控件,因而开发人员一看就能明白该怎么使用,而其中复杂的渲染过程就留给WediaAjax去处理了。
  • 和宿主完美的结合。WediaAjax的任何控件都能和宿主VS2005非常好的结合起来,图片显示正常, 并且具有智能选择功能。
  • 封装了常遇的开发难点。在实际的开发中我遇到了许多问题和难点,如验证码、动态图片验证、数据分页,在线编辑器等等,为了能够重用这样一些功能,我将它们全部都封装了起来,并作为WediaAjax的插件而使用。
  • 简洁的后台控制器。当您在开发应用程序的时候,我们开发的控制器可以让您跟踪您的回传,了解回传当中的所有字符串,并测试回传时间,这样有利于您开发出速度更快,效率更高的应用程序。
  • 支持IE和以IE为核心的浏览器的前进和后退功能。当我完成这样一个功能的时候,我感到无比的高兴,因为目前为止还没有哪一个框架能提供浏览器的前进和后退功能。正如您将看到的这个Demo,当您点击浏览器上的前进和后退的时候,甚至都感受不到停滞,因为根本没有连接到服务器!

早在今年年初,我就打算将其作为开源项目而发布的,可是一直迟迟没有开始,时间和精力都相当的有限。然而这以后的这段日子里,却给了我充裕的时间进一步测试WediaAjax,使其逐步完善,进而能将其Pro1.0 的版本发布。昨天,伴随着BingBlog Pro1.0 的完成,WediaAjax升级到Pro1.1,修订了许多Bug,并引进了许多新功能,然而由于这些Demo在Pro1.1完成之前就开始写了,因而还不能及时将这个Demo相应地升级到Pro1.1,还请大家原谅。^_^

WediaAjax问题和不足

  • 不支持Response.Redirect()。由于WediaAjax彻头彻尾是来搞高效桌面应用的,因而一般情况下不存在有多个页面的情况,因而不支持Response.Redirect()方法。这意味着您也没有办法使用ASP.NET提供的一组登录组件,解决的办法是自己写代码验证。这样虽然开发速度低了点,但是却可以使您的应用程序生成的代码更简洁,执行效率也更高。
  • 不支持WebParts。由于我还没有使用过WebParts进行开发,因而不太清楚它是怎么运行的,因而也没有添加对其的支持,在以后的改版中会考虑到这个的。
  • 不支持例如拖拉、编辑等操作。由于我个人认为Ajax虽然强大,但是并不适合用来模仿软件、桌面,因而并没提供相应功能,在以后也不会提供能该功能,但是开发者可以在WediaAjax的基础上进行开发,提供此类功能。
  • 不支持FireFox的前进和后退功能。这个问题也让我很火大,具体原因是我没有权限从一个Iframe里调用父Iframe的函数,查了N久也没找到一个解决的方法,虽然有关资料提供了解决办法,但是我的尝试告诉我并没有效果

WediaAjax相关资源

WediaAjax Code Project: http://code.google.com/p/aspnet-wedia-ajax/