2014年2月28日星期五

[][C#] 利用 WMI 控制 远程/本端 计算机 -- 以关机为例

本文自动转发自我的博客: http://www.haofengjing.org/?p=1596
=================================== * 问题描述 * =================================== 如何使用 WMI 达到 远程 及 本端计算机的控制 ( 重新启动及关机 ) =================================== * 范例程序 — 示意图 * =================================== =================================== * 范例程序 — 程序代码 * =================================== //====================================== // 本程序制作 : Nobel12 ( 轧延油 ) // 程序解说网址 : http://www.wretch.cc/blog/nobel12 // 制作日期: 2009/06/22 // 相关参考网址:[ 下方格式 >>> 网站名称 , 文章主题 , 引用网址 ] // * 制作起源: .NET菜鸟自救会, [C#]取得CPU温度 , http://www.dotblogs.com.tw/chou/archive/2009/06/21/8927.aspx // 参考网址1: MSDN, ManagementObjectSearcher 成员 , http://msdn.microsoft.com/zh-tw/library/system.management.managementobjectsearcher_members.aspx // 参考网址2: 强力鎯头 の VB 部落 , C# 透过 WMI 控制计算机重新启动 , http://itgroup.blueshop.com.tw/HammerChou/PowerHammer?n=convew&i=2408 // 参考网址3: 开发者在线 - www.builder.com.cn , Visual C#中用WMI控制远程计算机 , http://www.builder.com.cn/2007/1111/624415.shtml // 参考网址4: MSDN 社群论坛 , 使用WMI操控远程计算机联机失败 , http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/d8606179-f6c3-4516-9a2e-9711b0d08642 // 参考网址5: MSDN 社群论坛 , WMI远程计算机的ConnectionOptions类别的疑问 , http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/dd06d6a3-f16a-4409-a01b-143e85294da8 //====================================== using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; // 请先加入参考 System.Management,再加入 using System.Management using System.Management; namespace FrmWMISample { public partial class FrmRebootbyWMI : Form { public FrmRebootbyWMI() { InitializeComponent(); } // 本机端部份 private void btnLocalReboot_Click(object sender, EventArgs e) { // 使用 ManagementClass 类别 --> 表示 CIM (通用信息模型) 管理类别, 管理类别是指 WMI 类别, // 关于 CIM 可参考: http://technet.microsoft.com/zh-tw/library/aa998751.aspx ManagementClass mc_os = new ManagementClass("Win32_OperatingSystem"); // ConnectionOptions.EnablePrivileges 属性 : 指出是否需要为连接作业启用用户权力。 **(特一) // 如果需要为连接作业启用用户权力,应为 true,否则为 false。默认值为 false。 // 执行的作业需要启用某些用户权力时 (如,计算机重新启动) 应该使用这个属性。 mc_os.Scope.Options.EnablePrivileges = true; // 透过 foreach 语句把集合体中之元素分别取出 foreach (ManagementObject mo in mc_os.GetInstances()) { // 使用 InvokeMethod 方法叫用 重新启动 mo.InvokeMethod("Reboot", null, null); } // 释放资源 mc_os.Dispose(); } // 可指定远程计算机部份 private void btnRemoteExecute_Click(object sender, EventArgs e) { // 确立 WMI 运作范围 // 使用 ConnectionOptions 类别对象来设定关连线设定 ConnectionOptions options = new ConnectionOptions ( ) ; options.Username = txtUsername.Text ; // 使用者名称 options.Password = txtPassword.Text ; // 用户密码 options.Authentication = AuthenticationLevel.Default; // 认证模式设定 (采用默认) options.Impersonation = ImpersonationLevel.Impersonate; // 设定 COM 仿真等级 options.EnablePrivileges = true; // 参考 **(特一) //options.Authority = "ntdlmdomain:DOMAIN"; try { // 使用 ManagementScope 类别 ManagementScope MS_Conn = new ManagementScope("\\\\" + txtName.Text + "\\root\\cimv2", options); MS_Conn.Connect(); // 建立 WMI 查询条件 ( 此类 SQL 语法 ) // 可参考 : [以下格式 : 文章名称 , 引用网址 ] // WMI脚本高手不完全手册 , http://forum.slime.com.tw/thread170813.html // .net中的WMI编程(一):WMI介绍及简单应用 , http://soft.zdnet.com.cn/software_zone/2008/0114/708068.shtml ObjectQuery oq = new ObjectQuery("SELECT * FROM Win32_OperatingSystem"); ManagementObjectSearcher mos1 = new ManagementObjectSearcher(MS_Conn, oq); ManagementObjectCollection moc1 = mos1.Get(); foreach (ManagementObject mo in moc1) { if (comboBox1.Text =="重新启动") { mo.InvokeMethod ( "Reboot" , null ) ; MessageBox.Show(string.Format("计算机: {0} 已重新启动...", txtName.Text)); } else if ( comboBox1.Text =="关机") { mo.InvokeMethod ( "Shutdown" , null ) ; MessageBox.Show(string.Format("计算机: {0} 已关机...", txtName.Text)); } else { MessageBox.Show("例外错误!!!"); } } } catch ( Exception err1 ) { MessageBox.Show ( "与 " + txtName.Text + " 联机错误,错误讯息为:" + err1.Message ) ; } } private void FrmRebootbyWMI_Load(object sender, EventArgs e) { comboBox1.SelectedIndex = 0; } } }

[]C#中操作WMI的类库-实现远程登录共享

本文自动转发自我的博客: http://www.haofengjing.org/?p=1595

WMI是Windows Management Instrumentation的简称,即:视窗管理规范。在Windows 2000或以后的版本中均安装得有,NT4.0则需要安装WMI的核心组件。通过WMI可以获取远程计算机的各种数据信息,控制远程计算机的各种行为,而这就像操作本地机一样方便、简单。

  一.WMI简介 
  WMI从根本上说应该为一种服务,并且对于本地不同的用户,WMI所有的权限也不一样。计算机超级用户可以为计算机中的每一个用户,设定不同的WMI权限。在默认状态下,超级用户拥有WMI的一切权限。提供WMI服务是通过程序"WinMgmt.exe"来实现的。可以从"System32\Wbem"目录中找到这个文件。

  既然是服务,计算机使用者就可以享受这种服务,同样也可以关闭这种服务。具体的操作是:按顺序打开【控制面板】|【管理工具】|【组件服务】。WMI服务在组件服务中的显示名称为"Windows Management Instrumentation"。具体如下图01所示:

VisualC#中用WMI编写网络应用程序
图01:组件服务窗口


  选中【名称】栏中"Windows Management Instrumentation",点击鼠标右键,在弹出的菜单中,选择【属性】,在【启动类型】选择框中选择"已禁用",然后在单击【停止】按钮,这样本地的WMI服务也就被关闭了。此时所有本地和远程的WMI调用均为非法。下图为关闭WMI服务后的界面:

VisualC#中用WMI编写网络应用程序
关闭WMI服务


  计算机的超级用户在默认状态下拥有WMI的一切权限,并且可以为本地其他用户设置WMI权限。具体操作是,按顺序打开:【控制面板】|【管理工具】|【计算机管理】。选中【计算机管理】右边的【服务和应用程序】中的【WMI控件】。具体如图02所示:

VisualC#中用WMI编写网络应用程序
图02:【计算机管理】对话框


  点击鼠标右键,在弹出的菜单中,选择【属性】。弹出【WMI控件属性】对话框中,选择【安全】页面。具体如图03所示:

VisualC#中用WMI编写网络应用程序
图03: 打开WMI安全设置界面


  单击图9-4中【安全设置】按钮,弹出【安全设置Root】对话框,通过其中的【添加】和【删除】按钮,可以设定本地有哪些用户拥有WMI权限,并通过【权限】选择栏为每一个用户设置不同的权限,具体如图04所示:

VisualC#中用WMI编写网络应用程序
图04:设定本地用户的WMI权限


  通过上图,也可以发现计算机超级用户在默认状态的WMI权限都是允许的,并且这些权限都是无法删除的。


二.Visual C#中操作WMI的类库简介
  .Net FrameWork SDK对WMI提供了全面的支持,.Net FrameWork SDK为Visual C#能够操作WMI提供了一个专门的命名空间"System.Management"。在命名空间"System.Management"中提供了大量用以处理和WMI相关的类、接口和枚举。

  命名空间"System.Management"中的成员是非常复杂的,由于篇幅所限完全介绍这些成员是不可能的,也是没有要的。根据我的经验,认为要了解、掌握在Visual C#中使用WMI,下面六个类应该是学习的重点,分别是ConnectionOptions、ManagementScope、ObjectQuery、ManagementObjectSearcher、ManagementObjectCollection和ManagementObject。下面就简单介绍一下六个类:

  ·ConnectionOptions类

  ConnectionOptions类主要的功能是为建立的WMI连接提供所需的所有设置。在利用WMI对远程计算机进行操作的时候,首先要进行WMI连接,WMI连接主要是使用的是ManagementScope 类,成功完成WMI连接就要提供远程计算机WMI用户名和口令。ConnectionOptions类可以通过其属性来提供这些信息。表01是ConnectionOptions类的一些主要属性及其简单的说明。

属性 说明
Authority 获取或设置将用于验证指定用户的权利。
Locale 获取或设置将用于连接操作的区域设置。
Password 提供用于WMI连接操作的口令。
Username 提供用于WMI连接操作的用户名。

     表01:ConnectionOptions类常用属性及其说明

  其中最常用的属性是Password和Username。

  ·ManagementScope 类

  通过ManagementScope类能够建立和远程计算机(或者本地计算机)的WMI连接,表示管理可操作范围。创建WMI连接可以通过二种方法:

  ( 1 ) . 利用构造函数,当使用下面构造函数初始化ManagementScope 类实例,同时也就建立了WMI连接,具体如下:

public ManagementScope (  string path , ConnectionOptions options ) ;


  参数:

  path ManagementScope的服务器和命名空间。 

  options 包含有关连接的选项的 ConnectionOptions。

  使用构造函数是有风险的,因为如果不能根据提供的选项建立WMI连接,程序会程序异常,出现错误。 

  下列代码是利用此构造函数构建建立ManagementScope实例,并建立于远程计算机majinhu的WMI连接:

System.Management.ConnectionOptions Conn = new ConnectionOptions ( ) ; //设定用于WMI连接操作的用户名 Conn.Username = "WMI用户名"; //设定用户的口令 Conn.Password = "此用户名对应口令"; System.Management.ManagementScope Ms = new ManagementScope("\\majinhu\root\cimv2", Conn ) ;


  ( 2 ) . 利用ManagementScope中提供的Connect方法:

  ManagementScope中的成员是非常少的,最常用的方法和属性各一个:常用属性是Options,主要为WMI建立提供参数;常用方法是Connect,通过它可以建立于远程计算机的WMI连接。下列是利用Connect方法建立WMI连接的具体代码:

System.Management.ConnectionOptions Conn = new ConnectionOptions ( ) ; //设定用于WMI连接操作的用户名 Conn.Username = "WMI用户名"; //设定用户的口令 Conn.Password = "此用户名对应口令"; System.Management.ManagementScope Ms = new ManagementScope("\\majinhu\root\cimv2" ) ; Ms.Options = Conn ; Ms.Connect ( ) ; //建立WMI连接


  ·ObjectQuery类

  ObjectQuery类或其派生类用于在ManagementObjectSearcher中指定查询。程序中一般采用查询字符串来构造ObjectQuery实例。其中的查询字符串是一种类似SQL语言的WQL语言。下面的ObjectQuery类构造函数中最常见的一种,具体语法如下:

public ObjectQuery ( string query ) ;


  参数:

  query 查询的字符串

  ·ManagementObjectSearcher类

  ManagementObjectSearcher主要是根据指定的查询检索WMI对象的集合。ManagementObjectSearcher组成成员也非常简单,其方法Get方法是非常重要的,ManagementObjectSearcher通过Get方法进行WMI查询,并把得到的结果集合。Get方法的返回值是一个ManagementObjectCollection实例,它包含匹配指定查询的对象。

  表02是其ManagementObjectSearcher类的常用属性及其说明。

属性 说明
Options 有关如何搜索对象的选项
Query 在搜索器中调用的查询
Scope 在其中查找对象的范围

      表02:ManagementObjectSearcher类常用属性及其说明

  ·ManagementObjectCollection类

  ManagementObjectCollection类非常简单,它主要表示 WMI 实例的不同集合其中包括命名空间、范围和查询观察程序等。创建ManagementObjectCollection类没有构造函数。

  ·ManagementObject类

  ManagementObject类为单个管理对象或类。通过ManagementObject中的方法可以调用ManagementObject对应的对象,从而执行相应的操作。ManagementObject类是一个内容丰富的类,表03和表04分别是其常用的属性和方法。

属性 说明
ClassPath 对象的类的路径。
Options 检索对象时要使用的其他信息。
Path 对象的 WMI 路径。
Scope 此对象在其中驻留的范围。

       表03:ManagementObject类常用属性及其说明

方法 说明
Clone 创建对象的一个副本。
CopyTo 将对象复制到另一个位置。
Delete 删除对象。
Get 绑定到管理对象。
GetRelated 获取与该对象(联系对象)相关的对象的集合。
GetRelationships 获取该对象的关联的集合。
InvokeMethod 调用对应的对象方法。
Put 提交对对象所做的更改。

      表04:ManagementObject类常用方法及其说明

  下面就结合二个具体的示例来介绍Visual C#中利用上述类,提供WMI掌握如何利用WMI编写网络应用程序,所使用的类库主要是使用了上面接收的这六个类。

例子:

复制代码
 1            ConnectionOptions conOptions=new ConnectionOptions();   2             conOptions.Username = "Administrator";   3             conOptions.Password="Abc123";   4             conOptions.Impersonation = ImpersonationLevel.Impersonate;   5             conOptions.EnablePrivileges = true;   6             ManagementScope ms = new ManagementScope("\\\\192.168.11.21\\root\\cimv2", conOptions);   7             try   8             {   9                 ms.Connect();  10                 FileStream fWrite = File.Create("\\\\192.168.11.21\\test\\te.txt");  11             }  12             catch (Exception)  13             {  14                 throw;  15             }
复制代码


[]Wordpress安装百度统计方法

本文自动转发自我的博客: http://www.haofengjing.org/?p=1594
  首先在百度统计获取安装代码,在后台文件中查找 wp-content/themes/footer.php 文件,然后打开,将百度统计代码复制粘贴到页尾<body>的前面,保存并更新文件。

2014年2月27日星期四

经济学入门必看的20部经典影片!!有空时多充电!

View this post on my blog: http://www.haofengjing.org/?p=1589

善与恶。

国民党元老吴稚晖晚年曾感慨地说:"从前,张之洞这样的改革派成了老顽固,不能不让位给我们这些革命的暴徒,而我们这些人也一个个变成了臭官僚,白花了二十年改革的工夫…… 年轻人怀一腔热血,想一劳永逸解决社会问题,但最终你会发现,你只能用温和的法子激活人性中的善,而无法消灭人性中的恶。"

&nbsp;

View this post on my blog: http://www.haofengjing.org/?p=1587

恒复法师 语录

&nbsp;

人生不可能一尘不染,没有一点杂质,就像水清则无鱼。人生有一点点甜,也有一点点苦,有一点点好,也有一点点坏,有一点点希望,也有一点点无奈,生活才会更生动、更美好、更韵味悠长。再好的人也不会十全十美,再美好的爱情也不可能纤尘不染,你若试着包容,就会发现这个世界并不像你想像的那样糟糕。

&nbsp;

View this post on my blog: http://www.haofengjing.org/?p=1586

互联网金融持续升温:P2P网贷平台“积木盒子”上线半年,已获千万美元融资 | 36氪

UPDATE:积木盒子本次融资为A轮,投资方为银泰资本(Ventech China,一家欧洲VC,与银泰集团无关)。据创始人董骏透露,该笔融资将主要用户扩大市场、巩固团队、强化风控能力等方面。另悉,去哪儿副总裁彭笑玫也是积木盒子联合创始人之一。
据我们从投资圈人士处获知,P2P 网贷平台积木盒子(iOS)已完成一笔千万美元融资,投资方为一家欧洲机构,详细信息将于不久后正式发布。
积木盒子上线于去年 8 月,与爱投资、银客网类似,采用的是与线下担保机构合作,面向中小微企业提供贷款的 P2C(Peer to Company)模式。该模式下,网贷平台与担保公司合作对目标企业实施尽职调查并提供全额本息担保,企业资金需求被提交线上以债权众筹的方式向公众募资。根据积木盒子的公开数据,其累计贷款额破亿用了约 4 个月,破两亿则只用了 40 天,目前该数字已经接近 2.8 亿——发展速度十分可观。
目前积木盒子的投资收益率约在 9% 到 14%。业务线除企业经营贷外,还包括商圈贷(围绕产业链核心企业,为其上下游提供供应链融资)和购房周转贷,个人消费贷据说也可能上线。
从项目来源上看,积木盒子的借款方多位于中西部发展中地区。而从投资人来源看,北京地区则占到了 40%。所以从深层次讲,积木盒子等平台其实是将一线城市的剩余资金与中西部企业的资金需求做了匹配。
从去年下半年开始,互联网金融不断升温。仅在 P2P 领域,就先后有有利、点融、爱投资等拿到大额融资,上线较早的有利和爱投资累计贷款额均已超过 7 亿。
另据央行前几天发布的一组金融统计数据,今年 1 月份人民币存款大幅减少了 9402 亿元。除了节后的暂时性波动外,余额宝、理财通、P2P 网贷等互联网金融在其中发挥了重要影响。目前余额宝资金总量已飙升到 4000 亿元,而腾讯理财通和华夏活期通等类似产品据说也产生了近千亿的增量。互联网金融对国内银行业无论从观念上还是事实上都带来了最直接的冲击。虽然各大商业银行也纷纷推出自己的类余额宝产品,但迄今为止收效甚微。
[36氪原创文章,作者: 沈超]

View this post on my blog: http://www.haofengjing.org/?p=1582

天猫国际正式版上线 主打直接海淘

TECH2IPO/创见北京报道:阿里集团近日宣布天猫国际正式上线,直供海外进口商品。据悉,此次上线的天猫国际将提供新的海淘服务,入驻的商家店铺配备旺旺中文咨询,提供国内的售后服务。在物流方面,天猫国际要求商家 72 小时内完成发货,14 个工作日内到达,同时确保物流信息全程可跟踪。
去年 7 月,天猫国际开始招商,香港卓悦网、台湾东森严选、日本 kenko、海淘名表 ashford 等平台陆续入驻。天猫国际方面称,入驻商家为中国大陆外的公司实体,具有海外零售资质,所售商品通过国际物流经中国海关入关。

View this post on my blog: http://www.haofengjing.org/?p=1579

男人的四个优秀品质:毅力、勇敢、包容、智慧。

什么叫毅力?别人认为痛苦的时候、看不见光明的时候,你看见了黑暗尽头的光明。什么叫勇敢?当你勇敢的时候会奋不顾身。什么叫包容?把所有的是非恩怨搁你肚子里消化。什么叫智慧?不随波逐流,能看到别人看不到的层面。—— 冯仑

View this post on my blog: http://www.haofengjing.org/?p=1573

【无论你月收入多少记得分成6份】

第1份,做生活费;第2份,交朋友,坚持一年,你的朋友圈就会为你产生价值;第3份,用来感恩,每月给父母、爱人送份礼物;第4份,用来学习,每个月买本好书读;第5份,用来投资,培养自己财富意识;第6份,用来储蓄,稳存保底。合理理财,打理未来。








View this post on my blog: http://www.haofengjing.org/?p=1571

【一张图告诉你正确的跑步姿势】

下图十个跑姿要点是重中之重!在跑步中可以逐一对照纠正,正确的跑姿不但让你跑得轻松,而且不易受伤,记住:跑姿比跑鞋重要!








View this post on my blog: http://www.haofengjing.org/?p=1569

快速构建实时抓取集群 -- 系统架构 -- IT技术博客大学习 -- 共学习 共进步!

定义:
首先,我们定义一下定向抓取,定向抓取是一种特定的抓取需求,目标站点是已知的,站点的页面是已知的。本文的介绍里面,主要是侧重于如何快速构建一个实时的抓取系统,并不包含通用意义上的比如链接分析,站点发现等等特性。


&nbsp;


在本文提到的实例系统里面,主要用到linux+mysql+redis+django+scrapy+webkit,其中scrapy+webkit作为抓取端,redis作为链接库存储,mysql作为网页信息存储,django作为爬虫管理界面,快速实现分布式抓取系统的原型。


&nbsp;


名词解析:
1. 抓取环:抓取环指的是spider在存储中获取url,从互联网上下载网页,然后将网页存储到数据库里面,最后在从存储里面获取下一个URL的一个流程。&nbsp;

2. Linkbase:链接库的存储模块,包含一般的链接信息;是抓取系统的核心,使用redis存储。

3. XPATH:一门在 XML 文档中查找信息的语言,XPath 可用来在 XML 文档中对元素和属性进行遍历, 是 W3C XSLT 标准的主要元素。使用XPATH以及相关工具lib进行链接抽取和信息抽取。

4. XPathOnClick:一个chrome的插件,支持点击页面元素,获取XPATH路径,用于编辑配置模板。

5. Redis:一个开源的KV的内存数据库,具备很好的数据结构的特征和很高的存取性能。用于存储linkbase信息

6. Django:爬虫管理工具,用于模板配置,系统监控反馈。Django在这里主要是用来管理一个数据库,使用Admin功能。

7. Pagebase:页面库,主要是存储网页抓取的结果,以及页面抽取的结果,和dump交互,使用mysql实现。

8. Scrapy:一个开源的机遇twisted框架的python的单机爬虫,该爬虫实际上包含大多数网页抓取的工具包,用于爬虫下载端以及抽取端。

9. 列表页:指的商品页面之外的所有页面

10. 详情页:比如商品B2C的抓取中,特指商品页面,比如:http://item.tmall.com/item.htm?id=10321272374




&nbsp;


系统架构
一:存储 redis+mysql
链接库(linkbase)是抓取系统的核心,基于性能和效率的考虑,本文采用基于内存的redis和磁盘的mysql为主,对于linkbase主要是存储抓取必须的链接信息,比如url,anchor,等等;对于mysql,则是存放抓取的网页,便于后续的抽取和处理。
a) PageBase:使用Mysql分库分表,存放网页,如下图:

&nbsp;

b) Linkbase 使用Redis集群,存储linkbase信息。



几个基本的数据结构:&nbsp;

1:抓取队列 (candidate list)

分为待抓取的url队列和更新的url队列;队列存放urlhash,使用redis的list数据结构,对于新提取的url,push到对应的列表里面,对于spider抓取模块,从list pop得到。对于一个站点而言,抓取队列有两种类型:列表页抓取队列和详情页抓取队列。

2:链接库 (linkbase)

链接库实际上是存储链接信息的DB;Key是urlhash,Value是linkinfo,包含url,purl,anchor,xpath。。。;在redis使用hash存储,直接存放在redis的里面。KV链接库,不区分页面类型。

3:已抓取集合(crawled_set)

已抓取集合指的是当前已经下载的页面的urlhash,存放已经抓取的网页,使用redis的set实现,set的key是urlhash,score是时间戳,已抓取集合主要是用来记录哪一些页面已经抓取和抓取的时间,用于后续的更新页面调度以及抓取信息的统计。同抓取队列一样,每一个站点有两种类型的已抓取集合,详情页和列表页





&nbsp;


二:调度模块:
调度模块是抓取系统的关键,调度系统的好坏决定了抓取系统的效率;这块是主要是在redis linkbase之上的数据结构,主要有抓取队列、抓取集合、抓取优先级等等数据结构组成;对于一个抓取循环来说:获取URL,提交到抓取模块的待抓取队列,启动抓取,抓取完成之后对新链接进行抽取,最后进入等待抓取的队列里面。
调度系统的基本配置:&nbsp;

