tangdh
PB and .net 乐园

2008年7月25日

/*计算个人所得税函数20050930    */
/*输入参数为:第一个参数为字符一位:'1' 正常全额计税 '0'不计税   第二个参数为金额*/
/* 返回应交税额*/
/*作者:*** 调用方法:dbo.jstax('1',900) */

CREATE FUNCTION jstax (@jsfs int ,@je decimal(10,2))
RETURNS decimal(10,2) AS
BEGIN

DECLARE @jshj decimal(10,2)
if @jsfs=1   /*  工资薪金计税    */
set @jshj=
CASE
    WHEN @je<0                     THEN  0
    WHEN @je>0 and @je<500         THEN  @je*0.05
    WHEN @je>=500 and @je<2000     THEN  @je*0.10-25
    WHEN @je>=2000 and @je<5000    THEN  @je*0.15-125
    WHEN @je>=5000 and @je<20000   THEN  @je*0.20-375
    WHEN @je>=20000 and @je<40000  THEN  @je*0.25-1375
    WHEN @je>=40000 and @je<60000  THEN  @je*0.3-3375
    WHEN @je>=60000 and @je<80000  THEN  @je*0.35-6375
    WHEN @je>=80000 and @je<100000 THEN  @je*0.4-10375
    WHEN @je>=100000               THEN  @je*0.45-15375
END
if @jsfs=2   /* 不扣税  */
    set @jshj=0
if @jsfs=3   /*  年终奖计税  */
    set @jshj=
CASE
    WHEN @je<0                     THEN  0
    WHEN @je>0 and @je<500         THEN  @je*0.05
    WHEN @je>=500 and @je<2000     THEN  @je*0.10-25
    WHEN @je>=2000 and @je<5000    THEN  @je*0.15-125
    WHEN @je>=5000 and @je<20000   THEN  @je*0.20-375
    WHEN @je>=20000 and @je<40000  THEN  @je*0.25-1375
    WHEN @je>=40000 and @je<60000  THEN  @je*0.3-3375
    WHEN @je>=60000 and @je<80000  THEN  @je*0.35-6375
    WHEN @je>=80000 and @je<100000 THEN  @je*0.4-10375
    WHEN @je>=100000               THEN  @je*0.45-15375
END
RETURN @jshj
END
\\\\
/*当月已扣除税合计*/
CREATE FUNCTION jsget_kshj (@ygbh int,@jdate char(15))
RETURNS decimal(10,2) AS
BEGIN

DECLARE @returnstring  decimal(10,2)
DECLARE @CountItems int

SELECT
    @CountItems = Count(GoodsID)
FROM
    ordercontent
WHERE
    GoodsID = @ygbh
  AND
    jsdate = @jdate
and cwsh=1


if @CountItems>0
set @returnstring=(select sum(kosui)+sum(czks) from ordercontent
where   GoodsID = @ygbh AND jsdate = @jdate and jsfs=1 and cwsh=1)
 
else
set @returnstring=0


RETURN @returnstring
END

\\\\\\
/*函数20051101    */
/*输入参数为:当前日期*/ 
/* 返回200511*/
/*作者:*** 调用方法:dbo.jsgetdate(getdate()) */

CREATE FUNCTION jsgetdate (@js_date datetime)
RETURNS nvarchar(6) AS
BEGIN

DECLARE @returnstring  nvarchar(6)

set @returnstring=convert(nvarchar(4),datepart(year,@js_date))+convert(nvarchar(2),datepart(month,@js_date))

RETURN @returnstring
END

\\\\
/*根据指定的职工编号和月份
取得当月工资性收入的合计
*/

CREATE FUNCTION jsgetjehj (@ygbh int,@jdate char(15))
RETURNS decimal(10,2) AS
BEGIN

DECLARE @returnstring  decimal(10,2)
DECLARE @CountItems int

SELECT
    @CountItems = Count(GoodsID)
FROM
    ordercontent
WHERE
    GoodsID = @ygbh
  AND
    jsdate = @jdate
  and  cwsh=1


if @CountItems>0
set @returnstring=(select sum(GoodsQuantity) from ordercontent
where   GoodsID = @ygbh AND jsdate = @jdate and jsfs=1 and cwsh=1)
 
else
set @returnstring=0


RETURN @returnstring
END

\\\\\\
/*根据指定的职工编号和12月份
工资性收入的合计 作为计算年终奖的依据

*/

CREATE FUNCTION jsget12jehj (@ygbh int,@jdate char(15))
RETURNS decimal(10,2) AS
BEGIN

DECLARE @returnstring  decimal(10,2)
DECLARE @CountItems int

SELECT
    @CountItems = Count(GoodsID)
FROM
    ordercontent
WHERE
    GoodsID = @ygbh
  AND
    jsdate = @jdate


if @CountItems>0
set @returnstring=(select sum(GoodsQuantity) from ordercontent
where   GoodsID = @ygbh AND jsdate = @jdate and jsfs=1)
 
else
set @returnstring=0
RETURN @returnstring
END

\\\\\
/*
用于在财务个人项目中查询收入明细情况
输入参数为员工编号
*/
CREATE Procedure srmx
(
    @IDCardNumber  int
)
As
SELECT 
    orderid,
    GZBASE.GZBASE_YGBH,
    GZBASE.GZBASE_YGXM,
    GoodsQuantity,
    kosui,
    sifa,
    czks,
   jsfs,
  jsdate
   
FROM
    OrderContent
  INNER JOIN GZBASE ON OrderContent.GoodsID = GZBASE.GZBASE_YGBH
 
where OrderContent.GoodsID=@IDCardNumber and cwsh=1

order by  jsdate,orderid
GO

\\\\
/*
此存储过程用于将工资数据从cur_gzbase读入ordercontent表
不需要参数
*/

CREATE Procedure curgz_read

AS
DECLARE @OrderID int
DECLARE @tmp  Decimal(10,2)
DECLARE @yhhj  Decimal(10,2)

BEGIN TRAN OrderAdd1


INSERT INTO Orders
(
    UserID,
    OrderDate,
    zy
  
)
VALUES
(  
    20,
    getdate() ,
   '工资'
)



SELECT
    @OrderID = @@Identity   
--select  @yhhj=[GZBASE_XM040]+[GZBASE_XM032]-[GZBASE_XM021]-[GZBASE_XM045]  from cur_gzbase
--select   @tmp= dbo.jstax(1,dbo.jsgetjehj(GZBASE_YGBH,dbo.jsgetdate(getdate()))+@yhhj-1600)-dbo.jsget_kshj(GZBASE_YGBH,dbo.jsgetdate(getdate()))

from cur_gzbase




INSERT INTO OrderContent
(
     [OrderID],
    [GoodsID],
    [GoodsQuantity],
    [GZBASE_YGXM],
    [kosui],
    [sifa],
    [jsfs],
   [czks],
    [gzyn] 
 
   
)


SELECT
   @OrderID,
    [GZBASE_YGBH],
    [GZBASE_XM040]+[GZBASE_XM032]-[GZBASE_XM021]-[GZBASE_XM045],
    "",
case
   when substring(GZBASE_BMBH,1,2)='02'  THEN 0
   ELSE
    dbo.jstax(1,dbo.jsgetjehj(GZBASE_YGBH,dbo.jsgetdate(getdate()))+([GZBASE_XM040]+[GZBASE_XM032]-[GZBASE_XM021]-[GZBASE_XM045])-1652)-dbo.jsget_kshj(GZBASE_YGBH,dbo.jsgetdate(getdate()))-[GZBASE_XM022]
END,

   0,
    1,
     [GZBASE_XM022],
    1
  

FROM
   cur_gzbase


COMMIT TRAN OrderAdd1
GO

\\\\\\
CREATE Procedure js_orderdetal
(
    @orderid int
)
As
SELECT 
    GZBASE.GZBASE_YGBH,
    GZBASE.GZBASE_YGXM,
    GoodsQuantity,
    kosui,
    sifa
   
FROM
    OrderContent
  INNER JOIN GZBASE ON OrderContent.GoodsID = GZBASE.GZBASE_YGBH
 
where orderid=@orderid
GO
\\\\
CREATE Procedure js_orderdetal
(
    @orderid int
)
As
SELECT 
    GZBASE.GZBASE_YGBH,
    GZBASE.GZBASE_YGXM,
    GoodsQuantity,
    kosui,
    sifa
   
FROM
    OrderContent
  INNER JOIN GZBASE ON OrderContent.GoodsID = GZBASE.GZBASE_YGBH
 
where orderid=@orderid
GO


\\\\

CREATE Procedure Updateordercontent_hz
(
    @GoodsID int,
    @GoodsQuantity Decimal(10,2)
   
 
)
As

DECLARE @CountItems int

SELECT
    @CountItems = Count(GoodsID)
FROM
    ordercontent_hz
WHERE
    GoodsID = @GoodsID
  AND
    jsdate = dbo.jsgetdate(getdate())

IF @CountItems > 0  /* There are items - update the current quantity */

    UPDATE
        ordercontent_hz
    SET
        GoodsQuantity = (@GoodsQuantity + ordercontent_hz.GoodsQuantity)
    WHERE
        GoodsID = @GoodsID
      AND
        jsdate = dbo.jsgetdate(getdate())

ELSE  /* New entry for this Cart.  Add a new record */

    INSERT INTO ordercontent_hz
    (
       
        GoodsQuantity,
        GoodsID   
    )
    VALUES
    (
       
        @GoodsQuantity,
        @GoodsID
   
    )
GO


posted @ 2008-07-25 12:03 tangdh 阅读(17) | 评论 (0)编辑

2008年6月24日

//财务从一套帐到另一套帐
use master
go
select * from syslogins
use cwbase14
go
select * from sysusers
//
use master
go
sp_configure "allow updates",1
go
reconfigure with override
go
use cwbase14
go
update sysusers set suid = 129,name = 'lc0149999'  where suid = 57
go
sp_configuer "allow updates",0
go
reconfigure with override
go


//设置数据库状态
sp_dboption  cwbase1 , "select into/bulkcopy", true
go

posted @ 2008-06-24 16:37 tangdh 阅读(26) | 评论 (0)编辑

