2010年10月16日

     有好几个月没来坛子了,记得上次走之前,MVC在这里搅得四处狼烟,众星捧月好不热闹。没想到这次回来翻了10页只有寥寥可数的三俩篇文章,大有门可罗雀之感。MVC的簇拥者们是去闭关修炼了还是转投他人怀抱不得而,只是这般冷清让我感慨。

     微软总是乐于学习对手并超越对手,在其成长道路上一路走来,干掉了不少对手,这次推出MVC框架就是为了分化Java阵营,可惜Java的MVC就是个落后的技术,低效的开发效率根本不适合如今快速发展的市场需求,加上Javer各个自命不凡,以贵族身份自居,压根就看不起微软技术,所以微软吃力不讨好,从MVC1玩到MVC3,不仅Java阵营看不起,连自家阵营的人也开始抱怨更新太快,不得要领。

     相当多同学抱着一颗技术高手的虚荣心来搞MVC,稍微有一点成绩后就开始贬低Webform,浅薄之极。要装高手直接去玩Java的SpringMvc那一套,你要知道,你玩.Net MVC再好,Javer也在鄙视你,因为你只是一个拙劣的模仿者。

     从长远看,MVC是个边缘化的产品技术,客户端技术日趋壮大,这表示逻辑层与显示层迁往客户端,现有的MVC框架无法处理。 而Jquery等技术将长期影响Web产品开发,因为Jquery不仅简单,上手很快,而且能产生很简洁的网页代码,同时还满足了一些喜欢从html协议层来写程序的狂热者,这些优势简直是处处针对.Net MVC,既生瑜何生亮也。

    此文乃夜深胡乱之语,大家勿喷,除了口诛笔伐之外,生活中还有很多乐趣值得我们去发现和享受,你说是吧?

posted @ 2010-10-16 01:03 遛扬狗 阅读(1032) 评论(4) 编辑

2010年6月9日

第三节我写了有一段时间了,回过头来看发现太粗略,连我自己也不知道在说些什么,所以我决定用图片的形式来把这个模型再阐述一下,愿和更多的朋友来交流。

我设计的Comet模型是很简单的,看下图

简单吧,重点就是采用两个连接,一个长期保持用于接受消息,一个发送消息后立刻关闭。

那么服务器端是如何把消息分发到不同用户的呢?请看下图

全靠内存中保存的这张全局哈希表,通过这张表可以把消息实时的写入用户客户端,那这个HttpContext怎么来的呢?一定有朋友会问。那我告诉你这是微软提供的一个IHttpAsyncHandler接口实现的, IHttpAsyncHandler有个方法需要重载   public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData),通过

context.Request 可以得到Get或者Post的数据,数据中你写上用户名,然后用Hashtable.add(用户名,HttpContext)就行了,AsyncCallback cb是异步结束后给系统发通知的回调。ok有了BeginProcessRequest这把利器,Comet就这么简单的实现了。

   题外话:IIS是提供传统Web服务的,虽然对Comet提供了一定的支持,但还存在很多问题,最大的问题就是IIS指不定什么时候就自动重启了,然后进程中所有的数据都丢失了。一般的Web应用没什么,可能都没感觉。但是所有的Comet都掉线了就有点麻烦了,所以客户端要做的强一点才能弥补这个缺陷。

 

 

 


     

posted @ 2010-06-09 11:05 遛扬狗 阅读(1516) 评论(3) 编辑

2010年5月26日

1.将写好的windows服务切换到设计视图,右键-添加安装程序
2. 切换到新生成的ProjectInstaller.cs设计视图,找到serviceProcessInstaller1对Account属性设置为 LocalSystem,对serviceInstaller1的ServiceName属性设置为Server1(服务的名字),StartType属 性设置为Automatic(系统启动的时候自动启动服务)
3.建立一个新的安装项目ServerSetup(我们为刚才那个服务建立一个安装项目)
4.右键-添加-项目输出-主输出-选择Service1-确定
5.右键-视图-自定义操作-自定义操作上(安装)右键-添加自定义操作-打开应用程序文件夹-选择刚才那个主输出-确定
6.右键-视图-自定义操作-自定义操作上(卸载)右键-添加自定义操作-打开应用程序文件夹-选择刚才那个主输出-确定 -设置(arguments属性='/u' 作为卸载时并卸载服务)
7.重新生成,在安装项目下的bin或release下,可找到可执行的安装程序,里面已经包含了所有需要的类库等。
8.双击安装程序安装后,在服务管理器中(我的电脑-右键-管理-服务和应用程序-服务)找到Server1服务,启动服务
原文地址:
http://www.cnblogs.com/tomkillua/archive/2009/06/26/1511366.html
posted @ 2010-05-26 11:29 遛扬狗 阅读(70) 评论(0) 编辑