a) 频率(间隔多少秒)

b) 各个抓取列表的选取比例:get_detail,mod_detail,get_list,mod_list

链接抽取:抽取页面的链接,进行除重,对于新的链接,插入到待抓取列表里

内容抽取:按照模块的配置XPATH,抽取页面信息,并写入到pagebase中。

离线调度:按照更新的比例,从crawled_set里面,定期选取url进入Mod队列里面进行刷新。




&nbsp;


三:抓取模块:
抓取模块是抓取的必要条件,抓取模块来说,重要的是应付互联网上各式的问题,以及如何实现对对方站点的ip平衡,当然,这块是和调度系统的紧密结合的,对于抓取模块而言,本文主要使用scrapy工具包里面的下载模块。
首先,抓取模块从linkbase获取对应站点的抓取url,进行页面下载,然后将页面信息写回到pipeline中,并完成链接抽取和页面抽取,同时调用调度模块,插入到linkbase和pagebase中。&nbsp;

下载端设计:

IP:每台机器需要配置多个物理公网IP,下载的时候,随机选择一个IP下载

抓取频度调整:读取配置文件,按照配置文件的抓取频率进行选取url




&nbsp;


四:配置界面:
配置界面主要是对抓取系统的管理和配置,包括:站点feed、页面模块抽取、报表系统的反馈等等。


&nbsp;


类似于通用的抓取架构,本文提到的抓取系统架构如下图:


&nbsp;





&nbsp;


一个完整的抓取数据流:
1:用户提供种子URL
2:种子URL进入linkbase中新URL队列中
3:调度模块选取url进入到抓取模块的待抓取队列中
4:抓取模块读取站点的配置文件,按照执行的频率进行抓取
5:抓取的结果返回到pipeline接口中,并完成连接的抽取
6:新发现的连接在linkbase里面进行dedup,并push到linkbase的新URL模块里面
7:调度模块选取url进入抓取模块的待抓取队列,goto 4
8:end


&nbsp;


系统扩展
本文提到的抓取系统,核心是调度和存储模块;其中,抓取,存储,调度都是通过数据进行交互的,因此,模块之间可以任意平行扩展,对于系统规模来说,只需要平行扩展mysql和redis存储服务集群以及抓取集群即可。当然,简单的扩展会带来一些问题:比如垃圾列表页的泛滥,链接库的膨胀等等问题,这些问题后续在讨论吧。

View this post on my blog: http://www.haofengjing.org/?p=1567

用netstat查看网络状态详解 -- 网络系统 -- IT技术博客大学习 -- 共学习 共进步!

一、Linux服务器上11种网络连接状态:

图:TCP的状态机
通常情况下:一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手
注:以下说明最好能结合"图:TCP的状态机"来理解。
SYN: (同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。
ACK: (确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。
FIN: (结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。
1)、LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN. /* The socket is listening for incoming connections. 侦听来自远方TCP端口的连接请求 */
2)、SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接.之后状态置为SYN_SENT. /*The socket is actively attempting to establish a connection. 在发送连接请求后等待匹配的连接请求 */
3)、SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN. 之后状态置为SYN_RECV /* A connection request has been received from the network. 在收到和发送一个连接请求后等待对连接请求的确认 */
4)、ESTABLISHED: 代表一个打开的连接,双方可以进行或已经在数据交互了。/* The socket has an established connection. 代表一个打开的连接,数据可以传送给用户 */
5)、FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态./* The socket is closed, and the connection is shutting down. 等待远程TCP的连接中断请求,或先前的连接中断请求的确认 */
6)、CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT. /* The remote end has shut down, waiting for the socket to close. 等待从本地用户发来的连接中断请求 */
7)、FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2 ./* Connection is closed, and the socket is waiting for a shutdown from the remote end. 从远程TCP等待连接中断请求 */
8)、LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK . /* The remote end has shut down, and the socket is closed. Waiting for acknowledgement. 等待原来发向远程TCP的连接中断请求的确认 */
9)、TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态。/* The socket is waiting after close to handle packets still in the network.等待足够的时间以确保远程TCP接收到连接中断请求的确认 */
10)、CLOSING: 比较少见./* Both sockets are shut down but we still don't have all our data sent. 等待远程TCP对连接中断的确认 */
11)、CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束./* The socket is not being used. 没有任何连接状态 */
TIME_WAIT状态的形成只发生在主动关闭连接的一方。
主动关闭方在接收到被动关闭方的FIN请求后,发送成功给对方一个ACK后,将自己的状态由FIN_WAIT2修改为TIME_WAIT,而必须再等2倍 的MSL(Maximum Segment Lifetime,MSL是一个数据报在internetwork中能存在的时间)时间之后双方才能把状态 都改为CLOSED以关闭连接。目前RHEL里保持TIME_WAIT状态的时间为60秒。
当然上述很多TCP状态在系统里都有对应的解释或设置,可见man tcp
二、关于长连接和短连接:
通俗点讲:短连接就是一次TCP请求得到结果后,连接马上结束.而长连接并不马上断开,而一直保持着,直到长连接TIMEOUT(具体程序都有相关参数说明).长连接可以避免不断的进行TCP三次握手和四次挥手.
长连接(keepalive)是需要靠双方不断的发送探测包来维持的,keepalive期间服务端和客户端的TCP连接状态是ESTABLISHED.目前http 1.1版本里默认都是keepalive(1.0版本默认是不keepalive的),ie6/7/8和firefox都默认用的是http 1.1版本了(如何查看当前浏览器用的是哪个版本,这里不再赘述)。Apache,java
一个应用至于到底是该使用短连接还是长连接,应该视具体情况而定。一般的应用应该使用长连接。
1、Linux的相关keepalive参数
a、 tcp_keepalive_time - INTEGER
How often TCP sends out keepalive messages when keepalive is enabled.
Default: 2hours.
b、 tcp_keepalive_probes - INTEGER
How many keepalive probes TCP sends out, until it decides that the
connection is broken. Default value: 9.
c、 tcp_keepalive_intvl - INTEGER
How frequently the probes are send out. Multiplied by
tcp_keepalive_probes it is time to kill not responding connection,
after probes started. Default value: 75sec i.e. connection
will be aborted after ~11 minutes of retries.
2、F5负载均衡上的相关参数说明
a、Keep Alive Interval
Specifies, when enabled, how frequently the system sends data over an idle TCP connection, to determine whether the connection is still valid.
Specify: Specifies the interval at which the system sends data over an idle connection, to determine whether the connection is still valid. The default is 1800 milliseconds.
b、Time Wait
Specifies the length of time that a TCP connection remains in the TIME-WAIT state before entering the CLOSED state.
Specify: Specifies the number of milliseconds that a TCP connection can remain in the TIME-WAIT state. The defaultis 2000.
c、Idle Timeout
Specifies the length of time that a connection is idle (has no traffic) before the connection is eligible for deletion.
Specify: Specifies a number of seconds that the TCP connection can remain idle before the system deletes it. The default is 300 seconds.
3、Apache的相关参数说明
以下是Apache/2.0.61版本的默认参数和说明
a、KeepAlive:
default On.Whether or not to allow persistent connections (more than
one request per connection). Set to "Off" to deactivate.
b、MaxKeepAliveRequests:
default 100.The maximum number of requests to allow
during a persistent connection. Set to 0 to allow an unlimited amount.
We recommend you leave this number high, for maximum performance.
c、KeepAliveTimeout:
default 15. Number of seconds to wait for the next request from the
same client on the same connection.

View this post on my blog: http://www.haofengjing.org/?p=1566

36氪Plus消息:贷款组合推荐工具“钱小二”已获数百万天使轮融资 | 36氪

根据"钱小二"在创业者社区36氪plus上的更新信息,该团队已获得数百万天使轮融资,投资方及投资时间不明。

"钱小二"是一个贷款搜索 + 贷款组合推荐平台,目标是帮助用户快速找到条件最优的贷款产品。用户在线提交自己的融资需求和资信数据(收入证明、消费及社交数据),"钱小二"将根据其客户特征评估模型和推荐算法,为用户推荐单一或组合的贷款产品。比起融 360、好贷、91 金融超市等类似产品,"钱小二"更加强调服务性,用户不是在搜索结果中一一筛选,而是直接收获一组贷款方案,并由客服人员协助落实。"钱小二"的贷款来源也更加多样,既有银行和小贷公司,也有部分 P2P 网贷。

接着互联网金融的东风,贷款搜索在国内发展得十分迅速,这既得益于银行贷款政策的碎片化和不透明,也得益于银行客户开发能力的不足。根据非官方信息,融360、好贷等平台每向银行提供一个有效需求,收入大概在 100 到 300 元人民币。去年底某贷款搜索网站月申请额据称已超百亿,增长至今保守估约两百亿,按成交转化率 20%、人均贷款额 20 万、人头费 200 到 300 元计,其月营收已在 400 万到 600 万之间——这是刚上线一年多的成绩。

互联网金融离钱很近,但正因如此,各方才格外重视其中的风险性。众多公司一头热地扎进互联网金融创业潮,多少也会带来一些隐忧。

[36氪原创文章,作者: 沈超]

17

通过36氪Plus消息:贷款组合推荐工具"钱小二"已获数百万天使轮融资 | 36氪.

View this post on my blog: http://www.haofengjing.org/?p=1557

IIS并发连接数及性能优化 - 全欣 的专栏 - 博客频道 - CSDN.NET

如果要查看IIS连接数,最简单方便的方法是通过"网站统计"来查看,"网站统计"的当前在线人数可以认为是当前IIS连接数。然而,"网站统计"的当前在线人数统计时间较长,一般为10分钟或15分钟,再加上统计技术及统计机制的问题,从而会产生或多或少的统计误差。
如果要想知道确切的当前网站IIS连接数的话,最有效的方法是通过windows自带的系统监视器来查看。这正是本文要介绍的方法。

一、     新建IIS并发连接数监控器
1.     运行--&gt;输入"perfmon.msc"
2.     在"系统监视器"图表区域里点击右键,然后点"添加计数器"
 
图一
3.     在"添加计数器"窗口,"性能对象"选择Web Service,"从列表选择计数器"选中Current Connection,"从列表选择实例"选中你要统计的站点,最后点击"添加"按钮
图二

二、     设置完毕
这样,你就可以在"系统监视器"图表区域中看到一条曲线(此曲线你可以设置其颜色和宽度等参数),它就是网站的IIS连接数曲线图了,如图一黄色曲线所示。
需要说明的是,windows系统监视器显示的是即时IIS并发连接数,并非如"网站统计"那里的15分钟内访问人数,所以你会发现IIS并发连接数并不会太多


解决方法:
超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.InvalidOperationException: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。

这是个老问题了!你就查两点:
一、看所有open的连接是否都close了。
二、如果访问量很大,加上Max Pool Size=512这一句,当然这是要以损失系统性能为代价的!
这样以后一定可以解决你的问题!

解决方案一

我 想原因可能是并发操作。DataReader是独占连接的,就是说你的程序可能设计上有问题。比如说最大连接设100,假设有100个人同时使用 DataReader正在读取数据库内容,那么当第101人读取的时候,连接池中的连接已经没有了,就会出现上面的错误。DataReader是独占连接 的,每个DataReader都要占用一个连接。当然这个情况是偶尔出现的,所以会很长时间出现一次,因为只有同时有超过连接池最大连接数量的并发操作才 会发生。而且你加大并发数量只能暂时缓解问题,如果你加大到200个并发连接,如果有201 人同时操作怎么办?你说了你使用Connection对象的Close()方法,这是不行的,因为Close()方法仅仅是关闭连接,但这个连接没有释 放,还是被这个对象占用,要释放必须使用Connection的Dispose()方法显式释放连接才可以,否则这个对象占用的连接只能等到�
��圾收集的情 况下才能被释放。这种情况肯定会出现"超时时间已到"的错误。

解决方法:
1 修改几个关键页面或访问比较频繁的数据库访问操作,使用DataAdapter和DataSet来获取数据库数据,不要使用DataReader。
2 在访问数据库的页面上使用数据缓存,如果页面的数据不是经常更新(几分钟更新一次)的话,使用Cache对象可以不用访问数据库而使用缓存中的内容,那么可以大大减少连接数量。
3 修改代码,把使用Connection对象的地方都在Close()后面加上Dispose()调用。
4 建议对数据库操作进行大的修改,建立自己的数据库操作代理类,继承System.IDisposable接口,强迫释放资源,这样就不会出现连接数量不够的问题了。

解决方案二

解决方法(*):WEB.config 里面:在数据库连接加 Max Pool Size = 512;server=local;uid=;pwd=;database=2004;Max Pool Size = 512;"&gt;一劳永逸。

解决方案三

估计是连接(Connection)对象没有Close。倒是不必Dispose,而DataReader用完后应该关闭,但不关闭也没问题,只是不关闭的话此连接对象就一直不能用,只要你最终关闭了连接对象就不会出问题。

连接对象在Open后的操作都放在try块中,后面跟一个finally块:conn.Close();




如何查询sql2005连接数 


经常发生 "数据库连接过多的错误" 这样的错误,但是却又不清楚当前的连接数为多少,大致的总结了几种方法。
1.通过系统的"性能"来查看:
开始-&gt;管理工具-&gt;性能(或者是运行里面输入 mmc)然后通过

[attach]52716[/attach]

添加计数器添加 SQL 的常用统计 然后在下面列出的项目里面选择用户连接就可以时时查询到数据库的连接数了。
不过此方法的话需要有访问那台计算机的权限,就是要通过windows账户登陆进去才可以添加此计数器。
2.通过系统表来查询:
[code]SELECT * FROM
[Master].[dbo].[SYSPROCESSES] WHERE [DBID]
IN
(
SELECT
[DBID]
FROM
[Master].[dbo].[SYSDATABASES]
WHERE
NAME='databaseName'
)
[/code]

databaseName 是需要查看的数据库,然后查询出来的行数,就是当前的连接数。不过里面还有一些别的状态可以做参考用。

由上面的语句可以看出系统表获取一些连接和活动信息,主要介绍下面的两个系统表:

(1)sprocesses

sysprocesses 表中保存关于运行在 Microsoft® SQL Server™ 上的进程的信息。这些进程可以是客户端进程或系统进程。sysprocesses 只存储在 master 数据库中。

(2)Sysperfinfo

包括一个 Microsoft® SQL Server™ 表示法的内部性能计数器,可通过 Windows NT 性能监视器显示.

 