2008年6月22日

  酒桌上的规矩:
  (一)如果自己真不能喝,丫就别开第一口,端着饭碗夹了菜一边吃着去
  (二)如果确信自己要喝,就别装墨迹,接下来就是规矩了
  
  规矩一:酒桌上虽然“感情深,一口闷;感情浅,舔一舔”但是喝酒的时候决不能把这句话挂在嘴上。 
  规矩二:韬光养晦,厚积薄发,切不可一上酒桌就充大。 
  规矩三:领导相互喝完才轮到自己敬。 
  规矩四:可以多人敬一人,决不可一人敬多人,除非你丫是领导。 
  规矩五:自己敬别人,如果不碰杯,自己喝多少可视乎情况而定,比如对方酒量,对方喝酒态度,切不可比对方喝得少,要知道是自己敬人。 
  规矩六:自己敬别人,如果碰杯,一句,我喝完,你随意,方显大肚。 
  规矩七:自己职位卑微,记得多给领导添酒,不要瞎给领导代酒,就是要代,也要在领导确实想找人代,还要装作自己是因为想喝酒而不是为了给领导代酒而喝酒。比如领导甲不胜酒力,可以通过旁敲侧击把准备敬领导甲的人拦下。 
  规矩八:端起酒杯(啤酒杯),右手扼杯,左手垫杯底,记着自己的杯子永远低于别人。自己如果是领导,知趣点,不要放太低,不然怎么叫下面的做人? 
  规矩九:如果没有特殊人物在场,碰酒最好按时针顺序,不要厚此薄彼。 
  规矩十:碰杯,敬酒,要有说词,不然,我tmd干吗要喝你的酒? 
  规矩十一:桌面上不谈生意,喝好了,生意也就差不多了,大家心里面了了然,不然人家也不会敞开了跟你喝酒。 
  规矩十二:不要装歪,说错话,办错事,不要申辩,自觉罚酒才是硬道理。 
  规矩十三:假如,纯粹是假如,遇到酒不够的情况,酒瓶放在桌子中间,让人自己添,不要傻不垃圾的去一个一个倒酒,不然后面的人没酒怎么办? 
  规矩十四:最后一定还有一个闷杯酒,所以,不要让自己的酒杯空着。跑不了的~ 
  规矩十五:注意酒后不要失言,不要说大话,不要失态,不要吐沫横飞,筷子乱甩,不要手指乱指,喝汤噗噗响,不要放屁打嗝,憋不住去厕所去,没人拦你。 
  规矩十六:不要把“我不会喝酒”挂在嘴上(如果你喝的话),免得别人骂你虚伪,不管你信不信,人能不能喝酒还真能看出来。 
  规矩十七:领导跟你喝酒,是给你face,不管领导怎么要你喝多少,自己先干为敬,记着啊,双手,杯子要低。 
  规矩十八:花生米对喝酒人来说,是个好东西。保持清醒的头脑,酒后嘘寒问暖是少不了的,一杯酸奶,一杯热水,一条热毛巾都显得你关怀备至。
  
  如果你不能喝  
  1、不要主动出击,实行以守为攻战略; 
  2、桌前放两个大杯,一杯放白酒,一杯放矿泉水,拿小酒盅干杯,勤喝水,到酒桌上主客基本都喝8分醉时,可以以水代酒,主动出击; 
  3、干杯后,不要马上咽下去,找机会用餐巾抹嘴,把酒吐餐巾里; 
  4、上座后先吃一些肥肉类、淀粉类食品垫底,喝酒不容易醉; 
  5、掌握节奏,不要一下子喝得太猛; 
  6、不要几种酒混着喝,特别容易醉; 
  7、领导夹菜时,千万不要转酒桌中间的圆盘,领导夹菜你转盘是酒桌上大忌; 
  8、喝到六分醉时,把你面前的醋碟中的醋喝下,再让服务员添上;
  9、每次干杯时,倒满,然后在喝前假装没有拿稳酒盅,尽量洒出去一些,这样每次可以少喝进去不少;
  10、喝酒前面前放好半杯茶,喝了酒不要咽,赶紧拿起茶杯,喝水的功夫把酒吐进酒杯里,吐满了换水就行了,管用的!  

  酒宴上的礼仪   
  
  1、众欢同乐,切忌私语 
   大多数酒宴宾客都较多,所以应尽量多谈论一些大部分人能够参与的话题,得到多数人的认同。因为个人的兴趣爱好、知识面不同,所以话题尽量不要太偏,避免唯我独尊,天南海北,神侃无边,出现跑题现象,而忽略了众人。特别是尽量不要与人贴耳小声私语,给别人一种神秘感,往往会产生“就你俩好”的嫉妒心理,影响喝酒的效果。 
  2、瞄准宾主,把握大局 
   大多数洒宴都有一个主题,也就是喝酒的目的。赴宴时首先应环视一下各位的神态表情,分清主次,不要单纯地为了喝酒而喝酒,而失去交友的好机会,更不要让某些哗众取宠的酒徒搅乱东道主的意思。 
  3、语言得当,诙谐幽默 
   洒桌上可以显示出一个人的才华、常识、修养和交际风度,有时一句诙谐幽默的语言,会给客人留下很深的印象,使人无形中对你产生好感。所以,应该知道什么时候该说什么话,语言得当,诙谐幽默很关键。 
  4、劝酒适度,切莫强求 
   在酒桌上往往会遇到劝酒的现象,有的人总喜欢把酒场当战场,想方设法劝别人多喝几杯,认为不喝到量就是不实在。 
   “以酒论英雄”,对酒量大的人还可以,酒量小的就犯难了,有时过分地劝酒,会将原有的朋友感情完全破坏。 
  5、敬酒有序,主次分明 
   敬酒也是一门学问。一般情况下敬酒应以年龄大小、职位高低、宾主身份为序,敬酒前一定要充分考虑好敬酒的顺序,分明主次。好使与不熟悉的人在一起喝酒,也要先打听一下身份或是留意别人如何称呼,这一点心中要有数,避免出现尴尬或伤感情的局面。 
  敬酒时一定要把握好敬酒的顺序。有求于某位客人在席上时,对他自然要倍加恭敬,但是要注意,如果在场有更高身份或年长的人,则不应只对能帮你忙的人毕恭毕敬,也要先给尊者长者敬酒,不然会使大家都很难为情。 
  6、察言观色,了解人心 
   要想在酒桌上得到大家的赞赏,就必须学会察言观色。因为与人交际,就要了解人心,左右逢源,才能演好酒桌上的角色。 
  7、锋芒渐射,稳坐泰山 
   酒席宴上要看清场合,正确估价自己的实力,不要太冲动,尽量保留一些酒力和说话的分寸,既不让别人小看自己又不要过分地表露自身,选择适当的机会,逐渐放射自己的锋芒,才能稳坐泰山,不致给别人产生"就这点能力"的想法,使大家不敢低估你的实力。
  
  注意细节   
  
  1——座次   
   总的来讲,座次是“尚左尊东”、“面朝大门为尊”。若是圆桌,则正对大门的为主客,主客左右手边的位置,则以离主客的距离来看,越靠近主客位置越尊,相同距离则左侧尊于右侧。若为八仙桌,如果有正对大门的座位,则正对大门一侧的右位为主客。如果不正对大门,则面东的一侧右席为首席。
   如果为大宴,桌与桌间的排列讲究首席居前居中,左边依次2、4、6席,右边为3、5、7席,根据主客身份、地位,亲疏分坐。 
   如果你是主人,你应该提前到达,然后在靠门位置等待,并为来宾引座。如果你是被邀请者,那么就应该听从东道主安排入座。 
   一般来说,如果你的老板出席的话,你应该将老板引至主座,请客户最高级别的坐在主座左侧位置。除非这次招待对象的领导级别非常高。  
  2——点菜 
   如果时间允许,你应该等大多数客人到齐之后,将菜单供客人传阅,并请他们来点菜。当然,作为公务宴请,你会担心预算的问题,因此,要控制预算,你最重要的是要多做饭前功课,选择合适档次的请客地点是比较重要的,这样客人也能大大领会你的预算。况且一般来说,如果是你来买单,客人也不太好意思点菜,都会让你来作主。如果你的老板也在酒席上,千万不要因为尊重他,或是认为他应酬经验丰富,酒席吃得多,而让他/她来点菜,除非是他/她主动要求。否则,他会觉得不够体面。 
   如果你是赴宴者,你应该知道,你不该在点菜时太过主动,而是要让主人来点菜。如果对方盛情要求,你可以点一个不太贵、又不是大家忌口的菜。记得征询一下桌上人的意见,特别是问一下“有没有哪些是不吃的?”或是“比较喜欢吃什么?”让大家感觉被照顾到了。点菜后,可以请示“我点了菜,不知道是否合几位的口味”,“要不要再来点其它的什么”等等。 
  点菜时,一定要心中有数。点菜时,可根据以下三个规则
  一看人员组成。一般来说,人均一菜是比较通用的规则。如果是男士较多的餐会可适当加量。
  二看菜肴组合。一般来说,一桌菜最好是有荤有素,有冷有热,尽量做到全面。如果桌上男士多,可多点些荤食,如果女士较多,则可多点几道清淡的蔬菜。
  三看宴请的重要程度。若是普通的商务宴请,平均一道菜在50元到80元左右可以接受。如果这次宴请的对象是比较关键人物,那么则要点上几个够份量的菜,例如龙虾、刀鱼、鲥鱼,再要上规格一点,则是鲍鱼、翅粉等。 
  还有一点需要注意的是,点菜时不应该问服务员菜肴的价格,或是讨价还价,这样会让你公司在客户面前显得有点小家子气,而且客户也会觉得不自在。 
  
  附:中餐点菜指导——三优四忌 
  一顿标准的中式大餐,通常,先上冷盘,接下来是热炒,随后是主菜,然后上点心和汤,如果感觉吃得有点腻,可以点一些餐后甜品,最后是上果盘。在点菜中要顾及到各个程序的菜式。 
  优先考虑的菜肴
  一、有中餐特色的菜肴。宴请外宾的时候,这一条更要重视。像炸春卷、煮元宵、蒸饺子、狮子头、宫爆鸡丁等,并不是佳肴美味,但因为具有鲜明的中国特色,所以受到很多外国人的推崇。 
  二、有本地特色的菜肴。比如西安的羊肉泡馍,湖南的毛家红烧肉,上海的红烧狮子头,北京的涮羊肉,在那里宴请外地客人时,上这些特色菜,恐怕要比千篇一律的生猛海鲜更受好评。 
  三、本餐馆的特色菜。很多餐馆都有自己的特色菜。上一份本餐馆的特色菜,能说明主人的细心和对被请者的尊重。 
  在安排菜单时,还必须考虑来宾的饮食禁忌,特别是要对主宾的饮食禁忌高度重视。这些饮食方面的禁忌主要有四条
  1.宗教的饮食禁忌,一点也不能疏忽大意。例如,穆斯林通常不吃猪肉,并且不喝酒。国内的佛教徒少吃荤腥食品,它不仅指的是肉食,而且包括葱、蒜、韭菜、芥末等气味刺鼻的食物。一些信奉观音的佛教徒在饮食中尤其禁吃牛肉,这点要招待港澳台及海外华人同胞时尤要注意。 
  2.出于健康的原因,对于某些食品,也有所禁忌。比如,心脏病、脑血管、脉硬化、高血压和中风后遗症的人,不适合吃狗肉,肝炎病人忌吃羊肉和甲鱼,胃肠炎、胃溃汤等消化系统疾病的人也不合适吃甲鱼,高血压、高胆固醇患者,要少喝鸡汤等。 
  3.不同地区,人们的饮食偏好往往不同。对于这一点,在安排菜单时要兼顾。比如,湖南省份的人普遍喜欢吃辛辣食物,少吃甜食。英美国家的人通常不吃宠物、稀有动物、动物内脏、动物的头部和脚爪。另外,宴请外宾时,尽量少点生硬需啃食的菜肴,老外在用餐中不太会将咬到嘴中的食物再吐出来,这也需要顾及到。 
  4.有些职业,出于某种原因,在餐饮方面往往也有各自不同的特殊禁忌。例如,国家公务员在执行公务时不准吃请,在公务宴请时不准大吃大喝,不准超过国家规定的标准用餐,不准喝烈性酒。再如,驾驶员工作期间不得喝酒。要是忽略了这一点,还有可能使对方犯错误。 
  
  3——吃菜 
   中国人一般都很讲究吃,同时也很讲究吃相。随着职场礼仪越来越被重视,商务饭桌上的吃和吃相也更加讲究。以下以中餐为例,教你如何在餐桌上有礼有仪,得心应手。 
   中餐宴席进餐伊始,服务员送上的第一道湿毛巾是擦手的,不要用它去擦脸。上龙虾、鸡、水果时,会送上一只小小水孟,其中飘着拧檬片或玫瑰花瓣,它不是饮料,而是洗手用的。洗手时,可两手轮流沾湿指头,轻轻涮洗,然后用小毛巾擦干。 
   用餐时要注意文明礼貌。对外宾不要反复劝菜,可向对方介绍中国菜的特点,吃不吃由他。有人喜欢向他人劝菜,甚至为对方夹菜。外宾没这个习惯,你要是一再客气,没准人家会反感:“说过不吃了,你非逼我干什么?”依此类推,参加外宾举行的宴会,也不要指望主人会反复给你让菜。你要是等别人给自己布菜,那就只好俄肚子。 
   客人入席后,不要立即动手取食。而应待主人打招呼,由主人举杯示意开始时,客人才能开始;客人不能抢在主人前面。夹菜要文明,应等菜肴转到自已面前时,再动筷子,不要抢在邻座前面,一次夹菜也不宜过多。要细嚼慢咽,这不仅有利于消化,也是餐桌上的礼仪要求。决不能大块往嘴里塞,狼吞虎咽,这样会给人留下贪婪的印象。不要挑食,不要只盯住自己喜欢的莱吃,或者急忙把喜欢的菜堆在自己的盘子里。用餐的动作要文雅,夹莱时不要碰到邻座,不要把盘里的菜拨到桌上,不要把汤泼翻。不要发出不必要的声音,如喝汤时“咕噜咕噜”,吃菜时嘴里“叭叭”作响,这都是粗俗的表现。不要一边吃东西,一边和人聊天。嘴里的骨头和鱼刺不要吐在桌子上,可用餐巾掩口,用筷子取出来放在碟子里。掉在桌子上的菜,不要再吃。进餐过程中不要玩弄碗筷,或用筷子直向别人。不要用手去嘴里乱抠。用牙签剔牙时,应用手或餐巾掩住嘴。不要让餐具发出任何声响。 
   用餐结束后,可以用餐巾、餐巾纸或服务员送来的小毛巾擦擦嘴,但不宜擦头颈或胸脯;餐后不要不加控制地打饱嗝或嗳气;在主人还没示意结束时,客人不能先离席。 