2010年4月21日

今天下午研究了一下SQL server的同步,历尽磨难最后终于成功了。下面是一些个人心得,记录下来让自己下次配置能顺利些。

 

1.A,B 两台服务器都用机器名注册

2.A,B 使用相同的账号,密码连接。

3.A,B 使用相同的账号,密码启动SQLSERVERAGENT服务

4在A机器上创建订阅服务器和分发服务器

一定要把快照文件夹共享并记下,配置订阅服务器时需要用到。

5.新建发布,选择事务发布,同步最快最及时,资源消耗也高。

6订阅,如果前面5步成功,可以看到下图

点击下一步,见下图

填入步骤4的账号和密码

第一次订阅一定要选择初始化架构和数据,否则分发服务器会报告sp_MSupd_***错误。

这里填入步骤4中的快照文件夹地址

7。启动同步

回到A机器,参照下图点击启动同步处理

posted @ 2010-04-21 17:35 遛扬狗 阅读(107) 评论(0) 编辑
 

 

原文是:http://www.codeproject.com/KB/aspnet/CometAsync.aspx

 

Asp.net环境下实现Comet就要用到   IHttpAsyncHandler接口

 

并实现其中的BeginProcessRequest和EndProcessRequest方法

BeginProcessRequest方法中的HttpContext包含了Response和Request对象,AsyncCallback用于异步调用结束,运行结束后需要返回一个IAsyncResult对象。

 

我在BeginProcessRequest函数中通过Request获取了一个名为ElementData的JSon字符串,并通过Element解析出用户名和在线状态。

CometAsyncResult构造函数只是简单的保存了HttpContext、AsyncCallback这两个对象,AddCometAsyncResult函数则实现了根据用户名获取全网中的留言信息、复制好友列表到聊天服务器、好友状态交换等业务逻辑。当然还有一点最为关键的,就是把用户名和HttpContext、AsyncCallback这两个对象对应起来,这样才能通过用户名来发送消息。当你完成这一切的时候,Comet模型就建立起来了,非常的简单。根据我测试windows2003+IIS6.0环境下可以同时4000-8000个链接,windows2008+IIS7.0环境下可达到15000个链接。

 

代码
using System;
using System.Data;
using System.Configuration;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Threading;
using System.Web;
using PCBaseLib.Entity;
using CometAsync.Remoting;