有人提议说为了获取SQL Server的当前连接数:使用如下SQL:

SELECT COUNT(*) AS CONNECTIONS FROM master..sysprocesses

个人认为这样不对,看看.sysprocesses的login_time列就可看出.

 

另外一个方面是进程不能和连接相提并论,他们是一对一的关系吗,也就是说一个进程就是一个连接?一个连接应该有多个进程的,所以连接和进程之间的关系应该是1:n的.


因为sysprocesses列出的进程包含了系统进程和用户进程,为了得到用户连接,可以使用如下SQL:

SELECT cntr_value AS User_Connections FROM master..sysperfinfo as p
WHERE p.object_name = 'SQLServer:General Statistics' And p.counter_name = 'User Connections'

个人还是认为不对,因为它是一个计数器,可能会累加的.

还有一种方案是利用如下SQL:

select connectnum=count(distinct net_address)-1 from master..sysprocesses

理由是net_address是访问者机器的网卡值,这个总该是唯一的吧.但是看起来得到的是所有时间内的连接数.

希望大家可以给出自己的解决方案.这个问题解决了,相信会有很大的用途.


3.通过系统过程来查询:
[url=http://search.microsoft.com/default.asp?so=RECCNT&amp;siteid=us%2Fdev&amp;p=1&amp;nq=NEW&amp;qu=SP_WHO&amp;IntlSearch=&amp;boolean=PHRASE&amp;ig=01&amp;i=09&amp;i=99]SP_WHO[/url] 'loginName'
loginName 是当然登陆Sql的用户名,一般程序里面都会使用一个username来登陆SQL这样通过这个用户名就能查看到此用户名登陆之后占用的连接了。
如果不写loginName,那么返回的就是所有的连接。

sp_who提供icrosoft® SQL Server™ 用户和进程的信息。可以筛选返回的信息,以便只返回那些不是空闲的进程。

列出所有活动的用户:SP_WHO 'active'

列出某个特定用户的信息:SP_WHO 'sa'

4、系统变量

@@CONNECTIONS 返回自上次启动 Microsoft® SQL Server™ 以来连接或试图连接的次数。

@@MAX_CONNECTIONS 返回 Microsoft® SQL Server™ 上允许的同时用户连接的最大数。返回的数不必为当前配置的数值


&nbsp;

 
***************连接池和连接数详解**********

连接到数据库服务器通常由几个需要很长时间的步骤组成。 必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次握手,必须分析连接字符串信息,必须由服务器对连接进行身份验证,必须运行检查以便在当前事务中登记,等等。

实际上,大多数应用程序仅使用一个或几个不同的连接配置。 这意味着在执行应用程序期间,许多相同的连接将反复地打开和关闭。 为了使打开的连接成本最低,ADO.NET 使用称为连接池的优化方法。

连接池减少新连接需要打开的次数。 池进程保持物理连接的所有权。 通过为每个给定的连接配置保留一组活动连接来管理连接。 只要用户在连接上调用 Open,池进程就会检查池中是否有可用的连接。 如果某个池连接可用,会将该连接返回给调用者,而不是打开新连接。 应用程序对该连接调用 Close 时,池进程会将连接返回到活动连接池集中,而不是真正关闭连接。 连接返回到池中之后,即可在下一个 Open 调用中重复使用。

只有配置相同的连接可以建立池连接。 ADO.NET 同时保留多个池,每个配置一个池。 连接由连接字符串以及 Windows 标识(在使用集成的安全性时)分为多个池。 还根据连接是否已在事务中登记来建立池连接。

池连接可以显著提高应用程序的性能和可缩放性。 默认情况下,ADO.NET 中启用连接池。除非显式禁用,否则,连接在应用程序中打开和关闭时,池进程将对连接进行优化。 还可以提供几个连接字符串修饰符来控制连接池的行为。 有关更多信息,请参见本主题后面的"使用连接字符串关键字控制连接池"。

池的创建和分配
在初次打开连接时,将根据完全匹配算法创建连接池,该算法将池与连接中的连接字符串关联。 每个连接池都与一个不同的连接字符串相关联。 打开新连接时,如果连接字符串并非与现有池完全匹配,将创建一个新池。 按进程、按应用程序域、按连接字符串以及(在使用集成的安全性时)按 Windows 标识来建立池连接。 连接字符串还必须是完全匹配的;按不同顺序为同一连接提供的关键字将分到单独的池中。

在以下 C# 示例中创建了三个新的 SqlConnection 对象,但是管理时只需要两个连接池。 注意,根据为 Initial Catalog 分配的值,第一个和第二个连接字符串有所不同。

复制代码
using (SqlConnection connection = new SqlConnection(
"Integrated Security=SSPI;Initial Catalog=Northwind"))
{
connection.Open();
// Pool A is created.
}

using (SqlConnection connection = new SqlConnection(
"Integrated Security=SSPI;Initial Catalog=pubs"))
{
connection.Open();
// Pool B is created because the connection strings differ.
}

using (SqlConnection connection = new SqlConnection(
"Integrated Security=SSPI;Initial Catalog=Northwind"))
{
connection.Open();
// The connection string matches pool A.
}


如果 MinPoolSize 在连接字符串中未指定或指定为零,池中的连接将在一段时间不活动后关闭。 但是,如果指定的 MinPoolSize 大于零,在 AppDomain 被卸载并且进程结束之前,连接池不会被破坏。 非活动或空池的维护只需要最少的系统开销。

注意:
当出现故障转移等错误时,会自动清除池。


添加连接
连接池是为每个唯一的连接字符串创建的。 当创建一个池后,将创建多个连接对象并将其添加到该池中,以满足最小池大小的要求。 连接根据需要添加到池中,但是不能超过指定的最大池大小(默认值为 100)。 连接在关闭或断开时释放回池中。

在请求 SqlConnection 对象时,如果存在可用的连接,将从池中获取该对象。 连接要可用,必须未使用,具有匹配的事务上下文或未与任何事务上下文关联,并且具有与服务器的有效链接。

连接池进程通过在连接释放回池中时重新分配连接,来满足这些连接请求。 如果已达到最大池大小且不存在可用的连接,则该请求将会排队。 然后,池进程尝试重新建立任何连接,直到到达超时时间(默认值为 15 秒)。 如果池进程在连接超时之前无法满足请求,将引发异常。

警告:
我们强烈建议您在使用完连接后总是将其关闭,以使连接返回到池中。要关闭连接,可以使用 Connection 对象的 Close 或 Dispose 方法,也可以通过在 C# 的 using 语句中或在 Visual Basic 的 Using 语句中打开所有连接。 不是显式关闭的连接可能不会添加或返回到池中。 有关更多信息,请参见 Visual Basic 的using Statement (C# Programmer's Reference)或How to: Dispose of a System Resource。

注意:
不要在类的 Finalize 方法中对 Connection、DataReader 或任何其他托管对象调用 Close 或 Dispose。 在终结器中,仅释放类直接拥有的非托管资源。 如果类不拥有任何非托管资源,则不要在类定义中包含 Finalize 方法。 有关更多信息,请参见Garbage Collection。


移除连接
如果连接长时间空闲,或池进程检测到与服务器的连接已断开,连接池进程会将该连接从池中移除。 注意,只有在尝试与服务器进行通信之后才能检测到断开的连接。 如果发现某连接不再连接到服务器,则会将其标记为无效。 无效连接只有在关闭或重新建立后,才会从连接池中移除。

如果存在与已消失的服务器的连接,那么即使连接池管理程序未检测到已断开的连接并将其标记为无效,仍有可能将此连接从池中取出。 这种情况是因为检查连接是否仍有效的系统开销将造成与服务器的另一次往返,从而抵消了池进程的优势。 发生此情况时,初次尝试使用该连接将检测连接是否曾断开,并引发异常。

清除池
ADO.NET 2.0 引入了清除池的两种新方法: ClearAllPools 和 ClearPool。 ClearAllPools 清除给定提供程序的连接池,ClearPool 清除与特定连接关联的连接池。 如果在调用时连接正在使用,将进行相应的标记。 连接关闭时,将被丢弃,而不是返回池中。

事务支持
连接是根据事务上下文来从池中取出并进行分配的。 除非在连接字符串中指定了 Enlist=false,否则,连接池将确保连接在 Current 上下文中登记。 当连接通过登记的 System.Transactions 事务关闭并返回到池中时,连接将被保留,以便下次使用同一 System.Transactions 事务请求该连接池时,可返回同一连接(如果该连接可用)。如果该连接不可用,则会打开新连接。如果该事务没有可用连接,在该连接打开时,将自动注册该连接。

当连接关闭时,它将被释放回池中,并根据其事务上下文放入相应的子部分。 因此,即使分布式事务仍然挂起,仍可以关闭该连接而不会生成错误。 这样,您就可以在随后提交或中止分布式事务。

使用连接字符串关键字控制连接池
SqlConnection 对象的 ConnectionString 属性支持连接字符串键/值对,可以用于调整连接池逻辑的行为。 有关更多信息,请参见 ConnectionString。

池碎片
池碎片是许多 Web 应用程序中的一个常见问题,应用程序可能会创建大量在进程退出后才会释放的池。 这样,将打开大量的连接,占用许多内存,从而影响性能。

因为集成安全性产生的池碎片
连接根据连接字符串以及用户标识来建立池连接。 因此,如果使用网站上的基本身份验证或 Windows 身份验证以及集成的安全登录,每个用户将获得一个池。 尽管这样可以提高单个用户的后续数据库请求的性能,但是该用户无法利用其他用户建立的连接。 这样还使每个用户至少产生一个与数据库服务器的连接。 这对特定 Web 应用程序结构会产生副作用,因为开发人员需要衡量安全性和审计要求。

因为许多数据库产生的池碎片
许多 Internet 服务提供商在一台服务器上托管多个网站。 他们可能使用单个数据库确认窗体身份验证登录,然后为该用户或用户组打开与特定数据库的连接。 与身份验证数据库的连接将建立池连接,供每个用户使用。 但是,每个数据库的连接存在一个独立的池,因此增加了与服务器的连接数。

这也会对应用程序设计产生副作用。 但是,可以通过一个相对简单的方式避免此副作用,而又不会影响连接 SQL Server 时的安全性。 不是为每个用户或组连接独立的数据库,而是连接到服务器上的相同数据库,然后执行 Transact-SQL USE 语句来切换为所需的数据库。 以下代码段演示入如何创建与 master 数据库的初始连接,然后切换到 databaseName 字符串变量中指定的所需数据库。

Visual Basic 复制代码
' Assumes that command is a valid SqlCommand object and that
' connectionString connects to master.
command.Text = "USE DatabaseName"
Using connection As New SqlConnection(connectionString)
connection.Open()
command.ExecuteNonQuery()
End Using

C# 复制代码
// Assumes that command is a SqlCommand object and that
// connectionString connects to master.
command.Text = "USE DatabaseName";
using (SqlConnection connection = new SqlConnection(
connectionString))
{
connection.Open();
command.ExecuteNonQuery();
}


应用程序角色和连接池
通过调用 sp_setapprole 系统存储过程激活了 SQL Server 应用程序角色之后,该连接的安全上下文无法重置。 但是,如果启用了池,连接将返回池,在重复使用池连接时会出错。 有关更多信息,请参见知识库文章"SQL application role errors with OLE DB resource pooling"(OLE DB 资源池出现 SQL 应用程序角色错误)。

应用程序角色替代项
如果您使用的是 SQL Server 2005,我们建议您利用可代替应用程序角色的新安全机制。 有关更多信息,请参见在 SQL Server 中创建应用程序角色 (ADO.NET)。

View this post on my blog: http://www.haofengjing.org/?p=1555

四川治安总队原副队长落马 搜出千万连号百元钞_网易新闻中心

2月7日,春节放假后第一个工作日,四川省公安厅召开会议,由副省长、公安厅厅长侍俊主持,所有厅科级以上干部参会。当时会场气氛凝重。会议通报了数起四川省公安系统违法案件,其中最严重的一起是李荣飚案。

18天后,2月25日,四川省人民政府新闻办公室官方微博"四川发布"消息,四川省公安厅治安总队原副总队长李荣飚涉嫌重大受贿犯罪,近日四川省检察院已立案侦查,并对其采取逮捕强制措施。

李荣飚,涉嫌利用职务之便,为他人谋取利益,非法收受民爆企业主等人的财物。四川省公安厅多名官员称,李荣飚于去年8月已被有关部门带走调查,涉嫌受贿3100余万元。

而李荣飚同时还担任省工程爆破协会(后简称爆破协会)常务副理事长。有官员称,李荣飚涉嫌利用爆破协会敛财。

"搜出1100万连号百元大钞"

四川省公安厅处级官员李力(微博)(化名)回忆,他最后在公安厅大楼见到李荣飚是在去年8月初。平时李荣飚逢人总是摆出笑脸,但那一次却很沉默,心事重重的样子。

据了解,官方通报前,省公安厅的部分官员早就得知李荣飚案发。

李荣飚最后一次出现在公开报道中,是去年7月29日,四川省公安厅网站发布的一条消息显示,当天上午,李荣飚等向上级汇报了工作。

此后的8月份,省公安厅多名官员就听说李荣飚被举报,公安部纪委将其带走调查。

2013年12月底,四川省公安厅的督导巡视工作总结会,侍俊曾向巡视组成员通报李荣飚案的部分细节。

一名副厅级巡视组成员说,会上通报称:李荣飚作为治安总队副总队长,分管治安管理支队、枪爆管理支队等业务部门,利用职权向民用爆炸物企业等受贿3100万余元。

"在自己监管的行业中犯罪,涉案金额巨大,是很严重的犯罪案件。"该巡视组成员评论。

李力称,某了解李荣飚案详情的省厅领导曾私下提起,办案人员从李荣飚办公室搜出500万余元现金,从其家中搜出600万余元现金,总计现金1100万余元。"搜出的都是连号的崭新百元大钞。"

上述说法得到两名公安厅处级以上干部的证实。

四川公安厅内部一名处级干部告诉新京报记者,"据说,3000多万元贿赂大都是李荣飚自己交代的。他还对办案人员说,把收的贿赂交还后,希望能做回民警。"

这一说法也得到了李力的证实。

"检查合格后还得塞好处费"

李荣飚自2010年起,担任四川省公安厅治安总队副总队长,分管治安管理支队、特种行业管理支队、枪爆管理支队等。其中民爆企业是其重点监管对象。

国家对于民用爆炸物品行业,实行的是许可证制度。

凉山州一位高姓矿业老板告诉新京报记者,申请购买开矿用炸药,需经公安机关层层审批和检查,最后由省公安厅治安总队枪爆科批准发放购买许可证。

德阳市一家烟花爆竹燃放企业负责人介绍,企业需要的燃放许可证,跨省运输证,均由省公安厅治安总队发放。

李荣飚的一位老上级说,李荣飚掌握民用爆炸物的购买、销售、运输的审批许可权,有很大权力寻租空间,因此经常接受企业贿赂,乃至索贿。

当地一名负责监管民用爆炸物品企业的警察,介绍了行业"潜规则"。此类企业安全能否达标,公安部门的监管、检查至关重要。而有些监管人员在例行检查合格后,会捞取一笔好处费,才发给企业相关许可证。

这一说法得到四川某民用爆炸物公司负责人证实。他们每年需向相关监管人员送钱,"几万到十几万不等。治安总队的一些领导也是送钱对象之一。"

上述两位企业主都承认送过钱,并称与李荣飚相识,且关系良好。

这位大型烟花爆竹老板告诉记者,据行业内部知情人透露,李荣飚被纪委调查时交代了不少行贿人员,其中有泸州一烟花爆竹专营公司总经理钟某和遂宁一烟花爆竹厂厂长唐某。"据说,后来他俩都被纪委的人叫去谈话。"

记者近日电话联系上述两位企业主,唐某并没有否认向李荣飚行贿,而钟某则称:"与李荣飚没关系。"

这位老板还告诉记者,从2013年下半年起,落实中央八项规定,监管的人不敢收钱了,连请吃饭也不来了。"今年春节我们没有去省里拜访领导。"

"今年整肃政法系统纪律,没人敢弄钱了。"前述监管民爆企业的警察称。

2月7日,《人民公安报》报道,侍俊指出,要着眼容易发生腐败的领域,制定出规范权力运行的制度。

爆破协会成索贿平台?

除省公安厅治安总队副总队长,李荣飚还有另一个身份:四川省工程爆破协会的常务副理事长。

"前者让他成为爆炸物销售企业的监管者,后者则为李荣飚与企业提供了交流、升华感情的平台",省公安厅一名内部人士指出,李荣飚常以副理事长的身份,出席行业内的多次会议,结识了不少朋友。

该工程爆破协会是一个非营利性社会团体,成员是四川省从事工程爆破的科研、设计、教学、施工、管理的企事业单位或个人,均为自愿参加,其业务主管部门是省公安厅。

2011年8月,四川省工程爆破协会第五届理事选举,四川雅化实业集团股份有限公司副总裁樊建民当选为理事长。李荣飚当选为协会常务副理事长。

据公安厅内部一名官员透露,该协会由公安厅治安总队监管,实际上是李荣飚敛财的"小金库",李荣飚通过变相转移会员费、开设培训班捞钱,甚至通过协会平台密切接触民爆企业老板,私底下索贿、受贿。

2月23日,记者联系了理事长樊建民。

他说,虽然挂着协会理事长的头衔,但很少参与协会的管理工作。具体工作是李荣飚在做。李荣飚被抓后,协会活动基本就停止了。

每年上百万会费"去向不明"

这个工程爆破协会的经费来源:会费、捐赠和赞助。

一位烟花爆竹燃放公司的负责人、也是第五届理事会成员介绍,他的企业每年向协会缴纳1万元会费。

据他说,按照企业规模和企业老板在协会中的级别,会费有所不同,普通会员每年交纳3000至8000元不等,理事会成员每年交纳1万元,常务理事会员、副会长、会长交纳2万至5万。

雅化实业集团作为理事长单位,交纳的会费最多,为5万元。

协会网站称,2011年8月16日,四川省21个市、州的213家会员单位的代表参加第五次会员代表大会,其中理事会成员有128名。

按照理事会成员每年交1万元,则有128万元,再加上其他普通会员的会费,总会费超过150万。

企业会费流向何处?根据会员章程介绍,协会会费必须用于协会章程规定的业务范围和事业的发展。协会资产接受会员代表大会和财政部门的监督。

但一名理事成员告诉记者,每年协会财务部门会汇报一次会费使用情况,但因为"无人监督、审查,财务汇报只是走过场"。

他还透露,协会负责人曾说使用部分会费向监管部门"争取政策",实际上就是"给监管部门领导送钱"。

该协会还会组织涉爆企业事业单位领导层、管理层人员和工程技术人员的培训及考核工作。

记者搜索发现,从2011年5月到2013年7月,该协会共举办了2期共12个工程爆破技术人员培训班,参加培训人员近2000人。

据一名参加工程爆破协会培训班的企业员工透露,培训费用为1000元左右。粗略计算,两年间,协会收取培训费不低于200万。

此外,据多家企业介绍,协会还举办烟花爆竹和焰火燃放资格培训等多类培训班。

协会理事长樊建民说,"会费和培训费的具体流向我不清楚,虽然协会章程中规定协会资产接受会员代表大会和财政部门的监督,但实际上比较宽松。"

上述那位理事成员告诉记者,除了交钱的培训班,协会"基本没有什么活动,入会就是为了交钱。"

他说,入会的主要目的是为了认识监管部门领导和专家,以便逢年过节送礼。在申请企业从业许可证和专业技术人员资格证时,可以疏通关系。

其他两名协会理事成员亦向记者证实该理事的说法。

省公安厅的一名内部人士说,李荣飚既是协会副理事长,又是协会和成员企业监管机构的领导,因此相当比例的会费和培训费都要流入他的手中。而李荣飚通过协会,直接接触到一大批需要疏通关系的企业主,受贿也更为方便。

"李荣飚是栽倒在自己负责岗位职权上的典型案例。"李荣飚的老上级感叹。

李荣飚

身份

四川省公安厅治安总队原副总队长

可能的敛财手段

掌握民用爆炸物的购买、销售、运输审批许可权,可以"经常接受企业贿赂,乃至索贿","例行检查合格后,捞取好处费才发许可证"。

身份

四川省工程爆破协会的常务副理事长

可能的敛财手段

1、变相转移会员费

2、开设培训班捞钱

3、通过协会平台密切接触民爆企业老板,私底下索贿、受贿。

【链接】 民爆行业实行许可证制度

国家对于民用爆炸物品行业,实行的是许可证制度。公安机关负责对民用爆炸物品购买、运输、爆破作业,进行安全监督管理。

民爆企业老板称,民用爆炸物品的购买许可证、经营许可证、燃放许可证、跨省运输证等,均由省公安厅治安总队发放。

View this post on my blog: http://www.haofengjing.org/?p=1551

2014年2月26日星期三

WordPress免费插件:经典插件包Jetpack - WordPress 非官方中文站

WordPress免费æ'件:经典æ'件包Jetpack - WordPress 非官方中文站

Automattic公司旗下的WordPress,除了ç"¨æˆ·å¯è‡ªç"±ä¸‹è½½ã€å®‰è£…、使ç"¨çš„WordPress.org软件外,还提供有一个免费托管的博客服务版本,WordPress.com 。这个博客托管ç½'站上的许多优秀功能,并未完全包含在WordPress.org软件之内,但通过一个æ'件集å'ˆçŽ°ç»™äº†WordPress软件ç"¨æˆ·ã€‚这个æ'件集就是JetPack。 JetPack 是一个非常è'—名的WordPressæ'件集,在WordPress.org推荐的æ'件æŽ'行榜中,始终占据重要位置。在本人è¯'è'—《深入解析WordPress(第2版) 》(è¯'者序,样章下载)一书中,对此æ'件包有过一番介绍。 目前,这个æ'件集包含有30个功能各异的WordPressæ'件,这个数字æ‰"在不断增加中。这些æ'件可以分别激活,有些æ'件ç"šè‡³å¯ä»¥å•ç‹¬å®‰è£…。 Pic-2013-1109-001 按照名字æŽ'序,JetPackæ'件包中目前包含的æ'件有: Beautiful Math: æ•°å­¦æ'件,让你的博客文章æ"¯æŒLaTeX标记语言,适合与其他天才一起探讨复杂的数学公式。对于ç§'ç "类的博客ç½'站,意义非凡。 Carousel: 相册æ'件,将你的标准相册转为沉浸式的全屏ä½"验模式。 Comments: 评论æ'件,让评论者可以使ç"¨ä»–们的WordPress.com,Twitter,Facebook等账号登录,å'表评论。 Contact Form: è"系表格æ'件,可以在ç½'站任何地方æ'å…¥è"系表格。 Custom CSS: 外观æ'件,让你在无需修æ"¹ä¸»é¢˜çš„情况下,定制ç½'站的外观。 Enhanced Distribution: 分享æ'件,可以将公开的文章å'Œè¯„论分享到搜索引æ"Žå'Œå…¶ä»–实时服务ç½'站。 Featured Content: 内容æ'件,推荐内容模块,在ç½'站主页主要位置显示你想着重推荐给ç"¨æˆ·çš„特定文章,最大程序吸引访问者的注意。该æ'件已删除,åº"该类似于置顶æ'件,已内置入WordPress软件。 Google+ Profile: 社交åª'ä½"æ'件,访问者可以ç"¨Google+账户登录,可以é"¾æŽ¥åˆ°ç"¨æˆ·çš„Google+账户,也可以在Google+中显示你博客文章的é"¾æŽ¥ã€‚ Gravatar Hovercards: 头像æ'件,å½"鼠标移动到评论者的Gravatar头像时,以弹出框形式显示评论者的Gravatar档案(账户信息)。 Infinite Scroll: 外观æ'件,给你的主题增加infinite scroll(即无限滚动)功能。 JSON API: äº'服务,允许授权的åº"ç"¨å®‰å…¨åœ°è®¿é—®ä½ çš„ç½'站内容。 Likes: 社交åª'ä½"æ'件,类似Facebook.com上的Like功能,让ç"¨æˆ·å¯ä»¥è¡¨è¾¾å¯¹ä½ æ‰€å†™å†…容的喜爱。同时,也表达出你ç½'站内容受欢迎程度。 Mobile Push Notifications: 移动åº"ç"¨æ'件,å½"ä½ çš„ç½'ç«™æ"¶åˆ°æ–°çš„评论时,会å'你的你的苹果或安å"设备å'出提示。 Mobile Theme: 移动åº"ç"¨æ'件,为移动设备优化你的ç½'站。 Omnisearch: 全能搜索æ'件,搜索一次,得到所有ç»"果!全能搜索只是一个搜索框,却可以让你搜索许多不同的内容。 Photon: 优化æ'件,通过WordPress.com CDN来加速你的ç½'站。 Post by Email: å'布文章æ'件,提供一个é€"径,让你可以通过ç"µå­é‚®ä»¶åœ¨åšå®¢ä¸Šå'表文章。任何邮件客户端都可以å'博客å'表文章,因此你可以使ç"¨æ‰‹æœºç­‰ç§»åŠ¨è®¾å¤‡è½»æ¾å'布新文章。在苹果、安å"等智能手机普及之前,é»'èŽ"、Palm、WM、塞班流行的时代,这个功能非常实ç"¨ã€‚现在可以作为备ç"¨æ‰‹æ®µï¼Œä½¿ç"¨æœºä¼šå¾ˆå°'了。 Publicize: 分享æ'件,这个æ'件让你在å'表文章的同时,可以轻松将ç½'站文章分享到数个社交åª'ä½"ç½'站。 Social Links: 分享æ'件,这个模块基于上面这个Publicizeæ'件,让你的ç½'站主题æ"¯æŒç"¨æˆ·å°†å–œæ¬¢çš„内容分享到他们常ç"¨çš„社交åª'ä½"ç½'站上。该æ'件已删除,可能是因为功能重复。 Sharing: 分享æ'件,只需要点击几下,即可将你ç½'站内容分享到Facebook,Twitter等社交ç½'站上。 Shortcode Embeds: 分享æ'件,使ç"¨Embed技术嵌入其他ç½'站内容,æ"¯æŒYouTube, Vimeo, SlideShare等视é¢'ç½'站,无需编写代码。 WP.me Shortlinks: 短é"¾æŽ¥æ'件,启ç"¨WP.me的短é"¾æŽ¥æœåŠ¡ï¼Œæ–¹ä¾¿ä½ åˆ†äº«æ–‡ç« å'Œé¡µé¢ã€‚ Spelling and Grammar: 内容æ'件,æ"¹è¿›æ–‡ç« çš„拼写,风格å'Œè¯­æ³•ï¼Œé€‚合英文或其他字母文字,对中文等帮助有限。 WordPress.com Stats: 统计分析æ'件,ç›'视ç½'站状态,提供简单扼要的报å'Šï¼Œå¹¶ä¸"不会增加服务器的负载。虽然WordPress.com服务在国内无法使ç"¨ï¼Œä½†å¦‚果你使ç"¨å›½å¤–主机,可以正常使ç"¨è¯¥æ'件。 Subscriptions: 订阅æ'件,允许ç"¨æˆ·é€šè¿‡é‚®ä»¶è®¢é˜…ä½ ç½'站的文章å'Œè¯„论。 Tiled Galleries: 相册æ'件,以三种新风格显示你的相册:矩形马赛克,方形马赛克,å'Œåœ†å½¢é©¬èµ›å…‹ã€‚ Toolbar Notifications: 工具栏æ'件,通过工具栏了解ç½'站的最新动态。 Extra Sidebar Widgets: 侧边栏æ'件,将图片,Twitter消息,ç½'ç«™RSS等添加到你ç½'站的侧边栏。 VaultPress: 备份æ'件,这是个æ"¶è´¹æ'件,随时备份你的ç½'站。 VideoPress: 视é¢'æ'件,这也是个æ"¶è´¹æ'件,可以上传你的视é¢'文件,然后在自己ç½'站上分享给ç"¨æˆ·ã€‚国内ç"¨æˆ·è¿˜æ˜¯ä½¿ç"¨ä¼˜é…·ç­‰ç½'站的免费服务æ¯"较方便。 Widget Visibility: 挂件æ'件,控制挂件可以出现在å"ªäº›é¡µé¢ä¸­ã€‚这个功能将会出现在WordPress 3.8正式版中。 WordPress.com Connect: 登录æ'件,允许ç"¨ä»¥ä»–们的WordPrss.com账户登录,通过WordPress.com Connect服务。这个服务国内ç"¨æˆ·ä¼°è®¡éš¾ä»¥ç"¨åˆ°ã€‚ WordPress JetPackæ'件包下载地址:WordPress.org官方下载JetPackæ'件包 。 本文标题: WordPress免费æ'件:经典æ'件包Jetpack 本文é"¾æŽ¥: http://wpchina.org/wordpress-plugin-jetpack-by-wordpress-dot-com-1346/ WPChina.org声明:转载本站文章,请务必保留所有版权信息。