4——喝酒 
   俗话说,酒是越喝越厚,但在酒桌上也有很多学问讲究,以下总结了一些酒桌上的你不得不注意的小细节。 
  细节一:领导相互喝完才轮到自己敬酒。敬酒一定要站起来,双手举杯。 
  细节二:可以多人敬一人,决不可一人敬多人,除非你是领导。 
  细节三:自己敬别人,如果不碰杯,自己喝多少可视乎情况而定,比如对方酒量,对方喝酒态度,切不可比对方喝得少,要知道是自己敬人。 
  细节四:自己敬别人,如果碰杯,一句,我喝完,你随意,方显大度。 
  细节五:记得多给领导或客户添酒,不要瞎给领导代酒,就是要代,也要在领导或客户确实想找人代,还要装作自己是因为想喝酒而不是为了给领导代酒而喝酒。比如领导甲不胜酒力,可以通过旁敲侧击把准备敬领导甲的人拦下。 
  细节六:端起酒杯(啤酒杯),右手扼杯,左手垫杯底,记着自己的杯子永远低于别人。自己如果是领导,知趣点,不要放太低,不然怎么叫下面的做人? 
  细节七:如果没有特殊人物在场,碰酒最好按时针顺序,不要厚此薄彼。 
  细节八:碰杯,敬酒,要有说词,不然,我tmd干吗要喝你的酒? 
  细节九:桌面上不谈生意,喝好了,生意也就差不多了,大家心里面了了然,不然人家也不会敞开了跟你喝酒。 
  细节十:假如,纯粹是假如,遇到酒不够的情况,酒瓶放在桌子中间,让人自己添,不要傻不垃圾的去一个一个倒酒,不然后面的人没酒怎么办? 
  
  关于敬酒
  1、主人敬主宾。 
  2、陪客敬主宾。 
  3、主宾回敬。 
  4、陪客互敬。 
  记住:作客绝不能喧宾夺主乱敬酒,那样是很不礼貌,也是很不尊重主人的。
  
  5——倒茶 
   这里所说的倒茶学问既适用于客户来公司拜访,同样也适用于商务餐桌。 
   首先,茶具要清洁。客人进屋后,先让坐,后备茶。冲茶之前,一定要把茶具洗干净,尤其是久置未用的茶具,难免沾上灰尘、污垢,更要细心地用清水洗刷一遍。在冲茶、倒茶之前最好用开水烫一下茶壶、茶杯。这样,既讲究卫生,又显得彬彬有礼。如果不管茶具干净不干净,胡乱给客人倒茶,这是不礼貌的表现。人家一看到茶壶、茶杯上的斑斑污迹就反胃,怎么还愿意喝你的茶呢? 现在一般的公司都是一次性杯子,在倒茶前要注意给一次性杯子套上杯托,以免水热烫手,让客人一时无法端杯喝茶。 
   其次,茶水要适量。先说茶叶,一般要适当。茶叶不宜过多,也不宜太少。茶叶过多,茶味过浓;茶叶太少,冲出的茶没啥味道。假如客人主动介绍自己喜欢喝浓茶或淡茶的习惯,那就按照客人的口胃把茶冲好。再说倒茶,无论是大杯小杯,都不宜倒得太满,太满了容易溢出,把桌子、凳子、地板弄湿。不小心,还会烫伤自己或客人的手脚,使宾主都很难为情。当然,也不宜倒得太少。倘若茶水只遮过杯底就端给客人,会使人觉得是在装模作样,不是诚心实意。 
   再次,端茶要得法。按照我国人民的传统习惯,只要两手不残废,都是用双手给客人端茶的。但是,现在有的年青人不懂得这个规矩,用一只手把茶递给客人了事。双手端茶也要很注意,对有杯耳的茶杯,通常是用一只手抓住杯耳,另一只手托住杯底,把茶端给客人。没有杯耳的茶杯倒满茶之后周身滚烫,双手不好接近,有的同志不管三七二十一,用五指捏住杯口边缘就往客人面前送。这种端茶方法虽然可以防止烫伤事故发生,但很不雅观,也不够卫生。请试想,让客人的嘴舐主人的手指痕,好受吗? 
   添茶。如果上司和客户的杯子里需要添茶了,你要义不容辞地去做。你可以示意服务生来添茶,或让服务生把茶壶留在餐桌上,由你自己亲自来添则更好,这是不知道该说什么好的时候最好的掩饰办法。当然,添茶的时候要先给上司和客户添茶,最后再给自己添。 
  
  6——离席 
   一般酒会和茶会的时间很长,大约都有在两小时以上。也许逛了几圈,认得一些人后,你很快就想离开了。这时候,中途离席的一些技巧,你不能不了解。 
   常见一场宴会进行得正热烈的时候,因为有人想离开,而引起众人一哄而散的结果,使主办人急得真跳脚。欲避免这种煞风景的后果,当你要中途离开时,千万别和谈话圈里的每一个人一一告别,只要悄悄地和身边的两、三个人打个招呼,然后离去便可。 
   中途离开酒会现场,一定要向邀请你来的主人说明、致歉,不可一溜烟便不见了。 
   和主人打过招呼,应该马上就走,不要拉着主人在大门大聊个没完。因为当天对方要做的事很多,现场也还有许多客人等待他(她)去招呼,你占了主人太多时间,会造成他(她)在其他客人面前失礼。 
   有些人参加酒会、茶会,当中途准备离去时,会一一问她所认识的每一个人要不要一块走。结果本来热热闹闹的场面,被她这么一鼓动,一下子便提前散场了。这种闹场的事,最难被宴会主人谅解,一个有风度的人,可千万不要犯下这钟错误。

  喝酒前的准备 
   酒能伤肝,这是人人皆知道的,为了尽量减少酒精对胃和肝脏的伤害,减少脂肪肝的发生。酒前的准备工作很重要,这是能保证你在酒桌上千杯不醉的关键因素。在去赴宴之前,在家先吃点东西,让胃里有点东西垫着。那具体吃点什么好呢?一般吃点高蛋白的比较好,例如吃两个鸡蛋,喝点牛奶,豆浆等,因为这些高蛋白的食品在胃中可以和酒精结合,发生反应,减少对酒精的吸收。另外,吃点饼干,糕点等也可以,让胃里有点东西,因为空腹喝酒,酒精在胃内很容易被吸收,从而导致容易醉酒。注意,切忌用咸鱼、香肠、腊肉下酒,因为此类熏腊食品含有大量色素与亚硝胺,与酒精发生反应,不仅伤肝,而且损害口腔与食道粘膜,甚至诱发癌症。 
   另外,对于经常喝酒或者经常陪酒的人士,可以一试一些古书上记载的方法。如清代无名氏在《调鼎集》载:“饮酒欲不醉者,服硼砂末少许,其饮葛汤,葛丸者效迟”。《千金方》:“七夕日采石菖蒲,末服之,饮酒不醉。” 
  
  喝酒中的保护 
   “酒过三循、菜过五味”,这是古代留下来的酒场谚语,这也从另外一方面说明了,喝酒时吃菜的重要性。在喝酒前,尽量先吃点菜,然后再喝酒,其原理和前面说的一样。严禁空腹喝酒,既容易醉,又容易伤胃。 
  
  喝酒后的醒酒措施 
   喝酒后,头晕,头疼,呕吐,甚至人事不醒,醉酒者要经受很大的痛苦,这个时候需要尽快醒酒,以减少醉酒带来的痛苦,并防止有可能出现的更大的伤害。在这里教你几招醒酒的方法,简单易行,饮酒者可以根据自己的情况,选择适合自己的方法,不妨一试。 
  ★☆饮服白萝卜汁:生白萝卜,洗净榨汁,稍加热服下,每次一茶杯,10分钟一次,三次可解去酒气。 
  ★☆吃大白菜心:取出大白菜心切丝,一个不够取两,加少量白糖和白醋拌匀后腌渍三五分钟服下,此法很快解酒。 
  ★☆服芹菜汁:鲜芹菜洗净切碎榨汁,当茶喝,连续喝三次(隔5分钟),此对酒后头痛脑胀脸红有特效。 
  ★☆饮鲜桔皮水:2两鲜桔皮加1斤水煮沸,再加入少量食盐摇匀后当茶喝,一次一茶杯,5分钟再饮,三次见效。 
  ★☆喝绿豆汁:绿豆2两,加水煮熟后饮,连汤带豆.如将绿豆捣碎用开水冲服有解酒效果。 
  另外怎么来减少醉酒后引起的头疼,头晕,反胃等症状呢?下面也介绍几种食物,这是美国国家头痛研究基金会的研究人员发现,大家不妨做一个参考: 
  ★☆蜂蜜水治酒后头痛:蜂蜜中含有一种特殊的果糖,可以促进酒精的分解吸收,减轻头痛症状,尤其是红酒引起的头痛。另外,蜂蜜还有催眠作用,能使人很快入睡,第二天起床后也不会头痛。 
  ★☆西红柿汁治酒后头晕:西红柿汁也富含特殊果糖,能帮助促进酒精分解,一次饮用300毫升以上,能使酒后头晕感逐渐消失。饮用前若加入少量食盐,还有助于稳定情绪。 
  ★☆新鲜葡萄治酒后反胃、恶心:如果在饮酒前吃,还能有效预防醉酒。 
  ★☆西瓜汁治酒后全身发热:西瓜具可以清热去火,能加速酒精从尿液中排出。 
  ★☆柚子消除口中酒气:柚肉蘸白糖吃,对消除酒后口腔中的酒气有很大帮助。 
  ★☆芹菜汁治酒后胃肠不适、颜面发红:这是因为芹菜中含有丰富的B族维生素,能分解酒精。 
  ★☆酸奶治酒后烦躁:酸奶能保护胃黏膜、延缓酒精吸收,其中钙含量丰富,对缓解酒后烦躁尤其有效。 
  ★☆香蕉治酒后心悸、胸闷:酒后吃1—3根香蕉,能增加血糖浓度,降低酒精在血液中的比例,达到解酒目的。同时,它还能减轻心悸症状、消除胸口郁闷。 
  ★☆橄榄治酒后厌食:橄榄自古以来就是醒酒、清胃热、促食欲的“良药”,既可直接食用,也可加冰糖炖服。 
  
  都以为茶能解酒,却不知就这样被“贻误”多年——
  
  酒后忌饮茶
   李时珍在《本草纲目》中记载:酒后饮茶伤肾,腰腿坠重,膀胱冷痛,兼患痰饮水肿。现代医学研究也指出,茶水会刺激胃酸分泌,使酒精更容易损伤到胃黏膜;同时,茶水中的茶碱和酒精一样会导致心跳加速,更加重了心脏负担。
  
  醒酒的药物
   目前市场上面出现不少醒酒的药物,例如海王金樽,“客格博”胶囊,陪酒师”解酒茶,还有一种美国进口的ZEO等等,那么这些药物真的有效吗?说到底,所谓的醒酒药物无非都是通过以下两个途径来达到醒酒的目的的:一是能迅速分解究竟,使酒精失去功效,或者阻断酒精在胃肠中的吸收,减少酒精进入血液的量,这样自然也可以达到醒酒的目的。但是,不管什么醒酒药物,也不管其功效如何神奇,都是有一定副作用的,不能常吃,尤其对那些经常陪酒或者经常需要应酬的人,更是如此。一般情况下不要吃,因为即使你吃药了,酒精还是进入了体内,对肝脏造成伤害,最好的是不喝,必须要喝的时候,也先用别的方法来醒酒。 
  
  醉酒后的照顾
   醉酒者自己往往不知道自己的行为,无法来自己照顾自己,那么作为亲人或者朋友就必须照顾好,要注意一下几个方面: 
  1.醉酒者如行走不稳,应该注意不要让其跌倒,防止跌打损伤,或者磕碰头部等重要部位。 
  2.注意保暖,因为醉酒者身体机能下降,这个时候容易受凉。让醉酒者的头歪向一侧,防止其呕吐,如果有呕吐,要清除其口腔内的呕吐物,防止进入气管,导致窒息或者肺部感染。 
  3.醉酒较严重者,并且无法服用醒酒品的,则应该使其将胃内容物吐出来,可以用手指,棉棒等插入其咽喉部位来使其呕吐。必要时还可以用温水或2%碳酸氢钠液洗胃。更严重者则赶紧拨打120或者马上送医院急救。