namespace CometAsync.Comet
{
    
public class CometAsyncHandler : IHttpAsyncHandler
    {
        
#region IHttpAsyncHandler Members

        
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
        {
           

                
//保存状态

            CometAsyncResult result 
= new CometAsyncResult(context.Response, cb, extraData);
            Element Ele
=null;
            
if (context.Request.Form["ElementData"!= null)

                Ele 
= new Element(context.Request.Form["ElementData"], true);
            
else
            {
                Ele 
= new Element("test");
                Ele[
"From"= "user" + HttpContextRemoting.UsersOnline.Count.ToString();
                Ele[
"State"= "0";
            }
            result.AddCometAsyncResult(Ele[
"From"], Ele["State"]);

                
//  ok, return it
                return result;

        }

        
public void EndProcessRequest(IAsyncResult result)
        {

        }

        
#endregion

        
#region IHttpHandler Members

        
public bool IsReusable
        {
            
get { return false; }
        }

        
public void ProcessRequest(HttpContext context)
        {
            
throw new InvalidOperationException("ASP.NET Should never use this property");
        }

        
#endregion
    }
}

 

 

运行上述代码,请在web.config文件中加入httpHandlers节,注册访问页由你的类来处理,如下CometLink.ashx的处理函数、命名空间全名为:CometAsync.Comet.CometAsyncHandler

 

代码
   <httpHandlers>
      
      
<add verb="GET, POST" path="CometLink.ashx" type="CometAsync.Comet.CometAsyncHandler, CometAsync" validate="false"/>
      
<add verb="GET, POST" path="SendMessage.ashx" type="CometAsync.IM_Command.SendMessage, CometAsync" validate="false"/>
      
<add verb="GET, POST" path="Join.ashx" type="CometAsync.IM_Command.Join, CometAsync" validate="false"/>
      
<add verb="GET, POST" path="Agree.ashx" type="CometAsync.IM_Command.Agree, CometAsync" validate="false"/>
      
<add verb="GET, POST" path="Login.ashx" type="CometAsync.IM_Command.Login, CometAsync" validate="false"/>
      
<add verb="GET, POST" path="Refuse.ashx" type="CometAsync.IM_Command.Refuse, CometAsync" validate="false"/>
      
<add verb="GET, POST" path="Presence.ashx" type="CometAsync.IM_Command.Presence, CometAsync" validate="false"/>
      
<add verb="GET, POST" path="PresenceEx.ashx" type="CometAsync.IM_Command.PresenceEx, CometAsync" validate="false"/>
      
<add verb="GET, POST" path="InfoSet.ashx" type="CometAsync.IM_Command.InfoSet, CometAsync" validate="false"/>
    
</httpHandlers>

 

 

posted @ 2010-04-21 11:27 遛扬狗 阅读(1341) 评论(5) 编辑

2009年12月11日

摘要: 最近一直忙于IM的设计,很久没有更新我的博客。今天有点时间,我把以前做的一个mobile5滑动效果放上来与大家分享,希望能对初学者有一点帮助。用过mobile的朋友都知道微软的联系人这个软件很不好用,采用的是pc那种方式,右边一个滚动条,而这个滚动条又太细,我的拇指经常性的点不中,所以萌发了写个类似Iphone那种滑动效果的控件。控件是用C#和GDI+写的,内部有一个简单的状态机制,没有什么技术含...阅读全文
posted @ 2009-12-11 11:10 遛扬狗 阅读(870) 评论(19) 编辑

2009年11月20日

摘要: 1.业务分离的设计  分布式的优点是能用大量的廉价服务器组建成一个巨大的系统,性价比很高。简单的说就是把业务模块尽可能的缩小的一个原子级别,然后从系统中剥离出来单独运行,当把系统中所有的业务一一剥离后,分布式系统也就搭建成功一半了。剩下的就是高效的处理每个业务的数据流。一个简单的IM系统我大概分为4个部分:1.1。登录认证服务器群 用于用户的注册和登录,又可以分为Web服务器群和数据库群。根据用户...阅读全文
posted @ 2009-11-20 10:33 遛扬狗 阅读(1743) 评论(4) 编辑

2009年11月19日

摘要: agsxmpp是一套用C#实现的开源XMPP协议库,Openfire是用c实现的xmpp服务器程序,两者互通存在一些问题,最基本的登录都不正常。经过对agsxmpp协议分析和跟踪,发现了两个问题: 1.认证协议 agsxmpp在认证的时候,默认使用DIGEST-MD5,但是在Openfire下无法认证通过,改成PLAIN即可。 2.Iq节 Openfire 不支持Iq节带 to 的属性,所以在ag...阅读全文
posted @ 2009-11-19 14:39 遛扬狗 阅读(821) 评论(1) 编辑
 
摘要: 开发一个手机IM系统的想法有很久了,最先我定位于基于xmpp协议的实现方式,为此我安装了Openfire和spark,搭建了一套完善的系统用于研究,spark的debug模式对我分析xmpp协议起到了重要的作用,随后我又安装了agsxmpp sdk,在一番折腾下我终于完成了agsxmpp示例客户端与spark客户端的通讯(Openfire有些地方不是100%实现了xmpp协议)。有兴趣的朋友可以看...阅读全文
posted @ 2009-11-19 14:36 遛扬狗 阅读(2211) 评论(14) 编辑

2009年11月16日

摘要: 网上都说Ipc通道的速度比Tcp、http通道快,也有相关的测试文章。但我在多线程测试中发现Ipc通道比Tcp慢了差不多20多倍,测试方法是在IIS6中创建Remoting通道,用WAS压力测试工具进行测试。IIS6中Web园设置为100个进程,核心请求队列设置为4000,然后打开WAS并设置1000个线程,每个线程2个连接。点击启动。以下是WAS运行30s后的测试结果,WAS显示时间不准确是由于...阅读全文
posted @ 2009-11-16 12:44 遛扬狗 阅读(468) 评论(2) 编辑