架设wordpress 服务器,建一个自己管理的博客服务器

架设wordpress 服务器,建一个自己管理的博客服务器

现在很多人都ç"¨twitter,微博,微信。但是博客还是一个很好的信息å'布平台。æˆ'要做的不是使ç"¨ä¸€ä¸ªçŽ°æˆçš„提供商的服务器。因为那样总å½'是要受到某种限制。不是没有这个功能就是没有那个功能。 试ç"¨è¿‡å¾ˆå¤šä¹‹åŽï¼Œé€‰æ‹©äº†amazon ec2 主机,上面有现成的bitnamiçš„AMI镜像文件,直接安装。ec2主机第一年使ç"¨ä¸€ä¸ªmicro 实例是免费的。一年的时间还是挺长的,如果好的话,接着续费才二三百块é'±ã€‚ 前提你已经有一个自己的域名。æˆ'的域名是wenmangbo.com 步骤: 1.注册一个aws账户,这个其他ç½'站上的教程多的是,英语都很简单。 2.安装一个bitnami wordpress 镜像。去http://bitnami.com/stack/wordpress/cloud上点击é"¾æŽ¥å°±å¯ä»¥è¿›å…¥amzonç½'站安装了。 3.ç»'定固定ip:实例运行之后就可以ç"³è¯·ä¸€ä¸ªelastic ipç»'定到主机上。这就是一个公ç½'ip。 4.去你的域名提供商那修æ"¹ä¸€ä¸ªA记录,增加一个blog.wenmangbo.com 指å'å…¬ç½'ip。 5.在安装实例的过程中你会得到一个私é'¥ï¼Œæˆ'的是wenmangbo.pem 进入 terminal ssh -i wenmangbo.pem bitnami@blog.wenmangbo.com 进入后 $ sudo /opt/bitnami/apps/wordpress/bnconfig --appurl / 这样能去掉域名后的/wordpress 6.这样你进可以在浏览器上è¾"å…¥blog.wenmangbo.com/wp-admin 进入后台 ç"¨æˆ·åuser 密码bitnami 7.进入后新建一个管理å'˜è´¦æˆ·ï¼Œåˆ é™¤æŽ‰user账户。 8.大功å'Šæˆã€‚剩下就是美化å'Œå¢žåŠ å„种æ'件功能。