posted @ 2008-06-22 18:18 tangdh 阅读(44) | 评论 (0)编辑
 
=ROUND(MAX((B2-C2-2000)*0.05*{1,2,3,4,5,6,7,8,9}-25*{0,1,5,15,55,135,255,415,615},0),2)
=ROUND(MAX((B2-C2-2000)*{0.05,0.10,0.15,0.20,0.25,0.30,0.35,0.40,0.45}-{0,25,125,375,1375,3375,6375,10375,15375},0),2)
posted @ 2008-06-22 17:47 tangdh 阅读(60) | 评论 (0)编辑

2008年6月19日

成都信息工程学院ftp

ftp://xsc.cuit.edu.cn/

大连理工大学

ftp://ftp.dlut.edu.cn ;

上海交通大学

ftp://ftp.shnet.edu.cn ;

ftp://mssite.sjtu.edu.cn ;

同济大学

ftp://ftp.tongji.edu.cn ;

南京大学

ftp://ftp.nju.edu.cn ;

南京邮电学院

ftp://ftp.njupt.edu.cn/ ;

南京理工大学

ftp://ftp.njnet.edu.cn/ ;

浙江大学

ftp://ftp.zju.edu.cn/ ;

科学技术大学

ftp://ftp.ustc.edu.cn ;

厦门大学

ftp://ftp.xmu.edu.cn ;

山东大学

ftp://ftp.sdu.edu.cn ;

哈尔滨工业大学
ftp://ftp.hit.edu.cn ;

哈尔滨建筑大学
ftp://hrbucea.edu.cn ;

武汉测绘科技大学

ftp://ftp.wtusm.edu.cn ;

武汉水利电力大学

ftp://ftp.wuhee.edu.cn/ ;

中南财经大学
ftp://ftp.znufe.edu.cn/ ;

中南工业大学
ftp://ftp.csut.edu.cn ;

上海理工大学ftp
202.120.223.50

用户名:download

密码:usstdown

教育ftp站点

221.6.101.26

用户名:guest

密码:guest

山东大学英语学习ftp
ftp://211.87.235.172/

请单线程下载

清华java服务器。

ftp://java:java@166.111.164.21
东北师大FTP

202.198.128.107

成都理工大学 FTP 服务器

http://ftp.cdut.edu.cn/
郑州航院视频中心,内容丰富

202.196.160.15

哈工大FTP

ftp://ftp.hagongda.com/ ;;

有人数限制的,人太多了进不去的!

东北师大FTP(影视教学齐全)
ftp://202.198.128.107

清华C语言服务器
ftp://cpp:cpp@166.111.168.29

上海电力学院

哪个地方有LOTUS 5设计教程

公用Ftp服务器:210.35.88.9

校外上传用户名:suepoutup 密码:suepoutup

校外下载用户名:suepoutdown 密码:suepoutdown

FTP16(铁通北分网络FTP站点)

地址: ftp://ftp.crcbj.com ;

帐号: crcbj 密码: crcbj

