蝈蝈俊.net

-- 用随笔来记录自己的技术感触
随笔 - 673, 评论 - 4416, 引用 - 276

导航

关于

记录自己的技术心得

标签

每月存档

最新留言

  • Syffkefi
    Gloomy tales <a href=" http://www.wikio.com/user/ybaquqeun/bio ">pic...
    by Syffkefi(匿名) on 2010/3/21 20:31:00
  • Ymipnkir
    i'm fine good work <a href=" http://www.wikio.com/user/irucilury/bio "&...
    by Ymipnkir(匿名) on 2010/3/21 20:30:44
  • Cnmevoyw
    Excellent work, Nice Design <a href=" http://www.wikio.com/user/qelytoiniq/bio &...
    by Cnmevoyw(匿名) on 2010/3/21 20:30:31
  • Gncuydae
    Thanks funny site <a href=" http://www.wikio.com/user/myaedet/bio ">...
    by Gncuydae(匿名) on 2010/3/21 19:43:40
  • Inmtkkwr
    perfect design thanks <a href=" http://www.wikio.com/user/arutybany/bio "&a...
    by Inmtkkwr(匿名) on 2010/3/21 19:43:30
  • Iumrwzpe
    this post is fantastic <a href=" http://www.wikio.com/user/riuneefyy/bio "&...
    by Iumrwzpe(匿名) on 2010/3/21 19:43:19
  • carbozyne
    uRTyRW How are you? and <a href="http://stress-relief-fda.viviti.com"&g...
    by carbozyne(匿名) on 2010/3/21 19:13:37
  • Murrimhv
    Excellent work, Nice Design <a href=" http://www.wikio.com/user/arutybany/bio &q...
    by Murrimhv(匿名) on 2010/3/21 18:23:56
  • Ujyntzwf
    Hello good day <a href=" http://www.wikio.com/user/fogoido/bio ">ear...
    by Ujyntzwf(匿名) on 2010/3/21 18:23:51
  • Mthziksa
    This site is crazy :) <a href=" http://www.wikio.com/user/pebyhylaga/bio "&...
    by Mthziksa(匿名) on 2010/3/21 18:23:46

广告

企业库缓存应用程序块和ASP.net的缓存,过期检查功能比较

企业库缓存应用程序块和ASP.net的缓存,过期检查功能比较

首先我们来看ASP.net 中自带的缓存

不论你使用的是HttpContext.Cache 还是 HttpRuntime.Cache,他们其实都是System.Web.Caching.Cache 类。
在给这个缓存增加缓存项功能时候,你就指定了这个缓存项的过期机制:
这个缓存类的增加缓存项函数如下:
public Object Add (
	string key,
	Object value,
	CacheDependency dependencies,
	DateTime absoluteExpiration,
	TimeSpan slidingExpiration,
	CacheItemPriority priority,
	CacheItemRemovedCallback onRemoveCallback
)

其中的CacheDependency dependencies 参数就是你需要增加的缓存到底是何种过期机制。

在ASP.net中 CacheDependency 类只提供了少数几个缓存过期的情况。MSDN中对此有详细的描述,如下:

 对存储于 ASP.NET 应用程序的 Cache 对象中的项与文件、缓存键、文件或缓存键的数组或另一个 CacheDependency 对象之间建立依附性关系。CacheDependency 类监视依附性关系,以便在任何这些对象更改时,该缓存项都会自动移除。

我们使用 Reflector 则可以看到更多有意思的东西。

CacheDependency  类的 private void Init(bool isPublic, string[] filenamesArg, string[] cachekeysArg, CacheDependency dependency, DateTime utcStart) 方法中,我们可以看到如下代码:

....
CacheDependency.DepFileInfo[] infoArray2 = new CacheDependency.DepFileInfo[num1];
FileChangeEventHandler handler1 = new FileChangeEventHandler(this.FileChange);
FileChangesMonitor monitor1 = HttpRuntime.FileChangesMonitor;
foreach (CacheDependency.DepFileInfo info2 in infoArray1)
{
    string text4 = info2._filename;
    monitor1.StartMonitoringPath(text4, handler1, out infoArray2[num2]._fad);
    infoArray2[num2]._filename = text4;
    num2++;
}
....