[]国务院常务会部署加快发展现代职业教育-搜狐新闻

本文自动转发自我的博客: http://www.haofengjing.org/?p=1543

 国务院总理李克强2月26日主持召开国务院常务会议,部署加快发展现代职业教育,审议通过《事业单位人事管理条例(草案)》。

  会议认为,发展职业教育是促进转方式、调结构和民生改善的战略举措。以改革的思路办好职业教育,对提升劳动大军就业创业能力、产业素质和综合国力,意义重大。必须坚持以提高质量、促进就业、服务发展为导向,发挥好政府引导、规范和督导作用,充分调动社会力量,吸引更多资源向职业教育汇聚,加快发展与技术进步和生产方式变革以及社会公共服务相适应、产教深度融合的现代职业教育,培养数以亿计的工程师、高级技工和高素质职业人才,为广大年轻人打开通向成功成才的大门,提高中国制造和中国装备的市场竞争力,促进经济提质增效升级,满足人民群众生产生活多样化的需求。

  会议确定了加快发展现代职业教育的任务措施。一是牢固确立职业教育在国家人才培养体系中的重要位置,促进形成"崇尚一技之长、不唯学历凭能力"的社会氛围,激发年轻人学习职业技能的积极性。二是创新职业教育模式,扩大职业院校在专业设置和调整、人事管理、教师评聘、收入分配等方面的办学自主权。建立学分积累和转换制度,打通从中职、专科、本科到研究生的上升通道。引导一批普通本科高校向应用技术型高校转型。三是提升人才培养质量。大力推动专业设置与产业需求、课程内容与职业标准、教学过程与生产过程"三对接",积极推进学历证书和职业资格证书"双证书"制度,做到学以致用。开展校企联合招生、联合培养的现代学徒制试点,鼓励中外合作。完善企业工程技术人员、高技能人才到职业院校担任专兼职教师的政策。四是引导支持社会力量兴办职业教育。积极支持各类办学主体通过独资、合资、合作等形式举办民办职业教育;探索发展股份制、混合所有制职业院校,允许以资本、知识、技术、管理等要素参与办学并享有相应权利。探索公办和社会力量举办的职业院校相互委托管理和购买服务的机制。社会力量举办的职业院校与公办职业院校具有同等法律地位。推动公办和民办职业教育共同发展。五是强化政策支持和监管保障。各级政府要完善财政投入机制,分类制定和落实职业院校办学标准,加强督导评估。加大对农村和贫困地区职业教育支持力度,完善资助政策,积极推行直补个人的资助办法。健全就业和用人政策。让职业教育为国家和社会源源不断地创造人才红利。

  会议指出,事业单位是提供公共服务的社会组织。规范事业单位人事管理,保障工作人员合法权益,是深化事业单位改革的保障。会议审议通过《事业单位人事管理条例(草案)》。草案对岗位设置、公开招聘和竞聘上岗、聘用合同、奖惩及争议处理等人事管理主要环节作出了明确规定。会议要求,要运用法治手段,进一步推进事业单位人事管理制度改革,规范管理制度,提高事业单位人力资源管理效能,形成能进能出、能上能下的用人机制,促进提升服务质量,让人民群众享受更加优质高效的公共服务。