山东大学2003年本科教学优秀课件

ftp://202.194.14.235/ecourse/

主机名: ftp.gdut.edu.cn

用户名: gdut

密码: 2003gdut@ftp

端口: 21


清华大学

ftp://www.lib.tsinghua.edu.cn ;

ftp://ftp.net.edu.cn ;

 

北京大学

ftp://www.lib.pku.edu.cn ;

ftp://ftp.pku.edu.cn ;

 

北京邮电大学

ftp://ftp.bupt.edu.cn ;

ftp://ftp.buptnet.edu.cn ;

 

华中理工大学

ftp://ftp.whnet.edu.cn

ftp://nlcc.hust.edu.cn

ftp://dlbftp.dhs.org

ftp://202.114.22.148

ftp://iprai.hust.edu.cn

ftp://ia.hust.edu.cn

 

暨南大学

ftp://202.116.9.61 ;

ftp://202.116.9.59 ;

 

大连理工大学

ftp://ftp.dlut.edu.cn ;

 

上海交通大学

ftp://ftp.shnet.edu.cn ;

ftp://mssite.sjtu.edu.cn ;

 

同济大学

ftp://ftp.tongji.edu.cn ;

 

河北师范大学的FTP

地址:ftp.hebtu.edu.cn

用户:movie

密码:movie

端口:21

 

西安电子

ftp:// 202.117.35.170

内有大量资料

 

成都理工大学的ftp

里面有很多unix和linux的资料和系统及工具哦~~~

速度不错~~~~~强烈推荐!!!!

http://ftp.cdut.edu.cn/

 

同济大学FTP主页(各类教育FTP)

http://tjftp.tongji.net/

不要密码

 

南开大学数学学院匿名ftp

ftp://ftp.math.nankai.edu.cn/

 

山东大学软件学院教学课件ftp

ftp://211.87.226.11/Downloads

ftp://211.87.226.11/skonline/study

 

北京信息工程学院

ftp://pubftp.biti.edu.cn/

ftp://ftp.biti.edu.cn/

 

上海理工大学ftp

202.120.223.50【软件、学习】

用户名:download

密码:usstdown

 

南开大学数学学院FTP服务器

匿名 

202.113.29.4

 

清华大学FTP(匿名)

ftp.tsinghua.edu.cn

 

南大的三个ftp

ftp://ftp.nju.edu.cn

ftp://ftp2.nju.edu.cn/

ftp://thephy.nju.edu.cn/

 

扬州大学ftp服务器

202.195.62.11

不用密码

 

清华31CD的网络课程ftp下载

FTP:218.2.183.165

端口:21

用户名:guest

密码:yuanding

 

中山大学

ftp://ftp.zsu.edu.cn

 中南工业大学

ftp://ftp.csut.edu.cn ;

 广东大学FTP站点

主机名: ftp.gdut.edu.cn

用户名: gdut

密码: 2003gdut@ftp

端口: 21

 同济大学ftp

ftp://plinux.org ;;24小时开机

匿名,最大用户数100,速度50kb/s。【游戏,教学,软件,电子书籍,音乐,少量动画】

 中山大学化学与化学工程学院FTP服务器

202.116.83.77

 西安交大,西工大课件之FTP

ftp://www.slsz.com/

匿名登录。

 

西安交大ftp

主机名: ftp.xjtu.edu.cn

匿名

端口: 21

ftp地址                名字       内容                速度星级
202.115.112.29 光华影院 有很多电影、音乐、工具 ★★★★★

202.112.94.136 北京师范大学 有音乐、游戏、软件,好象没有电影 ★★★★★

166.111.168.118 清华大学 音乐…… ★★★

166.111.168.168 清华大学 动画、音乐、书 ★★★★

166.111.168.18 清华大学 电影、音乐 ★★★★

166.111.168.6 清华大学 动画、音乐、游戏、软件 ★★★★

162.105.92.40 北京大学 mp3、mtv、flash、少量电影 ★★★

162.105.90.53 北京大学 mp3、mtv、大量软件、game、少量电影 ★★★★

162.105.56.6 北京大学 有很多电影,值得一看 ★★★★

162.105.90.54 北京大学 mp3、mtv、flash、少量电影 ★★★

162.105.43.253 北京大学 有不少电影,分类比较清楚 ★★★★

166.111.65.6 清华大学 有非常多电影 ★★★★

166.111.174.33 清华大学 有电影很音乐,电影非常多 ★★★

166.111.162.27 清华大学 没什么电影,但软件真的很多 ★★★

166.111.168.8 清华大学 有大话西游的DivX版 ★★★

166.111.60.159 清华大学 电影很少 ★★

202.112.94.136 北京师范大学 有很多东西,不过没有电影 ★★★★

202.112.105.119 北京邮电大学 有十多部电影、还有书、软件、字体库等 ★★★★

tracy.bupt.edu.cn 北京邮电大学 有很多东西,不过好象没有电影 ★★★★

202.38.240.223 华南理工大学 音乐、书籍、墙纸、少量电影、其它 ★★★

202.38.248.1 华南理工大学 有十多部电影、音乐和其它东西 ★★★

ftp.nju.edu.cn 没什么电影,但还有很多其他东西 ★★★★★

ftp.xjtu.edu.cn 西交 电影非常多,还有很多东西。 ★★★★★

vod.sjtu.edu.cn 上海交通大学 电影不少,不过是拼音命名的。 ★★★★

ftp://ftp.nju.edu.cn ftp://ftp2.nju.edu.cn 
 

posted @ 2008-06-19 23:26 tangdh 阅读(107) | 评论 (0)编辑

2008年6月5日

WIN2003下直接就是netsh IPSEC命令,XP系统用ipseccmd,2000下用ipsecpol,常用的参数如下:
     -w reg 表明将配置写入注册表,重启后仍有效。
  -p 指定策略名称,如果名称存在,则将该规则加入此策略,否则创建一个。
  -r 指定规则名称。
  -n 指定操作,可以是BLOCK、PASS或者INPASS,必须大写。
  -x 激活该策略。
  -y 使之无效。
  -o 删除-p指定的策略。
  其中最关键的是-f。它用来设置你的过滤规则,格式为
  A.B.C.Dmaskport=A.B.C.Dmaskportprotocol。其中=前面的是源地址,后面是目的地址。如果使用+,则表明此规则是双向的。IP地址中用*代表任何IP地址,0代表我自己的IP地址。还可以使用通配符,比如144.92.. 等效于 144.92.0.0255.255.0.0。使用ipseccmd 可以获得它的帮助。
  如果希望将规则删除,需要先使用-y使之无效,否则删除后它还会持续一段时间。


myipsec2003.bat:
rem 添加安全策略名称
netsh ipsec static add policy name=我的安全策略

rem 添加 IP筛选器列表
netsh ipsec static add filterlist name=允许列表
netsh ipsec static add filterlist name=拒绝列表

rem 添加筛选器到IP筛选器列表(允许上网成功)
netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=any description=web访问 protocol=tcp mirrored=yes dstport=80
netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=any description=dns访问 protocol=tcp mirrored=yes dstport=53
netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=any description=dns访问 protocol=udp mirrored=yes dstport=53
rem 共享别机打印成功
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.77 description=打印 protocol=tcp mirrored=yes dstport=139
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.77 description=打印 protocol=udp mirrored=yes dstport=138
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.77 description=打印 protocol=udp mirrored=yes dstport=137
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.77 description=打印 protocol=tcp mirrored=yes dstport=445
rem 服务器
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.201 description=服务器 protocol=tcp mirrored=yes dstport=139
  netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.201 description=服务器 protocol=udp mirrored=yes dstport=138
  netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.201 description=服务器 protocol=udp mirrored=yes dstport=137
  netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.201 description=服务器 protocol=tcp mirrored=yes dstport=445
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.203 description=服务器 protocol=tcp mirrored=yes dstport=139
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.203 description=服务器 protocol=udp mirrored=yes dstport=138
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.203 description=服务器 protocol=udp mirrored=yes dstport=137
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.203 description=服务器 protocol=tcp mirrored=yes dstport=445
  netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.202 description=服务器 protocol=tcp mirrored=yes dstport=139
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.202 description=服务器 protocol=udp mirrored=yes dstport=138
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.202 description=服务器 protocol=udp mirrored=yes dstport=137
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.202 description=服务器 protocol=tcp mirrored=yes dstport=445
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.105 description=服务器 protocol=tcp mirrored=yes dstport=139
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.105 description=服务器 protocol=udp mirrored=yes dstport=138
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.105 description=服务器 protocol=udp mirrored=yes dstport=137
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.105 description=服务器 protocol=tcp mirrored=yes dstport=445
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.88 description=服务器 protocol=tcp mirrored=yes dstport=139
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.88 description=服务器 protocol=udp mirrored=yes dstport=138
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.88 description=服务器 protocol=udp mirrored=yes dstport=137
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.88 description=服务器 protocol=tcp mirrored=yes dstport=445

 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.155 description=服务器 protocol=tcp mirrored=yes dstport=139
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.155 description=服务器 protocol=udp mirrored=yes dstport=138
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.155 description=服务器 protocol=udp mirrored=yes dstport=137
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.155 description=服务器 protocol=tcp mirrored=yes dstport=445
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=200.200.200.155 description=服务器 protocol=udp mirrored=yes dstport=445

  netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=any description=ping访问 protocol=ICMP mirrored=yes
 
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=any description=sybase访问 protocol=tcp mirrored=yes dstport=5000
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=any description=dameware protocol=tcp mirrored=yes dstport=6129
 netsh ipsec static add filter filterlist=允许列表  srcaddr=any dstaddr=me description=remotelyanywhere protocol=tcp mirrored=yes dstport=2000
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=any description=pcanywhere protocol=tcp mirrored=yes dstport=5631
 netsh ipsec static add filter filterlist=允许列表  srcaddr=me dstaddr=any description=pcanywhere protocol=udp mirrored=yes dstport=5632

rem 添加筛选器到IP筛选器列表(不让别人访问)
 netsh ipsec static add filter filterlist=拒绝列表  srcaddr=any dstaddr=me description=别人到我任何访问 protocol=any mirrored=yes
 netsh ipsec static add filter filterlist=拒绝列表  srcaddr=me dstaddr=any description=我到任何访问 protocol=any mirrored=yes