由上述代码可知ASP.net的Cache,如果依赖于文件,则系统自动监控这些文件。

监控这些文件的核心代码,分别在以下四个类中:

System.Web.FileChangesMonitor 类中可以看到如下代码:

internal DateTime StartMonitoringFile(string alias, FileChangeEventHandler callback)
{
....
FileMonitor monitor1;
DirectoryMonitor monitor2;
monitor1 = monitor2.StartMonitoringFile(text3, callback, alias);
....
}

System.Web.DirectoryMonitor 类中可以看到如下代码:
internal FileMonitor StartMonitoringFile(string file,
    FileChangeEventHandler callback, string alias){
.....
this.StartMonitoring();
.....
}
以及:
private void StartMonitoring(){
....
this._dirMonCompletion = new DirMonCompletion(this,
    this.Directory, this._watchSubtree, this._notifyFilter);
....
}
 
System.Web.DirMonCompletion 类中我们看他的构造函数
internal DirMonCompletion(DirectoryMonitor dirMon, string dir,
    bool watchSubtree, uint notifyFilter){
....
int num1 = UnsafeNativeMethods.DirMonOpen(dir, watchSubtree,
      notifyFilter, notification1, out this._ndirMonCompletionPtr);
....
}

以及他的销毁中调用的函数:
private void Dispose(bool disposing){
.....
UnsafeNativeMethods.DirMonClose(this._ndirMonCompletionHandle);
.....
}

而上述两个函数在 System.Web.UnsafeNativeMethods 类中

[ComVisible(false), SuppressUnmanagedCodeSecurity]
internal sealed class UnsafeNativeMethods
{

  [DllImport("webengine.dll", CharSet=CharSet.Unicode)]
  internal static extern int DirMonOpen(string dir, bool watchSubtree, uint notifyFilter, NativeFileChangeNotification callback, out IntPtr pCompletion);

  [DllImport("webengine.dll")]
  internal static extern void DirMonClose(HandleRef dirMon);
}

这样我们一直看下去后,可以看到,ASP.net 的基于文件的Cache,最终依赖于以下两个非托管代码。而这两个托管代码是实现的监控文件修改。

至于依赖于缓存健的缓存,则是在该缓存健过期是,同步通知依赖于他的项。

所以,可以简单的认为,ASP.net 的Cache 只依赖于文件,或者文件的数组。以及在此基础上的进一步封装。

我们再来看企业库中缓存的过期机制:

企业库在给缓存中新增一项缓存的时候,也会指明缓存的过期机制。这个增加函数原型如下:

 public void Add ( string key, Object value, CacheItemPriority scavengingPriority, ICacheItemRefreshAction refreshAction, params ICacheItemExpiration[] expirations )

最后一项为缓存过期机制,这个参数是params 参数,并且,这个参数要求是 遵循 ICacheItemExpiration 接口的一个实现。

ICacheItemExpiration 接口中其中定义了过期检查接口  bool HasExpired();

查看企业库的源代码会发现,增加缓存项的代码中有如下代码:

cacheScavenger.StartScavenging();  即,确保增加后,同时开始对这项进行检查,看是否满足过期机制。

在企业库中,由于有多种缓存过期机制需要考虑,而且用户可以自己实现自己的缓存过期机制。他的缓存过期机制就采用了定时检查是否过期,

甚至是依赖于文件的过期机制,也是这样。

总结:

1、ASP.net 的Cache由于归根到底是依赖于文件的Cache。
注意,ASP.net 用到的Cache,可不是依赖于System.IO.FileSystemWatcher ,而是微软自己封装的非托管代码。
System.IO.FileSystemWatcher 是依赖于非托管代码:
[DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern unsafe bool ReadDirectoryChangesW(SafeFileHandle hDirectory, HandleRef lpBuffer, int nBufferLength, int bWatchSubtree, int dwNotifyFilter, out int lpBytesReturned, NativeOverlapped* overlappedPointer, HandleRef lpCompletionRoutine);


2、企业库的Cache 是一个更广泛意义上的Cache。为了保证这个广泛性,他在性能上作了一些牺牲,单独开一个线程定时检查是否需要过期。

 

 

 

posted on 2006-09-26 19:41:00 by ghj1976  评论(6) 阅读(7320)

VS2005 一个项目的项目最长长度限制是50个字符

VS2005 一个项目的项目最长长度限制是50个字符,超过50个就会报如下错误,让你无法创建新项目。

---------------------------
Microsoft Visual Studio
---------------------------
The length of the full path for the solution, project or item you are creating exceeds the maximum path length allowed by the system. You must reduce the length of the name or the location.
---------------------------
OK
---------------------------

今天公司同事在解决方案中新建一个项目的时候。就碰到这个限制。

不知道这个限制有哪些人碰到过呢??

posted on 2006-09-26 17:31:00 by ghj1976  评论(2) 阅读(6195)

在IIS6中配置html文件以ASPX方式工作

在IIS6中配置html文件以ASPX方式工作

由于IIS6的安全不断提高, 如果你需要设置html文件以ASPX文件方式被执行。仅仅设置应用程序映射是不够的,还 需要修改一些其他设置。

如果你只修改了应用程序映射,而没有修改其它,则可能会报404错误。

Internet Explorer cannot display the webpage

IIS6中依次需要修改的设置如下:

1、在IIS6服务管理器->站点属性->主目录->配置->应用程序映射中 新增对html文件的应用程序映射

解析的文件一般如下:
下述可以看到其实我的电脑是64位的。
Exccutable:
C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll
对于请求类型,一般Get类型就足够了。
Verbs Limit to GET

2、修改你所需要修改的站点或者应用程序目录下的Web.config文件,要确保以下几个配 置节必须存在。

<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  <system.web>
    <compilation>
      <buildProviders>
        <add extension=".html" 

type="System.Web.Compilation.PageBuildProvider" />
      </buildProviders>
    </compilation>
    <httpHandlers>
      <add path="*.html" verb="*" type="System.Web.UI.PageHandlerFactory" 

validate="True" />
    </httpHandlers>
  </system.web>
</configuration>

这个配置只需要放在你需要修改的应用目录下即可。

也就是你完全可以在同一个IIS站点中,站点默认 html 是正常解析的。然后某个目录( 这个目录下你配制成了应用程序目录)下html被当成aspx来解析的。

以上的做法同样适用于把其他后缀文件类型让aspx来解析的情况。

最后补充一点的是:
如果你用到的后缀类型是一种古怪的后缀。
比如:*.aaa *.csdn 等这样的后缀,
在IIS6 中,你需要额外再多做一步:
在IIS的站点属性->HTTP头->MIME类型中增加一个该后缀的MIME类型, 不然遇到该后缀的请求时将首先被IIS给拦截掉,没办法显示的。

posted on 2006-09-25 15:33:00 by ghj1976  评论(6) 阅读(7931)

网站如何做分布式(集群)的大纲

下面是我准备在BOF中抛砖引玉用到的砖:

网站如何做分布式(集群)的大纲

何时要用分布式

  • 单台服务器无法承受压力。
  • 需要实现发生错误时候,自动切换
  • 学习或者测试分布式技术

应用分布式的场景


一、提供多个对外的接口,按照一定规则,分派不同请求由不同接口来处理。
这时候需要考虑:
  • 如何实现负载均衡
    • 在哪个层次实现转移负载
    • 负载的均衡如何实现
  • 如何实现故障转移
    • 如何监控故障
    • 如何切换服务

二、把一个功能拆分成多个功能,不同功能分布部署到不同服务器上

  • 对外功能的拆分 
    • http://news.sina.com.cn/ http://sports.sina.com.cn/ http://mobile.sina.com.cn/
    • http://www.microsoft.com/china/  http://www.microsoft.com/downloads/
    • SOA
  • n层架构,其中的一些层分布到不同服务器上
    • WEB + DB 模式

网站请求中的分布式

按照请求流程,我们可以在以下环节按照一定规则,把用户的请求分流到不同服务器上:

  • Web Client Level
    • 例子:QQ 设置中你可以选择登陆的服务器IP
  • DNS Based Selection
    • 优点:
    • 缺点:
      • 不能区分服务器的差异,也不能反映服务器的当前运行状态。
      • DNS 的刷新需要时间,无法及时故障切换。
  • TCP balancing proxies
    • 硬件
    • 软件
  • HTTP-aware routers
  • URL重定向

网站应用中的分布式

  • 代理服务器实现请求的分离
    • Squid是Linux下一个缓存Internet数据的代理服务器软件
  • 拆分网站对外功能
    • 不同域名前、后缀
    • URL 重写
  • SOA
    • 每个Service 分布到一台服务器上
  • n 层架构
    • 缓存分布式部署
      • 文件Cache
      • 内存Cache (memcached )
        • http://www.danga.com/memcached/
        • https://sourceforge.net/projects/memcacheddotnet/
    • DB分布式集群部署
      • 故障转移
      • 发布订阅
      • 分布式分区视图
    • 应用服务器(比如定时发送邮件通知的服务)
    • 相关技术:
      • 企业服务
      • .net Remoting
      • WCF
      • Web Service

 

如何判断一个应用是否支持分布式

如果发现某一部分应用需要做分布式了,就可以按照以下思路来考虑如何改造:

从应用所用数据看是否支持分布式

  • 多份并存数据(一个数据存在多份)最大多长时间同步一次是可接受的。
    • 内存缓存的数据跟数据库的数据(页面级缓存和业务逻辑缓存)
    • 静态文件跟数据库
    • 查询数据库跟业务变更数据库
  • 数据按照一定规则拆分(一个数据只存在一份)对业务是否有影响
    • 过去每年的数据迁移到一个对应历史库中。
    • 专用的图片服务器 http://pics.ebaystatic.com/

此处可分析:QQ的在线用户数据,会是如何处理的呢?

从应用逻辑过程看是否支持分布式

  • 是否可以并行执行这个逻辑过程
  • 这个逻辑过程是否可以拆分成几个松耦合的过程

微软技术支持的5种分布式

夏桅的这篇博客中的图表就可以很详细的对比这5种分布式:

Windows的第五种群集方案 - CCS

posted on 2006-09-20 11:15:00 by ghj1976  评论(12) 阅读(14396)

网站如何做分布式以及集群 BOF


北京 Teched 上,我将和施凡一起组织个 BOF “网站如何做分布式以及集群”,欢迎参加。

时间: 9月23日 12:45 ~ 13:45

地点:会场5楼 Track Cabana - BOF 1

主题:网站如何做分布式以及集群

计划讨论的内容如下:

网站分布式有哪些常见方案,每种实现又会给我们带来哪些局限。

我们开发的网站要支持负载均衡、并行计算,需要有哪些考虑?

多层架构的网站,他们的每一层又该如何考虑支持分布式集群。


 

posted on 2006-09-18 17:49:00 by ghj1976  评论(12) 阅读(5437)

怪异的ASP 问题(页面 ContentType 没指定,会不定期报404错误)

怪异的ASP 问题(页面 ContentType 没指定,会不定期报404错误)

今天同事在调整一个ASP页面时候,出现一个怪异现象,这个页面一会能打开,访问正常;一会不能打开,报404错误。

查了好久,最后发现,只需要指明这个页面的 ContentType ,就可以避免这个问题,即增加下面一行语句:

Response.ContentType="text/xml"

posted on 2006-09-11 10:32:00 by ghj1976  评论(9) 阅读(5692)

Powered by: Joycode.MVC引擎 0.5.2.0