[]理解RESTful架构 --深入浅出,挺好

本文自动转发自我的博客: http://www.haofengjing.org/?p=1542

越来越多的人开始意识到,网站即软件,而且是一种新型的软件。

这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。

网站开发,完全可以采用软件开发的模式。但是传统上,软件和网络是两个不同的领域,很少有交集;软件开发主要针对单机环境,网络则主要研究系统之间的通信。互联网的兴起,使得这两个领域开始融合,现在我们必须考虑,如何开发在互联网环境中使用的软件。

b1

RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

但是,到底什么是RESTful架构,并不是一个容易说清楚的问题。下面,我就谈谈我理解的RESTful架构。

一、起源

REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。

b2

Fielding是一个非常重要的人,他是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席。所以,他的这篇论文一经发表,就引起了关注,并且立即对互联网开发产生了深远的影响。

他这样介绍论文的写作目的:

"本文研究计算机科学两大前沿—-软件和网络—-的交叉点。长期以来,软件研究主要关注软件设计的分类、设计方法的演化,很少客观地评估不同的设计选择对系统行为的影响。而相反地,网络研究主要关注系统之间通信行为的细节、如何改进特定通信机制的表现,常常忽视了一个事实,那就是改变应用程序的互动风格比改变互动协议,对整体表现有更大的影响。我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。"

(This dissertation explores a junction on the frontiers of two research disciplines in computer science: software and networking. Software research has long been concerned with the categorization of software designs and the development of design methodologies, but has rarely been able to objectively evaluate the impact of various design choices on system behavior. Networking research, in contrast, is focused on the details of generic communication behavior between systems and improving the performance of particular communication techniques, often ignoring the fact that changing the interaction style of an application can have more impact on performance than the communication protocols used for that interaction. My work is motivated by the desire to understand and evaluate the architectural design of network-based application software through principled use of architectural constraints, thereby obtaining the functional, performance, and social properties desired of an architecture. )

二、名称

Fielding将他对互联网软件的架构原则,定名为REST,即Representational State Transfer的缩写。我对这个词组的翻译是"表现层状态转化"。

如果一个架构符合REST原则,就称它为RESTful架构。

要理解RESTful架构,最好的方法就是去理解Representational State Transfer这个词组到底是什么意思,它的每一个词代表了什么涵义。如果你把这个名称搞懂了,也就不难体会REST是一种什么样的设计。

三、资源(Resources)

REST的名称"表现层状态转化"中,省略了主语。"表现层"其实指的是"资源"(Resources)的"表现层"。

所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。

所谓"上网",就是与互联网上一系列的"资源"互动,调用它的URI。

四、表现层(Representation)

"资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式,叫做它的"表现层"(Representation)。

比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。

URI只代表资源的实体,不代表它的形式。严格地说,有些网址最后的".html"后缀名是不必要的,因为这个后缀名表示格式,属于"表现层"范畴,而URI应该只代表"资源"的位置。它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述。

五、状态转化(State Transfer)

访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。

互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。

客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

六、综述

综合上面的解释,我们总结一下什么是RESTful架构:

(1)每一个URI代表一种资源;

(2)客户端和服务器之间,传递这种资源的某种表现层;

(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

七、误区

RESTful架构有一些典型的设计误区。

最常见的一种设计错误,就是URI包含动词。因为"资源"表示一种实体,所以应该是名词,URI不应该有动词,动词应该放在HTTP协议中。

举例来说,某个URI是/posts/show/1,其中show是动词,这个URI就设计错了,正确的写法应该是/posts/1,然后用GET方法表示show。

如果某些动作是HTTP动词表示不了的,你就应该把动作做成一种资源。比如网上汇款,从账户1向账户2汇款500元,错误的URI是:

正确的写法是把动词transfer改成名词transaction,资源不能是动词,但是可以是一种服务:

另一个设计误区,就是在URI中加入版本号:

因为不同的版本,可以理解成同一种资源的不同表现形式,所以应该采用同一个URI。版本号可以在HTTP请求头信息的Accept字段中进行区分(参见Versioning REST Services):

(完)