rem 添加筛选器操作
netsh ipsec static add filteraction name=可以  action=permit
netsh ipsec static add filteraction name=不可以  action=block


rem 创建一个链接指定 IPSec 策略、筛选器列表和筛选器操作的规则(加入规则到我的安全策略)
netsh ipsec static add rule name=允许规则  policy=我的安全策略 filterlist=允许列表 filteraction=可以
netsh ipsec static add rule name=拒绝规则  policy=我的安全策略 filterlist=拒绝列表 filteraction=不可以

rem 激活我的安全策略
netsh ipsec static set policy name=我的安全策略 assign=y

rem 总结一下,策略policy(规则rule(筛选器列表filterlist(筛选器filter))—筛选器操作filteraction)
rem netsh ipsec static delete policy name=我的安全策略
rem netsh ipsec static delete policy all
rem netsh ipsec static show policy all
rem netsh firewall delete portopening TCP 2000

myipsecdel.bat:
netsh ipsec static delete policy name=我的安全策略
rem netsh ipsec static delete policy all


winxpipsec.bat:

rem 设置策略名称及策略中包括的规则详细内容

ipseccmd -w REG -p "Block default ports" -y
ipseccmd -w REG -p "Block default ports" -o
ipseccmd -w REG -p "Block default ports" -r "Block all" -f 0+* -n BLOCK

rem ipseccmd -w REG -p "Block default ports" -r "Block TCP/135" -f *+0:135:TCP -n BLOCK
rem ipseccmd -w REG -p "Block default ports" -r "Block TCP/139" -f *+0:139:TCP -n BLOCK
rem ipseccmd -w REG -p "Block default ports" -r "Block TCP/445" -f *+0:445:TCP -n BLOCK
rem ipseccmd -w REG -p "Block default ports" -r "Block UDP/123" -f *+0:123:UDP -n BLOCK
rem ipseccmd -w REG -p "Block default ports" -r "Block UDP/135" -f *+0:135:UDP -n BLOCK
rem ipseccmd -w REG -p "Block default ports" -r "Block UDP/137" -f *+0:137:UDP -n BLOCK
rem ipseccmd -w REG -p "Block default ports" -r "Block UDP/138" -f *+0:138:UDP -n BLOCK
rem ipseccmd -w REG -p "Block default ports" -r "Block UDP/139" -f *+0:139:UDP -n BLOCK
rem ipseccmd -w REG -p "Block default ports" -r "Block UDP/445" -f *+0:445:UDP -n BLOCK

ipseccmd -w REG -p "Block default ports" -r "allow server" -f 0+200.200.200.201:445:UDP -n PASS
ipseccmd -w REG -p "Block default ports" -r "allow server" -f 0+200.200.200.201:445:TCP -n PASS

rem ipseccmd -w REG -p "Block default ports" -r "allow server" -f 0+200.200.200.201:137:UDP -n PASS
rem ipseccmd -w REG -p "Block default ports" -r "allow server" -f 0+200.200.200.201:138:UDP -n PASS
rem ipseccmd -w REG -p "Block default ports" -r "allow server" -f 0+200.200.200.201:139:tcp -n PASS

 

ipseccmd -w REG -p "Block default ports" -r "allow print" -f 0+200.200.200.77:445:UDP -n PASS
ipseccmd -w REG -p "Block default ports" -r "allow print" -f 0+200.200.200.77:445:TCP -n PASS
ipseccmd -w REG -p "Block default ports" -r "allow print" -f 0+200.200.200.77:137:UDP -n PASS
ipseccmd -w REG -p "Block default ports" -r "allow print" -f 0+200.200.200.77:138:UDP -n PASS
ipseccmd -w REG -p "Block default ports" -r "allow print" -f 0+200.200.200.77:139:tcp -n PASS

ipseccmd -w REG -p "Block default ports" -r "allow sqlserver" -f 0+*:1433:tcp -n PASS

ipseccmd -w REG -p "Block default ports" -r "allow sybase" -f 0+*:5000:tcp -n PASS
ipseccmd -w REG -p "Block default ports" -r "allow sybase" -f 0+*:5001:tcp -n PASS
ipseccmd -w REG -p "Block default ports" -r "allow sybase" -f 0+*:5002:tcp -n PASS


ipseccmd -w REG -p "Block default ports" -r "allow dameware" -f 200.200.200.106+0:6129:tcp -n PASS
ipseccmd -w REG -p "Block default ports" -r "allow pcanywhere" -f 200.200.200.106+0:5631:tcp -n PASS

ipseccmd -w REG -p "Block default ports" -r "allow firebird" -f 0+*:211:tcp -n PASS
ipseccmd -w REG -p "Block default ports" -r "allow firebird" -f 0+*:3050:tcp -n PASS

ipseccmd -w REG -p "Block default ports" -r "allow ping" -f *+*::ICMP -n PASS
ipseccmd -w REG -p "Block default ports" -x
rem 激活此策略

winxpipsec_del.bat:
rem 不指派,第一条先不指派此策略,第二条再删除此策略
ipseccmd -w REG -p "Block default ports" -y
ipseccmd -w REG -p "Block default ports" -o

win2000ipsec.bat:

rem 设置策略名称及策略中包括的规则详细内容

rem ipsecpol -w REG -p "Block default ports" -y
rem ipsecpol -w REG -p "Block default ports" -o
ipsecpol -w REG -p "Block default ports" -r "Block all" -f 0+* -n BLOCK
rem ipsecpol -w REG -p "Block default ports" -r "Block TCP/135" -f *+0:135:TCP -n BLOCK
rem ipsecpol -w REG -p "Block default ports" -r "Block TCP/139" -f *+0:139:TCP -n BLOCK
rem ipsecpol -w REG -p "Block default ports" -r "Block TCP/445" -f *+0:445:TCP -n BLOCK
rem ipsecpol -w REG -p "Block default ports" -r "Block UDP/123" -f *+0:123:UDP -n BLOCK
rem ipsecpol -w REG -p "Block default ports" -r "Block UDP/135" -f *+0:135:UDP -n BLOCK
rem ipsecpol -w REG -p "Block default ports" -r "Block UDP/137" -f *+0:137:UDP -n BLOCK
rem ipsecpol -w REG -p "Block default ports" -r "Block UDP/138" -f *+0:138:UDP -n BLOCK
rem ipsecpol -w REG -p "Block default ports" -r "Block UDP/139" -f *+0:139:UDP -n BLOCK
rem ipsecpol -w REG -p "Block default ports" -r "Block UDP/445" -f *+0:445:UDP -n BLOCK

 

rem ipsecpol -w REG -p "Block default ports" -r "allow UDP/137" -f *+0:137:UDP -n PASS
rem ipsecpol -w REG -p "Block default ports" -r "allow UDP/138" -f *+0:138:UDP -n PASS
rem ipsecpol -w REG -p "Block default ports" -r "allow UDP/139" -f *+0:139:UDP -n PASS
rem ipsecpol -w REG -p "Block default ports" -r "allow tcp/139" -f *+0:139:tcp -n PASS

ipsecpol -w REG -p "Block default ports" -r "allow tcP/445" -f *+0:445:tcp -n PASS
ipsecpol -w REG -p "Block default ports" -r "allow UDP/445" -f *+0:445:udp -n PASS

rem ipsecpol -w REG -p "Block default ports" -r "allow sybase" -f 0+*:5000:tcp -n PASS
ipsecpol -w REG -p "Block default ports" -r "allow sybase" -f *+0:5000:tcp -n PASS
ipsecpol -w REG -p "Block default ports" -r "allow sybase sqlserver5001" -f *+0:5001:tcp -n PASS
ipsecpol -w REG -p "Block default ports" -r "allow sybase sqlserver5002" -f *+0:5002:tcp -n PASS
ipsecpol -w REG -p "Block default ports" -r "allow sqlserver" -f *+0:1433:tcp -n PASS
ipsecpol -w REG -p "Block default ports" -r "allow pcanywhere tcp" -f 200.200.200.106+0:5631:tcp -n PASS
ipsecpol -w REG -p "Block default ports" -r "allow pcanywhere udp" -f 200.200.200.106+0:5632:udp -n PASS

ipsecpol -w REG -p "Block default ports" -r "allow dameware" -f 200.200.200.106+0:6129:tcp -n PASS
rem ipsecpol -w REG -p "Block default ports" -r "allow firebird" -f 0+*:211:tcp -n PASS
ipsecpol -w REG -p "Block default ports" -r "allow firebird211" -f *+0:211:tcp -n PASS
ipsecpol -w REG -p "Block default ports" -r "allow firebird3050" -f *+0:3050:tcp -n PASS
ipsecpol -w REG -p "Block default ports" -r "allow ping" -f 0+*::ICMP -n PASS
ipsecpol -w REG -p "Block default ports" -x
rem 激活此策略


 win2000ipsec_del.bat:
 rem 不指派,第一条先不指派此策略,第二条再删除此策略
ipsecpol -w REG -p "Block default ports" -y
ipsecpol -w REG -p "Block default ports" -o





posted @ 2008-06-05 19:20 tangdh 阅读(80) | 评论 (0)编辑

2008年5月27日

--21 先把你的程序移植到pb11.2,用pb11打开workspace和target即可,pb11.2自动移植,调试能在c/sx下运行正常
       转换前,请先安装ASPAJAXExtSetup.msi(到http://www.asp.net下载)
--22 开始转换了,菜单操作file>New打开[New]选择窗口选[target] - .NET Web Forms Application按向导操作即可,
        step1 关于向导的介绍
        step2 选Use an existing library and application object
        step3 找到你的程序入口即application object
        step4 加上你所用的pbl文件
        step5 命名pbt文件名,也可直接下一步[next>]
        step6 命名project object,也可直接下一步[next>]
        step7 输入你在iis里的虚拟目录,也可直接下一步[next>]
        step8 加上你用的资源文件,如有连接数据库的ini文件,要在此加入
        step9 如果你用了第三方的动太库dll,在这里加上,没有就[next>]
        step10 如果你想用了javascript,在这里加吧,我没有这玩意。
        step11 你要发布的web服务器
        step12 汇总一下你的选择,[Finish>],伟大的.net Web forms创建完成
        step13 发布吧,Deploy Project,你只要点一个按钮即可,
发布过程如下:
 先检查你的iis是否服务
 生成.NET assembly 文件
 生成PBD文件
 拷贝文件到IIS服务器
 发布完成

step14 激动人心的时刻到了,换台机器用ie打开你的程序(看你的具体的ip地址、虚拟目录)http://gst-susue/oands
经过漫长的等待,asp.net第一次运行要先编译一下,下次就快点了。

step15 “我转换成功了,我转换成功了!”
   如图

posted @ 2008-05-27 16:04 tangdh 阅读(297) | 评论 (1)编辑

2006年3月25日

     摘要: 在前幾個章節所介紹的TreeView([ASP.NET 2.0]SiteMapPath無法正確指到帶有QueryString的路徑、[ASP.NET 2.0]SiteMapPath WebControl)有個限制(至少我覺得是限制),那就是只能使用XML的資料格式但假如我們的資料是資料庫形式的資料該怎麼辦?有兩個解決方法:一是自己寫程式,將節點加到TreeViewNode裡;一是另外寫個類似Tre... 阅读全文
posted @ 2006-03-25 12:18 tangdh 阅读(1005) | 评论 (1)编辑

2005年2月4日

本文讨论:

常见的 ASP.NET 性能神话 
有用的 ASP.NET 性能技巧和诀窍 
在 ASP.NET 中处理数据库的一些建议 
缓冲以及用 ASP.NET 进行后台处理 
本文使用下列技术:ASP.NET,.NET 框架,IIS

  用 ASP.NET 编写 Web 应用程序其轻松程度令人难以置信。它是如此的容易,以至于许多开发人员不用花费多少时间来构筑其应用便能获得非常好的性能。在本文中,我将给出10个编写高性能 Web 应用的技巧。我的评论不仅仅局限与 ASP.NET 应用,因为它们只是 Web 应用的一个子集。本文也不是 Web 应用性能调整的权威指南——这方面的内容可以写成一本书。相反,本文可以被视作一个好的起点。
  在废寝忘食地工作之前,我常常要去攀岩。在攀岩之前,我总是要看一下指南手册中的线路并阅读以前来此一游的人留下的建议和忠告。但是,不管指南手册有多磨好,在尝试一次特定的具有挑战性的攀爬之前,你都必须付诸实际的行动。同样,在你面临解决的性能问题或者营运一个高吞吐量的站点之前,你只能想方设法编写高性能 Web 应用程序。
  我们个人经验来自在微软 ASP.NET 团队从事底层架构程序经理,运行和管理 www.asp.net ,并协助架构 Community Server 过程中的经历,Community Server 是几个有名的 ASP.NET 应用程序的下一个版本(它将 ASP.NET Forums,.Text 和 nGallery 整合到一个平台)。我确信这些帮助过我的技巧也会对你有所裨益。
  你应该考虑将应用程序分离成几个逻辑层。你可能听说过术语3-层(或n-层)物理体系结构。它们通常是跨进程和/或硬件对功能进行物理划分的规定的体系结构模式。当系统需要伸缩时,更多的硬件能被添加。然而,总是应该避免与进程和机器忙碌程度相关的性能问题。所以,不管什么时候,只要可能,都要在相同的应用中一起运行 ASP.NET 页面及其相关的组件。
  由于代码和层之间的边界分离,使用 Web 服务或远程调用将降低20%以上的性能。
  数据层则稍微有些不同,因为数据库通常都用专门的硬件。但是,数据库的处理成本仍然很高,因此最优化代码时,数据层的性能应该是首当其充要关注的地方。
  在着手解决你的应用程序的性能问题之前,一定要剖析应用程序,确定问题之所在。获取关键的性能计数器值(如实现垃圾收集所花时间之百分比的性能计数器的值)对于查找应用程序在何处最耗时也是非常重要的。凭借直觉常常也能找到耗时所在。
  本文所描述的性能改进有两种类型:大型优化,如使用 ASP.NET Cache,以及不断重复进行的微型优化。这些微型优化有时很有意思。对代码的小小改动便会引起很大的动静,产生成千次的调用。对于大型优化,你可能会看到整体性能的大跳跃。而对微型优化,给定请求可能只是毫秒级的调整,但按每天的请求总数计算,其结果的改进可能是巨大的。

数据层的性能

  当调整某个应用程序的性能时,有一个简单的试金石,你可以用它按先后次序:检查代码是否存取数据库?如果是,多长时间存取一次?注意相同的测试也可以被应用于使用 Web 服务或远程调用的代码,但我们本文中不涉及这方面内容。
  如果在特定的代码流程中必须具有对数据库的请求以及要考察其它方面,如:想对字符串处理进行优先优化,那么暂且把它放一放,先按照上面定好的优先次序来做。除非你有异乎寻常的性能问题,否则你的时间应该用在尝试最优化与数据库的连接所花的时间,返回的数据量以及多长时间往返一次和数据库的通讯上。
  有了这些概括信息,下面就让我们来看看能帮助你改善应用程序性能的十个技巧。我将从能获得最显著效果的改变开始。

技巧 1 —— 返回多个结果集

  复审你的数据库代码,看看是否有多于一次的对数据库的访问请求。这样每次往返数据库都降低你的应用程序能处理的每秒请求数。通过在单个数据库请求中返回多结果集,你能降低与数据库通信的总体时间。同时你也将使系统更具伸缩性,因为你减少了数据库服务器处理请求的负担。
  虽然你可以用动态 SQL 返回多结果集,我更喜欢使用存储过过程。是否将业务逻辑驻留在存储过程当中是个有待争论的问题,但我认为,如果存储过程中的逻辑能约束返回的数据(降低数据集的尺寸,在网络上传输的时间以及逻辑层不必过虑数据),这是一件好事情。
  使用 SqlCommand 命令实例及其 ExecuteReader 方法来处理强类型的各个业务类,你通过调用 NextResult 可以向前移动结果集指针。Figure 1 示范了处理几个带类型的 ArrayLists 例子会话。从数据库只返回你需要的数据还会降低服务器上内存的分配。

技巧 2 —— 分页数据存取

  ASP.NET DataGrid 提供了非常好的能力:数据分页支持。当启用 DataGrid 中的分页功能,则每次只显示固定数量的记录。此外,分页用户界面也会显示在 DataGrid 底部用于导航记录。分页用户界面允许你向前向后导航所显示的记录,一次显示固定数量的记录。
  有一个美中不足的是用 DataGrid 分页需要将所有数据邦定到此栅格控件(gird)。例如,你的数据层必须返回所有数据,然后 DataGrid 将根据当前页过滤掉所有显示的记录。当你通过 DataGrid 进行分页时,如果有 100,000 条记录被返回,那么每个请求有 99,975 条记录将被废弃掉(假设页尺寸为 25)。当记录数不断增加,此应用程序的性能便会遭受痛苦,因为每次请求所要发送的数据会越来越多。
  编写较好的分页代码的一个好的方法是用存储过程。Figure 2 示范了一个用 Northwind 数据库中 Orders 表通过存储过程分页的例子。很简单,只要你在页面中传递索引以及页尺寸即可。相应的结果集先被计算然后被返回。
  在 Community Server 中,我们编写了几个分页控件来完成数据分页。你将会看到,我使用了技巧 1 中讨论的思路,从一个存储过程中返回连个结果集:总记录数和请求的数据。
  返回的总记录数依赖于所执行的查询不同而不同。例如,某个 WHERE 子句可被用于约束返回的数据。为了计算在分页用户界面显示的总页数,返回的总记录数必须是已知的。例如,如果有 1,000,000 条记录,用一个 WHERE 子句对之过滤后为 1,000 条记录,则分页逻辑必须要知道总记录数以便在分页用户界面中正确呈现。

技巧 3 —— 连接池

  建立 Web 应用程序与 SQL Server 之间的 TCP 连接是一项昂贵的操作。微软的开发人员利用连接池技术已经有好长一段时间了,这个技术使他们能重用到数据库的连接。而不是每次请求都建立新的 TCP 连接,新连接仅在连接池中得不到连接时才建立。当连接被关闭时,它被返回到连接池中,在那里它仍然保持与数据库的连接,与完全断开 TCP 连接相反。
  当然,你需要提防泄漏的连接。当你处理完毕,一定要关闭连接。重申一次:不管人们怎么吹嘘微软 .NET 框架中的垃圾收集特性,每当你处理完毕,一定要显式地调用连接对象的 Close 或 Dispose 方法。不要指望公共语言运行时(CLR)来为你定时清除和关闭连接。CLR 最终将销毁类并强行关闭连接,但你无法保证该对象的垃圾收集届时会起作用。
  为了充分用好连接池,有几条规则必须了然于心。首先,打开连接,进行处理,然后关闭连接。宁愿每个请求的连接打开和关闭多次,也不要保持连接打开状态以及在不同的方法间将它传来传去。其次,使用相同的连接串(如果你使用集成身份检查,那么也要用相同的线程身份)。如果你不用相同的连接串,例如,根据登录用户来定制连接串,你将无法得到连接池所提供的相同的最优化值。当模拟大用户量情形时,如果你使用集成身份检查,那么你的连接池将效力大减。.NET CLR 数据性能计数器在试图跟踪任何与连接池有关的性能问题时是非常有用的。
  不管什么时候,只要你的应用程序连接到运行在其它进程中的资源,比如某个数据库,你都应该针对连接到资源所耗时间,发送和接收数据所耗时间以及往返次数进行优化。为了实现较好的性能,应该首当其充优化应用程序中任何种类的忙碌进程。
  应用层包含到数据层的连接以及将数据转换成有意义的类实例和业务处理的逻辑。以 Community Server 为例,你要在其中处理 Forums 和 Threads 集合;以及应用许可这样的业务规则;尤其重要的是缓冲(Caching)逻辑也实现其中。

技巧 4 —— ASP.NET Cache API

  在编写代码之前要做的头等大事之一是最大限度地构建应用层并发掘 ASP.NET 的 Cache 特性。
  如果你的组件在 ASP.NET 应用程序内运行,那么你只需要在应用程序工程中引用 System.Web.dll 即可。当你需要访问 Cache 时,用 HttpRuntime.Cache 属性(相同的对象也可以通过 Page.Cache 和 HttpContext.Cache 访问)。
  缓冲数据有几个准则。首先,如果数据能被使用多次,缓冲是个好的后选方案。其次,如果数据对给定请求或用户是一般的数据而非专用数据,那么最好是选择缓冲。如果数据用户或请求专用,如果需要保存期很长但可能不被经常使用,那么仍然要用缓冲。第三,常常被忽略的一个准则是有时缓冲太多的东西。一般来说,在x86机器上,为了降低内存不足错误的几率,运行某个进程不要超过800MB私有字节。因此,缓冲应该有个上限。换句话说,你也许能重用某个计算的结果,但如果该计算有10个参数,你可能试图针对10个置换进行缓冲,这样做可能会给你带来麻烦。ASP.NET 提供的最常见的容错是由覆盖缓冲导致的内存不足错误,尤其是大型数据集。
  Cache 有几个重要特性是必须要了解的。第一个是 Cache 实现了最近最少使用(least-recently-used)算法,允许 ASP.NET 强制 Cache 清除操作 —— 如果可用内存下降到低水平 —— 则自动从 Cache 中删除不使用的项目。第二个是 Cache 支持依赖性到期特性,它能强制包括时间,键值,文件失效。时间常常被使用,但 ASP.NET 2.0 引入了具有更强大的失效类型:数据库缓冲失效。也就是当数据库中的数据改变时,缓冲中的条目会自动删除。有关数据库缓冲失效的更多信息参见 Dino Esposito 在 MSDN 杂志 2004 年七月刊的 Cutting Edge 专栏文章。该缓冲的体系结构,参见 Figure 3。


Figure 3 ASP.NET Cache

技巧 5 —— 预请求缓冲(Per-Request Caching)

  在本文前面,我曾提到对频繁执行的代码块所做的小小改动可能产生很大的,整体性能的提升。我把其中一个我特别中意的叫做预请求缓冲(per-request caching)。
  由于 Cache API  被设计用来缓冲长期数据或直到某个条件被满足,预请求缓冲意旨用于请求期间的缓冲该数据。特定的代码流程被每次请求频繁访问但是数据只需要被拾取,应用,修改或更新一次,这样说太理论化,还是让我们看一个具体的例子吧。
在 Community Server 的 Forums (论坛)应用中,某个页面上使用的每个服务器控件需要个性化数据以确定使用那个皮肤和式样页,以及其它的个性化数据,其中有些数据可以被长时间缓冲,但有些数据,比如用于控件的皮肤在单个请求中只被拾取一次并在该请求执行期间被重用多次。
  为了完成预请求缓冲,用 ASP.NET HttpContext。HttpContext 的实例是随每个请求创建的,并可以通过 HttpContext.Current 属性在那个请求执行期间的任何地方存取它。HttpContext 类具有一个特别的 Items  集合属性,被添加到该 Items  集合的对象和数据只是在该请求期间被缓存。就像你可以使用 Cache 来保存频繁使用的数据一样,你可以用 HttpContext.Items 来保存只在某个预请求中使用的数据。在此背景后的逻辑很简单:当数据不存在时被添加到 HttpContext.Items 集合,以及在随后的并发查找中简单地返回 HttpContext.Items 中发现的数据。

技巧  6——后台处理

  你的代码流程应该尽可能快,对吧?你自己可能多次发现要完成每个请求或每n个请求的任务代价很高。发出 e-mail 或解析并检查输入数据的有效性就是个例。
  在重新生成 ASP.NET Forums 1.0 并把它整合到 Community Server 时,我们发现添加新贴的代码流程非常慢。每次添加帖子,应用程序首先要确保没有重复贴,然后必须用“badword”过滤器解析该贴的表情图像,记号并索引,如果必要还要将帖子添加到相应的队列中,对附件进行有效性检查,最终完成发贴后,给预订者发出 e-mail 通知。显然,这里做的工作太多。
  我们发现大多数时间都花在了索引逻辑和发送e-mail上。索引帖子是一个很耗时的操作,此外,内建的 System.Web.Mail 功能要与 SMTP 服务器连接并顺序发送邮件。当特定帖子或主题预定者数量增加时,AddPost 函数的执行时间会越来越长。
  并不是每个请求都需要索引邮件,我们想最好是批量集中处理,并且一次只索引25个帖子或每隔五分钟发送一次邮件。我们决定使用的代码与我曾在原型数据库缓冲失效中所使用的代码相同,最终它也被纳入 Visual Studio 2005。
  名字空间 System.Threading 中的 Timer 类非常有用,但在.NET 框架中鲜为人知,至少对 Web 开发者来说是这样。一旦创建,Timer 将以可定制的间隔针对线程池中的某个线程调用指定的回调函数。这意味着你不用输入请求到 ASP.NET 应用程序便能让代码实行,这是一种最合适后台处理的情形。你也可以在这种后台处理模式中进行例如索引或发送电子邮件这样的工作。
  尽管如此,这个技术存在几个问题,如果你的应用程序域关闭,该定时器实例将停止触发其事件。另外,由于 CLR 有一个硬坎,即每个进程的线程数是固定的,你便可能陷入严重的服务器负荷当中,此时可能就没有线程来处理定时器,从而造成延时。为了让发生这种情况的几率最小化,ASP.NET 通过在进程中预留一定数量的空闲线程,并只使用部分线程来处理请求。然而,如果你有许多异步处理,这样做会有问题。
  由于篇幅所限,在此无法列出代码,但你可以从 www.rob-howard.net 下载可消化的例子。其中有 Blackbelt TechEd 2004 展示的幻灯和 Demo。

技巧 7——页面输出缓存和代理服务器

  ASP.NET 是你的表示层(或者说应该是);它由页面,用户控件,服务器控件(HttpHandlers and HttpModules)以及它们生成的内容组成。如果你有一个产生输出的 ASP.NET 页面,不管是输出 HTML,XML,图像还是任何其它数据,而且每个请求你都运行这个代码并产生相同的输出,此时最好选择使用页面输出缓存。
只要在页面顶部添加这一行代码即可:

<%@ Page OutputCache VaryByParams="none" Duration="60" %> 
  你可以为此页面有效地产生一次输出并可以在60秒内多次重用它,一到这个时间点,该页面将重新执行并将再次将输出添加到 ASP.NET Cache。这个行为还能用某些低级编程 APIs 来完成。输出缓存有几个可以配置的设置,比如:VaryByParams 属性。VaryByParams 不是必须的,但允许你指定 HTTP GET 或 HTTP POST 参数来改变缓存入口。例如,default.aspx?Report=1 或 default.aspx?Report=2 可以简单地设置 VaryByParam="Report" 来对输出进行缓存。额外的参数被命名并用用分号分隔。
  在使用输出缓存机制时,许多人都不了解 ASP.NET 页还产生一组下游缓存服务器 HTTP 头,比如 Microsoft Internet Security and Acceleration Server 或 Akamai 使用的 HTTP 头。当设置 HTTP 缓存头,文档可以被缓存到这些网络资源,从而响应客户端请求不必返回原服务器。
  然而,使用页面输出缓存并不会使你的应用程序更有效率,但它能通过下游缓存技术缓存文档从而潜在地降低服务器的负载。当然,这只能是异步内容;一旦实施下游缓存,你将无法看到任何请求,也不能实现身份认证来防止对它的存取。

技巧 8——运行 IIS 6.0 (如果仅用于内核缓存)

  如果你不运行 IIS 6.O(Windows Server 2003),那么你将得不到微软 Web 服务器中一些重大的性能改进。在技巧 7 中,我谈到了输出缓存。在 IIS 5.0 中,请求到达 IIS,然后到达 ASP.NET。当使用缓存时,ASP.NET 中的 HttpModule 接受该请求,并从该缓存中返回内容。
  如果你用 IIS 6.0,有一些巧妙的特性叫内核缓存,它不需要将任何代码改成 ASP.NET。当 ASP.NET对请求进行缓存处理,IIS 内核缓存便接收一份缓存数据的拷贝。当请求来自网络驱动器,内核一级的驱动程序(没有到用户模式的上下文转换)接收该请求,如果缓存,则直接用缓存数据响应并完成执行。这意味着当你使用 IIS 内核模式缓存和 ASP.NET 缓存时,你将看到无法置信的性能结果。在开发 Visual Studio 2005 的 ASP.NET 期间,我是负责 ASP.NET 性能的程序经理。开发人员的工作做的真是棒极了,而我基本上每天都在看报告。内核模式缓存结果总是最有趣的。典型的情况是请求/响应往往使网络饱和,但 IIS 的运行仅占 CPU 的百分之五。真令人惊异!当然使用 IIS 6.O 有其它一些原因,但内核模式缓存是显而易见的理由。

技巧 9——使用 Gzip 压缩

  虽然使用 gzip 压缩不是一个必须的服务器性能技巧(因为你可能看到 CUP 的使用率上升了),但它能降低服务器发送字节的数量。从而感觉页面更快,而且减少带宽的占用。其压缩的效果好坏取决于所发送的数据以及客户端浏览器是否支持这种压缩(IIS 只会将数据发送到支持 gzip 的浏览器,比如:IE 6.0 和 Firefox),从而使服务器可以在每秒钟里处理更多的请求。事实上,只要你降低返回数据的数量,便能提高每秒所处理的请求数。
  有一个好消息是 gzip 压缩是 IIS 6.0 的内建特性,并且比它在 IIS 5.0 中使用的效果更好。但是,要想在 IIS 6.0 中启用 gzip 压缩可能没那么方便,IIS 的属性对话框里找不到设置它的地方。IIS 团队将卓越的 gzip 压缩能力内建在服务器中,但忽视了建立一个启用压缩特性的管理用户界面。要想启用 gzip 压缩机制,你必须深入到 IIS 的 XML 配置设置内部