[转载]jQuery插件jQuery-JSONP使用注意 - dudu - 博客园

mikel阅读(1133)

[转载]jQuery插件jQuery-JSONP使用注意 – dudu – 博客园.

JQuery-JSONP (https://github.com/jaubourg/jquery-jsonp)是一个支持 JSONP 调用的 JQuery 插件,使用它是因为它支持出错时的 ajax 回调,而 jQuery 的 $.ajax 不支持,详见前一篇博文 jquery ajax中使用jsonp的限制

我们已经在实际项目中使用,在开始使用时遇到了2个问题,在这里记录并分享一下。

JSONP 调用示例代码:

var originImgSrc = 'cnbogs-logo.gif';
$.jsonp({
    url: '',
    data: { imgSrc: originImgSrc },
    callbackParameter: "callback",
    success: function (newImgSrc, textStatus, xOptions) {
        console.log(xOptions.data.imgSrc);
    },
    error: function (xOptions, textStatus) {
    }
});

[转载]Zint Barcode Generator (二维码生成器)V2.10.16 官网英文破解版

mikel阅读(1726)

[转载]论坛转帖:Zint Barcode Generator (二维码生成器)V2.10.16 官网英文破解版.

软件名称:Zint Barcode Generator (二维码生成器)V2.10.16 官网英文破解版
软件类型:国外软件
运行环境:Win2000/WinXP/Win2003/WindowsVista/Win7
软件语言:英文
授权方式:免费软件
软件大小:5.88 MB
官方主页:Www.Cngr.CN
更新时间:2012-10-18 00:22:41
软件简介:

[img]http://www.cngr.cn/dir/UploadPic/2012-10/201210180211638278.jpg[/img]

在我们生活会遇到格式各样的二维码,比如:某网站网址、软件下载地址的二维码等等,那么,你有木有想过这些各式各样的二维码是怎么生成的呢?今天东东给你推荐一款不错免费的二维码批量生成工具——Zint Barcode Generator

Zint Barcode Generator 是一款免费的二维码批量生成软件,其最大亮点是支持批量生成条形码,支持生成 EPS、PNG、SVG。另外,对于一些最后一位数字由电脑自动生成的条形码,在批量生成的时候不用输入。

Barcode Generator 是一个条码生成软件。
Barcode Generator 将创建所有通用线形条码以及二维条码。
创建后的条码可以直接打印到打印机或绘图机。
或者保存为最大 3200 dpi 的 TIFF 位图。

Zint Barcode Generator (二维码生成器)V2.10.16 官网英文破解版

[转载]博客园REST系列文章索引 - dreamhappy - 博客园

mikel阅读(1082)

[转载]博客园REST系列文章索引 – dreamhappy – 博客园.

最近在学习wcf和Rest,把博客园相关的文章做一整理,也是自己对wcf,Rest越来越深入的总结,大家在找资料时可以更方便

对REST架构 风格下WCF的一点补充

这篇文章的特点在我看来是提供了自定义客户端数据对rest服务端调用的实例,即使用webclient 发送自定义的数据到rest服务服务端。

传统的wcf应用程序在客户端会生成一个代理类,服务端与调用方可以共同遵守一些数据约定,比如实体类

在rest形势下,暴露给调用方的只有url ,get访问比较好处理,网上大部分基于wcf的rest服务端例子在创建好服务后,都直接使用地址栏get方式访问 。但 是如果双方传输的是一个是实体类等自定义数据,必定需要post方式或者其它非url处理方法,如rest服务是以post形式约定,暴露给客户端,而客 户端引用rest不会生成代理类,这种情况下post提交就要借助于webclient或者webrequest来组织自定义数据。

WCF REST 工作总结(一)

这篇文章由浅入深,讲述了怎么样安装开发rest的模版,主要会生成rest uritemlate结构 WebGetAttribute、WebInvokeAttribute属性之类的。特别方便,随后又讲述了客户端调用rest服务的3种方法。

WCF Web API 轻松实现 REST

这篇文章通过对比,介绍了新的实现Rest服务的方式Web Api,比传统的Wcf实现更加简单,同时列出了关于Web Api的一些资源

这里有 web Api网站 需要MVC4

【ASP.NET Web API教程】ASP.NET Web API系列教程目录

中英文对照读本,很好的web api学习博客

Web Api :用来在.NET平台上建立HTTP服务的Web API框架

WCF Web API 说再见,继承者ASP.NET Web API

我的理解:接触到web api让我想到利用.net可以方便的实现比较灵活的企业开放平台。服务端和服务端都比较简洁.

WebApi用的是Http协议,另外WebApi的扩展性更强,更灵活,性能要更好

REST 架构风格下的WCF特性简介

关于rest的总结

1 构建REST架构风格的WCF中我们使用的协议为webHttpBinding,与之对应的是webHttpBehavior

2 从 .NET 3.5 开始 支持绑定类型 wehttpBinding

通过Fiddler测试你的 REST WCF服务

这篇文章介绍了web端测试rest服务的方法,其实通过火狐的web控制台和firebug也同样可以测试,多种方法吗,多种选择

Rest权限验证

这篇文章不属于cnblogs,的确提供了一种简易的rest验证实现思路。

以下是WCF REST一些补充

1 WCF REST 和基于SOAP的服务契约定义不同,我们无需在相应的操作方法上面应用OperationContractAttribute特性,但是应用在接口/类上的ServiceContractAttribute特性仍是必需的

[ServiceContract(Namespace="http://www.artech.com/")]
   2: public interface IEmployees
   3: {
   4:     [WebGet(UriTemplate = "all")]
   5:     IEnumerable<Employee> GetAll();
   6: 
   7:     [WebGet(UriTemplate = "{id}")]
   8:     Employee Get(string id);
   9: 
  10:     [WebInvoke(UriTemplate = "/", Method = "POST")]
  11:     void Create(Employee employee);
  12: 
  13:     [WebInvoke(UriTemplate = "/", Method = "PUT")]
  14:     void Update(Employee employee);
  15: 
  16:     [WebInvoke(UriTemplate = "{id}", Method = "DELETE")]
  17:     void Delete(string id);
  18: }

WebHttpBehavior可以说是整个Web HTTP编程模型的核心,绝大部分针对Web的支持都是通过该行为实现的。实际上服务端终结点通过WebServiceHost应用了这个终结点行为

[转载]http协议详解-经典篇 - flychen - 博客园

mikel阅读(867)

[转载]http协议详解-经典篇 – flychen – 博客园.

最近要做IOS新闻客户端,准备搭建底层API框架,复习了一下http协议,以下是从网上找到的一篇很经典的解析。

————————————————————————————————————————

欢迎转载,尊重原创——flychen

http://www.cnblogs.com/flychen

————————————————————————————————————————

AUTHOR:  Jeffrey.zhu

引言                                       

 

HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提 出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且 HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

 

一、HTTP协议详解之URL

 

http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。

 

HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:
http://host[“:”port][abs_path]
http 表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口 80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作 浏览器自动帮我们完成。
eg:
1、输入:www.guet.edu.cn
浏览器自动转换成:http://www.guet.edu.cn/
2、http:192.168.0.116:8080/index.jsp

 

二、HTTP协议详解之请求篇

 

http请求由三部分组成,分别是:请求行、消息报头、请求正文

 

1、请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF
其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。

 

请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
应用举例:
GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,eg:GET /form.html HTTP/1.1 (CRLF)

 

POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。
eg:POST /reg.jsp HTTP/ (CRLF)
Accept:image/gif,image/x-xbit,… (CRLF)

HOST:www.guet.edu.cn (CRLF)
Content-Length:22 (CRLF)
Connection:Keep-Alive (CRLF)
Cache-Control:no-cache (CRLF)
(CRLF) //该CRLF表示消息报头已经结束,在此之前为消息报头
user=jeffrey&pwd=1234 //此行以下为提交的数据

 

HEAD方法与GET方法几乎是一样的,对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过GET请 求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到Request-URI所标识的资源的信息。该方法常用于测试超链接的有效性, 是否可以访问,以及最近是否更新。
2、请求报头后述
3、请求正文(略)

 

三、HTTP协议详解之响应篇

 

在接收和解释请求消息后,服务器返回一个HTTP响应消息。

 

HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
1、状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
eg:HTTP/1.1 200 OK (CRLF)

 

2、响应报头后述

 

3、响应正文就是服务器返回的资源的内容

 

四、HTTP协议详解之消息报头篇

 

HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。

 

HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。
每一个报头域都是由名字+“:”+空格+值 组成,消息报头域的名字是大小写无关的。

 

1、普通报头
在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。
eg:
Cache-Control 用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0使用的类似的报头域为Pragma。
请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached;
响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.
eg:为了指示IE浏览器(客户端)不要缓存页面,服务器端的JSP程序可以编写如下:response.sehHeader(“Cache-Control”,”no-cache”);
//response.setHeader(“Pragma”,”no-cache”);作用相当于上述代码,通常两者//合用
这句代码将在发送的响应消息中设置普通报头域:Cache-Control:no-cache

 

Date普通报头域表示消息产生的日期和时间

 

Connection普通报头域允许发送指定连接的选项。例如指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接

 

2、请求报头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
常用的请求报头
Accept
Accept请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。
Accept-Charset
Accept-Charset请求报头域用于指定客户端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
Accept-Encoding
Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
Accept-Language
Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言。eg:Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
Authorization
Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
Host(发送请求时,该报头域是必需的)
Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,eg:
我们在浏览器中输入:http://www.guet.edu.cn/index.html
浏览器发送的请求消息中,就会包含Host请求报头域,如下:
Host:www.guet.edu.cn
此处使用缺省端口号80,若指定了端口号,则变成:Host:www.guet.edu.cn:指定端口号
User-Agent
我 们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际 上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它 属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息 了。
请求报头举例:
GET /form.html HTTP/1.1 (CRLF)
Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)
Accept-Language:zh-cn (CRLF)
Accept-Encoding:gzip,deflate (CRLF)
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)
If-None-Match:W/”80b1a4c018f3c41:8317″ (CRLF)
User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)
Host:www.guet.edu.cn (CRLF)
Connection:Keep-Alive (CRLF)
(CRLF)

 

3、响应报头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。
常用的响应报头
Location
Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。
Server
Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。下面是
Server响应报头域的一个例子:
Server:Apache-Coyote/1.1
WWW-Authenticate
WWW-Authenticate响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
eg:WWW-Authenticate:Basic realm=”Basic Auth Test!” //可以看出服务器对请求资源采用的是基本验证机制。

 

4、实体报头
请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。
常用的实体报头
Content-Encoding
Content- Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所 引用的媒体类型,必须采用相应的解码机制。Content-Encoding这样用于记录文档的压缩方法,eg:Content- Encoding:gzip
Content-Language
Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读
者。eg:Content-Language:da
Content-Length
Content-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
Content-Type
Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。eg:
Content-Type:text/html;charset=ISO-8859-1
Content-Type:text/html;charset=GB2312
Last-Modified
Last-Modified实体报头域用于指示资源的最后修改日期和时间。
Expires
Expires 实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和 降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。eg:Expires:Thu,15 Sep 2006 16:23:12 GMT
HTTP1.1的客户端和缓存必须将其他非法的日期格式(包括0)看作已经过期。eg:为了让浏览器不要缓存页面,我们也可以利用Expires实体报头域,设置为0,jsp中程序如下:response.setDateHeader(“Expires”,”0″);

 

五、利用telnet观察http协议的通讯过程

 

实验目的及原理:
利用MS的telnet工具,通过手动输入http请求信息的方式,向服务器发出请求,服务器接收、解释和接受请求后,会返回一个响应,该响应会在telnet窗口上显示出来,从而从感性上加深对http协议的通讯过程的认识。

 

实验步骤:

 

1、打开telnet
1.1 打开telnet
运行–>cmd–>telnet

 

1.2 打开telnet回显功能
set localecho

 

2、连接服务器并发送请求
2.1 open www.guet.edu.cn 80 //注意端口号不能省略

 

HEAD /index.asp HTTP/1.0
Host:www.guet.edu.cn

/*我们可以变换请求方法,请求桂林电子主页内容,输入消息如下*/
open www.guet.edu.cn 80

GET /index.asp HTTP/1.0 //请求资源的内容
Host:www.guet.edu.cn

 

2.2 open www.sina.com.cn 80 //在命令提示符号下直接输入telnet www.sina.com.cn 80
HEAD /index.asp HTTP/1.0
Host:www.sina.com.cn

 

3 实验结果:

 

3.1 请求信息2.1得到的响应是:

 

HTTP/1.1 200 OK //请求成功
Server: Microsoft-IIS/5.0 //web服务器
Date: Thu,08 Mar 200707:17:51 GMT
Connection: Keep-Alive
Content-Length: 23330
Content-Type: text/html
Expries: Thu,08 Mar 2007 07:16:51 GMT
Set-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/
Cache-control: private

 

//资源内容省略

 

3.2 请求信息2.2得到的响应是:

 

HTTP/1.0 404 Not Found //请求失败
Date: Thu, 08 Mar 2007 07:50:50 GMT
Server: Apache/2.0.54 <Unix>
Last-Modified: Thu, 30 Nov 2006 11:35:41 GMT
ETag: “6277a-415-e7c76980”
Accept-Ranges: bytes
X-Powered-By: mod_xlayout_jh/0.0.1vhs.markII.remix
Vary: Accept-Encoding
Content-Type: text/html
X-Cache: MISS from zjm152-78.sina.com.cn
Via: 1.0 zjm152-78.sina.com.cn:80<squid/2.6.STABLES-20061207>
X-Cache: MISS from th-143.sina.com.cn
Connection: close

 

失去了跟主机的连接

 

按任意键继续…

 

4 .注意事项:1、出现输入错误,则请求不会成功。
2、报头域不分大小写。
3、更深一步了解HTTP协议,可以查看RFC2616,在http://www.letf.org/rfc上找到该文件。
4、开发后台程序必须掌握http协议

 

六、HTTP协议相关技术补充

 

1、基础:
高层协议有:文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP和HTTP协议等
中 介由三种:代理(Proxy)、网关(Gateway)和通道(Tunnel),一个代理根据URI的绝对格式来接受请求,重写全部或部分消息,通过 URI的标识把已格式化过的请求发送到服务器。网关是一个接收代理,作为一些其它服务器的上层,并且如果必须的话,可以把请求翻译给下层的服务器协议。一 个通道作为不改变消息的两个连接之间的中继点。当通讯需要通过一个中介(例如:防火墙等)或者是中介不能识别消息的内容时,通道经常被使用。
代 理(Proxy):一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的 服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处 理没有被用户代理完成的请求。
网关(Gateway):一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。
网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源。
通 道(Tunnel):是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继 的连接两端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。

2、协议分析的优势—HTTP分析器检测网络攻击
以模块化的方式对高层协议进行分析处理,将是未来入侵检测的方向。
HTTP及其代理的常用端口80、3128和8080在network部分用port标签进行了规定

3、HTTP协议Content Lenth限制漏洞导致拒绝服务攻击
使 用POST方法时,可以设置ContentLenth来定义需要传送的数据长度,例如ContentLenth:999999999,在传送完成前,内 存不会释放,攻击者可以利用这个缺陷,连续向WEB服务器发送垃圾数据直至WEB服务器内存耗尽。这种攻击方法基本不会留下痕迹。
http://www.cnpaf.net/Class/HTTP/0532918532667330.html

4、利用HTTP协议的特性进行拒绝服务攻击的一些构思
服务器端忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYNFlood攻击(SYN洪水攻击)。
而Smurf、TearDrop等是利用ICMP报文来Flood和IP碎片攻击的。本文用“正常连接”的方法来产生拒绝服务攻击。
19 端口在早期已经有人用来做Chargen攻击了,即Chargen_Denial_of_Service,但是!他们用的方法是在两台Chargen 服务器之间产生UDP连接,让服务器处理过多信息而DOWN掉,那么,干掉一台WEB服务器的条件就必须有2个:1.有Chargen服务2.有HTTP 服务
方法:攻击者伪造源IP给N台Chargen发送连接请求(Connect),Chargen接收到连接后就会返回每秒72字节的字符流(实际上根据网络实际情况,这个速度更快)给服务器。

5、Http指纹识别技术
Http 指纹识别的原理大致上也是相同的:记录不同服务器对Http协议执行中的微小差别进行识别.Http指纹识别比TCP/IP堆栈指纹识别复杂许 多,理由是定制Http服务器的配置文件、增加插件或组件使得更改Http的响应信息变的很容易,这样使得识别变的困难;然而定制TCP/IP堆栈的行为 需要对核心层进行修改,所以就容易识别.
要让服务器返回不同的Banner信息的设置是很简单的,象Apache这样的开放源代码的Http服 务器,用户可以在源代码里修改Banner信息,然 后重起Http服务就生效了;对于没有公开源代码的Http服务器比如微软的IIS或者是Netscape,可以在存放Banner信息的Dll文件中修 改,相关的文章有讨论的,这里不再赘述,当然这样的修改的效果还是不错的.另外一种模糊Banner信息的方法是使用插件。
常用测试请求:
1:HEAD/Http/1.0发送基本的Http请求
2:DELETE/Http/1.0发送那些不被允许的请求,比如Delete请求
3:GET/Http/3.0发送一个非法版本的Http协议请求
4:GET/JUNK/1.0发送一个不正确规格的Http协议请求
Http指纹识别工具Httprint,它通过运用统计学原理,组合模糊的逻辑学技术,能很有效的确定Http服务器的类型.它可以被用来收集和分析不同Http服务器产生的签名。

6、其他:为了提高用户使用浏览器时的性能,现代浏览器还支持并发的访问方式,浏览一个网页时同时建立多个连接,以迅速获得一个网页上的多个图标,这样能更快速完成整个网页的传输。
HTTP1.1中提供了这种持续连接的方式,而下一代HTTP协议:HTTP-NG更增加了有关会话控制、丰富的内容协商等方式的支持,来提供
更高效率的连接。

[转载]HTTP协议之缓存 - 小坦克 - 博客园

mikel阅读(1009)

[转载]HTTP协议之缓存 – 小坦克 – 博客园.

之前写过一个篇 【HTTP协议详解】 ,这次继续介绍HTTP协议中的缓存机制。HTTP协议提供了非常强大的缓存机制, 了解这些缓存机制,对提高网站的性能非常有帮助。 本文介绍浏览器和Web服务器之间如何处理”浏览器缓存“,以及控制缓存的http header.

 

本文会使用Fiddler来查看HTTP request和Response, 如果不熟悉这工具,可以先参考[Fiddler教程] 。在看本文的时候, 请务必打开Fiddler来实践。

 
阅读目录

 

  1. 缓存的概念
  2. 缓存的好处
  3. Fiddler可以方便地查看缓存的header
  4. 如何判断缓存新鲜度
  5. 通过最后修改时间,判断缓存新鲜度
  6. 与缓存相关的header
  7. ETag
  8. 浏览器不使用缓存
  9. 直接使用缓存,不去服务器端验证
  10. 如何设置IE不使用缓存
  11. 公有缓存和私有缓存的区别

 

 

 

缓存的概念

 

缓存这个东西真的是无处不在, 有浏览器端的缓存, 有服务器端的缓存,有代理服务器的缓存, 有ASP.NET页面缓存,对象缓存。 数据库也有缓存, 等等。

 

http中具有缓存功能的是浏览器缓存,以及缓存代理服务器

 

 

 

http缓存的是指:当Web请求抵达缓存时, 如果本地有“已缓存的”副本,就可以从本地存储设备而不是从原始服务器中提取这个文档。

 

缓存的好处

 

缓存的好处是显而易见的, 好处有,

 

1. 减少了冗余的数据传输,节省了网费。

 

2. 减少了服务器的负担, 大大提高了网站的性能

 

3. 加快了客户端加载网页的速度

 

 

 

Fiddler可以方便地查看缓存的header

 

Fiddler中把header都分门别类的放在一起,这样方便查看。

 

 

 

 

如何判断缓存新鲜度

 

Web服务器通过2种方式来判断浏览器缓存是否是最新的。

 

第一种, 浏览器把缓存文件的最后修改时间通过 header ”If-Modified-Since“来告诉Web服务器。

 

第二种, 浏览器把缓存文件的ETag, 通过header “If-None-Match”, 来告诉Web服务器。

 

 

 

通过最后修改时间, 来判断缓存新鲜度

 
1. 浏览器客户端想请求一个文档,  首先检查本地缓存,发现存在这个文档的缓存,  获取缓存中文档的最后修改时间,通过: If-Modified-Since, 发送Request给Web服务器。

 

2. Web服务器收到Request,将服务器的文档修改时间(Last-Modified): 跟request header 中的,If-Modified-Since相比较, 如果时间是一样的, 说明缓存还是最新的, Web服务器将发送304 Not Modified给浏览器客户端, 告诉客户端直接使用缓存里的版本。如下图。

 

 

3. 假如该文档已经被更新了。Web服务器将发送该文档的最新版本给浏览器客户端, 如下图。

 

 

 

 

实例: 打开Fiddler, 然后打开博客园首页。然后F5刷新几次浏览器。 你会看到博客园首页也用了缓存。

 

 

 

 

与缓存有关的header

 

我们来看看每个header的具体含义。

 

Request

 

Cache-Control: max-age=0 以秒为单位
If-Modified-Since: Mon, 19 Nov 2012 08:38:01 GMT 缓存文件的最后修改时间。
If-None-Match: “0693f67a67cc1:0” 缓存文件的Etag值
Cache-Control: no-cache 不使用缓存
Pragma: no-cache 不使用缓存

 

 

 

 

 

 

 

 

 

 

 

 

Response

 

Cache-Control: public 响应被缓存,并且在多用户间共享,  (公有缓存和私有缓存的区别,请看另一节
Cache-Control: private 响应只能作为私有缓存,不能在用户之间共享
Cache-Control:no-cache 提醒浏览器要从服务器提取文档进行验证
Cache-Control:no-store 绝对禁止缓存(用于机密,敏感文件)
Cache-Control: max-age=60 60秒之后缓存过期(相对时间)
Date: Mon, 19 Nov 2012 08:39:00 GMT 当前response发送的时间
Expires: Mon, 19 Nov 2012 08:40:01 GMT 缓存过期的时间(绝对时间)
Last-Modified: Mon, 19 Nov 2012 08:38:01 GMT 服务器端文件的最后修改时间
ETag: “20b1add7ec1cd1:0” 服务器端文件的Etag值

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

如果同时存在cache-control和Expires怎么办呢?
浏览器总是优先使用cache-control,如果没有cache-control才考虑Expires

 

 

 

ETag

 

ETag是实体标签(Entity Tag)的缩写, 根据实体内容生成的一段hash字符串(类似于MD5或者SHA1之后的结果),可以标识资源的状态。 当资源发送改变时,ETag也随之发生变化。

 

ETag是Web服务端产生的,然后发给浏览器客户端。浏览器客户端是不用关心Etag是如何产生的。

 

为什么使用ETag呢? 主要是为了解决Last-Modified 无法解决的一些问题。

 

1. 某些服务器不能精确得到文件的最后修改时间, 这样就无法通过最后修改时间来判断文件是否更新了。

 

2. 某些文件的修改非常频繁,在秒以下的时间内进行修改. Last-Modified只能精确到秒。

 

3. 一些文件的最后修改时间改变了,但是内容并未改变。 我们不希望客户端认为这个文件修改了。

 

 

 

实例, 打开Fiddler, 打开博客园首页。  你可以看到很多图片,或者CSS文件都是用了缓存。 这些都是通过比较ETag的值,来判断文件是否更新了。

 

 

 

 

浏览器不使用缓存

 

CTRL+F5强制刷新浏览器,或者设置IE。  可以让浏览器不使用缓存。

 

1. 浏览器发送Http request, 给Web 服务器, header中带有Cache-Control: no-cache.   明确告诉Web服务器,客户端不使用缓存。

 

2. Web服务器将把最新的文档发送给浏览器客户端.

 

 

 

实例:

 

打开Fiddler, 打开博客园首页, 然后按CTRL+F5强制刷新浏览器,你将看到

 

 

Pragma: no-cache的作用和Cache-Control: no-cache一模一样。 都是不使用缓存。

 

Pragma: no-cache 是HTTP 1.0中定义的, 所以为了兼容HTTP 1.0. 所以会同时使用Pragma: no-cache和Cache-Control: no-cache

 

 

 

直接使用缓存,不去服务器验证

 

按F5刷新浏览器和在地址栏里输入网址然后回车。 这两个行为是不一样的。

 

按F5刷新浏览器, 浏览器会去Web服务器验证缓存。

 

如果是在地址栏输入网址然后回车,浏览器会”直接使用有效的缓存”, 而不会发http request 去服务器验证缓存,这种情况叫做缓存命中,如下图

 

 

 

 

实例: 比较第一次访问博客园主页和第二次博客园主页

 

1. 启动Fiddler, 用firefox打开博客园主页, 发现有50多个session。

 

2. 按CTRL+X将Fiddler中的所有session删除。 关闭firefox,重新打开一个firefox,打开博客园主页。   发现只有30多个session.

 

分析;  少了的session是因为firefox直接用了缓存,而没有发http request。

 

 

 

 

 

 

如何设置IE不使用缓存

 

打开IE。点击工具栏上的, 工具->Internet选项->常规->浏览历史记录 设置. 选择“从不”。然后保存。

 

然后点击“删除”  把Internet临时文件都删掉 (IE缓存的文件就是Internet临时文件)。

 

 

 

 

公有缓存和私有缓存的区别

 

Cache-Control: public 指可以公有缓存, 可以是数千名用户共享的。

 

Cache-Control: private 指只支持私有缓存, 私有缓存是单个用户专用的。

 

[转载]2012新.Net架构必备工具列表_IT新闻_博客园

mikel阅读(1061)

转载2012新.Net架构必备工具列表_IT新闻_博客园.

N 多年前微软官网曾发了.Net 下必备的十种工具,N多年过去了,世异时移,很多东西都已经变化了,那个列表也似乎陈旧了。而且,该文也只是对十种工具独立的介绍,显得有些罗列的感觉,是不是每个工具都是同等重要,工具与工具之间是否有联系?等等,阐述得并不明确。

这里,我想从另一个角崖,重新归纳一个更新的更实际的武器库。更新,是因为有很多最近几年才出来的工具/框架库,更实际,是因为我自己的项目就完全依赖使用。

Visual Studio

这个似乎是不言而喻的,只是从严谨的角度,也列在这。实际上,现在也有一个开源的 IDE 开发环境发展也不错,叫 SharpDevelop。我并没有仔细看,不敢妄评。而我因要用到之后会讲的 Resharper,也迫使我只能用 VS。

Resharper —重构必备

无论是从其名称,还是实际功能,Resharper 绝对称得上利器,一旦你用熟了你就再也离不开它了。我去年换工作,很大一部分原因就是因为原单位不让我使用 Resharper。几个面试,我也总在重复提出我这一要求。直至最新版本6.1为止,Resharper 已经是个多面手。早期,它还只是个重构的工具,如今它是反编译器(原来的 Reflector.Net 就用不上了),还是个代码审查工具(代码规范审查),还是代码生成器(Code Smith 又用不上了),最后,它对键盘快捷键的组织使用,对无鼠标操作极其有益。一句话,Resharper 能极大提高编码的效率,利器更是重器。

Fluent nHibernate — 域驱动 DDD 必备

这件武器其实分为两部分,一个是 Fluent,一个是 nHibernate (这不是废话)。nHibernate 知道了解的人很多,就是一个 ORM 工具,而加上 Fluent 之后就知之甚少了。从功能上,Fluent 只是在原来 ORM 工具基础加上一层封装,以 Fluent Interface 形式提供了使用 nHibernate 的 API。可是别小看这一层封装,从使用体验和效率提高方面,Fluent nHibernate 有着卓越的功效。就我个人经历,就是在 Fluent nHibernate 之后,才真正使用,喜爱上 nHibernate 本身。让大多数人比较头疼的创建映射 XML 文化,被全部 C# 文件代替,甚至可以完全省略。可以说这两部分是一个完美的结合,后者提供强大的基础功能,前者提供完美的使用接口。这不是一个成功软件必须的两个要素吗? 什么是 ORM,不会吧,放狗搜搜就知道了。我只想强调的是,不要把它仅仅看作一个功能库,它更是个架构设计的利器。从架构的角度,它把业务域和数据层隔离,使得 数据模型和业务域模型独立设计成为可能。这一点的影响是非常深远的。

nUnit + Machine Specification + Rhino Mock + AutoMocking — 单元测试必备

啊呀,不得啦。上一武器,我一下子介绍俩,这一次白送四个。这也体现我写本文的指导思想,从开发使用的角度来叙述而不是从工具提供者来还分。这 四个套件在一起实在是太完美了!nUnit 又是一个众所周知的测试框架,它提供了测试的基础功能和概念。MSpec 从 BDD 的角度,封装了一下 nUnit,也可以说是重构了一下语法,使测试可具有可读性,提供良好的测试组织结构,进而可以测试完了,直接生成一个完美的测试结果文档。Rhino Mock 也是一个熟客了,但是旧中有新,新的几个版本也加入了一些可圈可点的新性能,如所谓 AAA 语法(Arrange, Action, Assert 这与 MSpec 的 Establish, Because, It 关键词完全契合)。而从我的角度,看到的亮点仍然是可读性的改进。最后,AutoMock 的出现又让事情更加简单了,连创建 Mock 对象的语句都省掉,只要你把依赖类的接口,在被测试的类的构造器中声明传入,AutoMock 就自动为你创建 Mock 对象就,如同它的名字所表达的一样自动 Mock。当然,还有高级应用,暂不赘叙。

SQLite  — 集成测试必备

什么,数据库也算?是的,不过这里 SQLite 不是我的产品数据库,而是用它的内存数据库做集成测试的工作,可以说是集成测试的利器。I\O读写历来是性能的瓶颈,而敏捷编程对测试的高度依赖,也是对 测试性能的高度要求。即使是高度覆盖率的单元测试也仍然不够,我们依然希望能在持续构建(CI)中,每次能自动运行集成测试。而如果要有真正独立、干净的 集成/用例测试,最好是每个测试用例完全重建数据库,重置测试数据,这样的要求,只有内存数据才能得到良好的性能。使用 SQLite 证的内存库后,不光集或服务器可以轻快的完成集成测试。开发人员本地,也把集成测试很快的运行完。这样,我们的敏捷流程中不仅包括单位测试必须通过,甚至 也包括了集成测试。它的名字叫用户故事。

不过这个工具有个小小的问题,因为 SQLite 是基于C开发的,针对 32 位和 64 位系统,它分别发布了两套控件,所以你必须根据自己的平台,3引用不同的 Dll 文件。而且,VS 项目编译设置还必须明确指明是 x86 还是 x64,不能设为 Any CPU。就为这个由题,我很是头疼了几天,最后才找到这个解决方安案。使用上,由于前面使用了 Fluent nHibernate,除了配置,不用对代码做任何改动。如果要改改了,也就不是真正的集成测试了,不是吗?

Git  — 源代码管理必备

如果你能一天就把代码写完,你就不需要源代码管理,你能吗?做为一个源代码管理的新秀, Git 的发展是极其迅猛的。我看好它,是它优秀的底层设计,优秀的业务模型. 如果要了解什么是 DDD,Git 是一个非常好的典范。一般的源代码管理,都是基于单个文件的版本控制,而 Git 一开始设计就是基于每个提交(代码文件树)来追溯版本。你可能会不赞同我的说法,因为,很多代码控制仍然提供了项目级的分支或者版本,其实那只是一个假 像。VSS,SVN,TFS 的最底层,都先是文件版本控制,在这个基础之上,再提供项目版本的功能。而 Gif 却恰恰相反。这个很重要吗?是的,区别非常之大。引用 DDD 的思维,即然,从用户的角度,代码控制版本是基于文件树的,为什么你的业务模型却不是呢?所以,我把耙 VSS,SVN 等的这种实现方式,看作打补丁/修补方式,总有一天,补了摞补了,至于最后,再也不能修补了。还有一点 Git 是分布式代码管理库。

TeamCity  — 持续构建必备

嘘(抹汗),总算到讲到最后一个,已经写得太长太多了,写者累,看者烦。从 CI 工具的鼻祖 CCNet 升级到 TeamCity 之后,感觉确实不一样,鸟枪换炮。为什么要 CI,好像不是我这一篇短文可以讨论清楚的。

TC 的好处,第一:是商业软件并且免费,一般这两点很难同时出现。当然有个限制,如果你只使一个编译代理服务的话,这个对我来说已经足够。第二:它对很多三方工具支持做得很好。如, nUnit, MSpec,Git 等。最重要的是它是 CI 服务器!

好了,这就是目前我的兵器,已经足够了,让开发的流程顺畅,让你新的想法得以实现。敏捷在哪里,就在这些工具里。是否对你有用,欢迎点评,反馈。仍然还在看一些其它的工具,希望在真正使用获益之后,再为这个推荐列表添加更多成员。

[转载]用Fine Uploader+ASP.NET MVC实现ajax文件上传 - dudu - 博客园

mikel阅读(1100)

[转载][代码示例]用Fine Uploader+ASP.NET MVC实现ajax文件上传 – dudu – 博客园.

Fine Uploader(http://fineuploader.com/)是一个实现 ajax 上传文件的 JavaScript 组件。

This project attempts to achieve a user-friendly file-uploading experience over the web. It’s built as a JavaScript plugin for developers looking to incorporate file-uploading into their website.

Fine Uploader 不依赖于 JQuery,也就是说不引用JQuery.js,也可以正常使用。同时,它也提供了 jQuery Wrapper,可以方便地与jQuery集成。

这篇博文中的示例代码用的就是 Fine Uploader jQuery Wrapper。下面看示例代码:

Web前端实现

1. 下载jQuery Plug-in Fine Uploader,下载地址:https://github.com/valums/file-uploader/wiki/Releases

2. html代码:


图片上传 - 博客园
<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.3.min.js"></script><script type="text/javascript" src="/scripts/jquery.fineuploader-3.0.min.js"></script>
<div id="jquery-wrapped-fine-uploader"></div>
<script type="text/javascript">// <![CDATA[
$(function () {             $('#jquery-wrapped-fine-uploader').fineUploader({                 request: {                     endpoint: '/ImageUploader/ProcessUpload'                 }             });         });
// ]]></script>

代码说明:

a) <div id=”jquery-wrapped-fine-uploader”></div>用于显示上传按钮

b) endpoint 设定的是上传时服务端处理ajax请求的网址。

3. 浏览器中的显示效果

服务器 ASP.NET MVC 实现代码

Fine Uploader 的源代码中用 VB.NET 实现了一个 Controller(UploadController.vb),我们在使用时改为了 C# 代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace CNBlogs.Upload.Web.Controllers
{
public class ImageUploaderController : Controller
{
const int ChunkSize = 1024 * 1024;

public ActionResult Upload()
{
return View();
}

public ActionResult ProcessUpload(string qqfile)
{
using (var stream = Request.InputStream)
{
using (var br = new BinaryReader(stream))
{
WriteStream(br, qqfile);
}
}

return Json(new { success = true });
}

private void WriteStream(BinaryReader br, string fileName)
{
byte[] fileContents = new byte[] { };
var buffer = new byte[ChunkSize];

while (br.BaseStream.Position &lt; br.BaseStream.Length - 1) { if (br.Read(buffer, 0, ChunkSize) &gt; 0)
{
fileContents = fileContents.Concat(buffer).ToArray();
}
}

using (var fs = new FileStream(@"C:\\temp\\" + DateTime.Now.ToString("yyyyMMddHHmmSS") +
Path.GetExtension(fileName).ToLower(), FileMode.Create))
{
using (var bw = new BinaryWriter(fs))
{
bw.Write(fileContents);
}
}
}
}
}

图片上传结果演示

[转载]Linq使用心得——SelectMany替代二重foreach循环 - 楼上那个男人 - 博客园

mikel阅读(1221)

[转载]Linq使用心得——SelectMany替代二重foreach循环 – 楼上那个男人 – 博客园.

本篇记录了Linq学习的心得,较为浅显,各位大牛请轻拍。

学习Linq其实已经很久了,但是一直没有使用的习惯,故水平也始终没有提高。近来刻意强迫自己用Linq来替代C# 2.0的一些写法。这里有一些心得和各位分享一下。

首先看下面两个类的定义:

class Student
{
public int Score { get; set; }

public Student(int score)
{
this.Score = score;
}
}

class Teacher
{
public string Name { get; set; }

public ListStudents;

public Teacher(string order,Liststudents)
{
this.Name = order;

this.Students = students;
}
}

用以上两个类构建集合如下:

List teachers = new List
{
new Teacher("a",new List{ new Student(100),new Student(90),new Student(30) }),
new Teacher("b",new List{ new Student(100),new Student(90),new Student(60) }),
new Teacher("c",new List{ new Student(100),new Student(90),new Student(40) }),
new Teacher("d",new List{ new Student(100),new Student(90),new Student(60) }),
new Teacher("e",new List{ new Student(100),new Student(90),new Student(50) }),
new Teacher("f",new List{ new Student(100),new Student(90),new Student(60) }),
new Teacher("g",new List{ new Student(100),new Student(90),new Student(60) })
};

这里有7个老师,每个人有3个学生,总共21一个学生里又有3个倒霉蛋没考及格……我们想要获得这3个倒霉蛋的集合。C# 2.0的代码如下:

List studentList = new List();
foreach (var t in teachers)
{
foreach (var s in t.Students)
{
if (s.Score &lt; 60)
{
studentList.Add(s);
}
}
}

已经写了N多这样的二重foreach,写的都要吐了,简直恨不得做成代码段。因为所有编程语言都能这么写,有人觉得C#简单,可好学了,抓到就写,民工专用,抄袭Java,微软出品,必属垃圾,明天正午12点之前就会被淘汰……
反正我觉得C# 3.0之后是越来越难,越来越复杂。难道是年纪大了智商堪忧……那既然要反驳,今天我们就换个C# 3.0的新写法。首先是查询表达式的写法:

var list1 = from t in teachers
from s in t.Students
where s.Score &lt; 60 select s; 

是不是感觉好多了,就跟写SQL一样顺畅。而且一目了然。也许习惯于OOXX的.NET程序员不那么喜欢SQL的语法,那还可以试试Lamda表达式的写法:   var list2 = teachers.SelectMany(t => t.Students).Where(s => s.Score < 60);

嗯?怎么只有一行,这是不是太欺负人了,到时候公司数代码行数算工钱的时候怎么办……嗯……这种公司你还是离了吧……
写到这里我不禁感慨起SelectMany的伟大了,太好用了。其实我们刚才只是用了最简单的SelectMany也就是这个方法:

public static IEnumerableSelectMany(
this IEnumerable source,
Func> selector
)

这个用于IEnumerable的扩展方法接受一个Func委托,根据你的需要再返回另一个IEnumerable,配合Where真是秒杀二重foreach啊。
有时候我们需要输出更复杂的结果集,比如校长想知道教出这3个考不及格的倒霉蛋的,到底是哪几个更加倒霉的老师。那我们就要用到SelectMany的另一个重载方法了:

public static IEnumerable SelectMany(
this IEnumerable source,
Func&gt; collectionSelector,
Func resultSelector
)

第一眼看上去有点晕,重点是第一个Func委托的返回值IEnumerable<TCollection>,会遍历作为第二个Func委托的 参数TCollection传递,供你构建所需要的投影集合。这里给出一个例子,下面的代码选出了门下有不及格学生的倒霉蛋老师+门生的分数:

            var list3 = teachers.SelectMany( t => t.Students, (t, s) => new { t.Name, s.Score }) .Where(n => n.Score < 60);

在这里,校长大人得到的集合,不仅包含了所有不及格的分数,同时还对应了该分数学生的教师姓名。惨啊……
代码下载

[转载]在线浏览PDF文件的实用jquery插件推荐 - 58分享 - 博客园

mikel阅读(1168)

[转载]在线浏览PDF文件的实用jquery插件推荐 – 58分享 – 博客园.

在web开发当中我们经常需要进行需要在线浏览PDf内容,在线嵌入动态pdf,传统的解决方法安装客户端PDF阅读器,如果是在谷歌是可以在线浏览的,因为他自身就带了一些插件,以前遇到这样的问题往往是费时又费力,很不好解决,

今天就给大家分享一系列使用JavaScript实现的pdf插件效果,无需借助第三方插件就可以实现在线浏览功能,非常实用,

 

PDFObject

PDFObject

PDFobject可以帮助你在页面直接嵌入pdf文件,有时候有些项目需要动态地嵌入PDF文件。PDFObject为此而设计的,他能够快速和容易的嵌入PDF文件,PDFObject使用JavaScript来产生相同的符合标准的<OBJECT>标记,然后插入<OBJECT>到您的HTML元素的选择。您可以填满整个浏览器窗口,或将PDF格式转换成一个<DIV>或其他块级元素。

pdf.js

pdf.js

和 Google Chrome 使用的源自 Foxit 的闭源 PDF 浏览插件不同,PDF.js 是基于开放的 HTML5 及 JavaScript 技术实现的开源产品

pdf.js 是一个主要用于HTML5 平台上在线阅读PDF文档的小插件,基于JavaScript技术编写而成,无需任何本地技术支持。

pdf.js是由Mozilla Labs发布的。他们的目标是创建一个通用的,基于标准的网络平台,能够解析和渲染PDF文件,并最终发布一个PDF阅读器扩展,毫无疑问 pdf.js 将被整合入 Gecko 成为 Firefox 的内嵌 PDF 阅读器,但是具体整合时间表尚未确定

jsPDF

jsPDF

jsPDF 是一个使用Javascript语言生成PDF的开源库。你可以在Firefox插件,服务端脚本或是浏览器脚本中使用它。客户端Safari 和 iPhone Safari 支持得最好,其次是Opera和Windows下的Firefox 3等。IE暂不支持。。

jQuery Media Plugin

jQuery的媒体插件

JQuery Media Plugin是一款基于JQuery的网页媒体播放器插件,它支持大部分的网络多媒体播放器和多媒体格式,比如:Flash, Windows Media Player, Real Player, Quicktime, MP3,Silverlight, PDF。它根据当前的脚本配置,自动将a标签替换成div,并生成object, embed甚至是iframe代码,至于生成object还是embed,jQuery Media会根据当前平台自动判别,因此兼容性方面非常出色下面这段代码是jQuery Media生成后的结果:

复制代码
 1 <div class="media">
 2     <object width="450" height="250" attr1="attrValue1" attr2="attrValue2"
 3  codebase="http://www.apple.com/qtactivex/qtplugin.cab"
 4  classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B">
 5         <param name="src" value="myBetterMovie.mov">
 6         <param name="autoplay" value="true">
 7         <param name="param1" value="paramValue1">
 8         <param name="param2" value="paramValue2">
 9         <embed width="450" height="250" src="myBetterMovie.mov" autoplay="true"
10  attr1="attrValue1" attr2="attrValue2" param1="paramValue1" param2="paramValue2"
11  pluginspage="http://www.apple.com/quicktime/download/" > </embed>
12     </object>
13 </div>
复制代码

具体使用方法

html标记代码

1 <a class="media" href="sample.mov">My Quicktime Movie</a>
2 <a class="media" href="sample.swf">My Flash Movie</a>
3 <a class="media" href="sample.wma">My Audio File</a>
4 初始化脚本: 5 1 6 $('.media').media();

 

 

Google Docs PDF viewer

谷歌文档的PDF阅读器

ZOHO Viewer

ZOHO浏览器

Anychart:使用JavaScript导出PDF

Anychart:导出为PDF使用JavaScript

下图可以导出为PNG或JPG格式的静态图像或嵌入式静态图像,图表或一个完全互动的功能图

 

jQuery Document Viewer

jQuery的文档查看器

Document Viewer是一个jQuery插件,可以让你在网页中直接查看多种文件格式。文档浏览器支持的文件格式:PDF文件,文本文件,代码,图像,音频,视频等。

[转载]如何监测谁用了SQL Server的Tempdb空间? - _cc - 博客园

mikel阅读(927)

[转载]如何监测谁用了SQL Server的Tempdb空间? – _cc – 博客园.

摘自:http://blogs.msdn.com/b/apgcdsd/archive/2011/02/11/sql-server-tempdb.aspx

系统数据库是一个全局资源,供连接到 SQL Server 实例的所有用户使用。在现在的SQL Server里,其使用频率可能会超过用户的想象。如果Tempdb空间耗尽,许多操作将不能完成。

作为一个支持工程师,会被经常问到象“我的Tempdb为什么这么大?”“是谁把我的Tempdb空间用完的?”在SQL 2000的时候,这个问题很难回答。好在SQL 2005以后,引入了一张新的管理视图:sys.dm_db_file_space_usage。通过查询这张视图,能了解tempdb的空间使用情况, 能知道tempdb的空间是被哪一块对象使用掉的,是用户对象(user_object_reserved_page_count字段),还是系统对象 (internal_object_reserved_page_count字段),还是版本存储区 (version_store_reserved_page_count字段)。

在讨论Tempdb空间使用之前,我们先简单介绍一下通常什么操作会大量使用Tempdb。在SQL 2005和SQL 2008里,使用Tempdb空间的远远不止是临时表。常见的使用对象有:

用户对象(user_object_reserved_page_count)

用户对象由用户显式创建。这些对象可以位于用户会话的作用域中,也可位于创建对象所用例程的作用域中。 可以是存储过程、触发器或用户定义函数。 用户对象可以是下列项之一:

  • 用户定义的表和索引
  • 系统表和索引
  • 全局临时表和索引
  • 局部临时表和索引
  • table 变量
  • 表值函数中返回的表

内部对象(internal_object_reserved_page_count)

内部对象是根据需要由 SQL Server 数据库引擎创建的,用于处理 SQL Server 语句。 内部对象可以在语句的作用域中创建和删除。 内部对象可以是下列项之一:

  • 用于游标。
  • 用于哈希联接或哈希聚合操作的查询。
  • 某些 GROUP BY、ORDER BY 或 UNION 查询的中间排序结果。

版本存储(version_store_reserved_page_count)

版本存储区主要用来支持Snapshot事务隔离级别,以及SQL 2005以后推出的一些其他提高数据库并发度的新功能。

由此可见,光从用户发过来的语句本身,是很难判断这个连接的操作是否会使用Tempdb的。一个典型的例子,就是某些查询。如果表格上有良好的索引做支持,SQL Server不需要做哈希联接(Hash Join),那这个查询就不会用Tempdb。反之,如果表格很大,又没有好的索引,那Tempdb使用量就可能不小。

tempdb空间使用的一大特点,是只有一部分对象,例如用户创建的临时表、table变量等,可以用sys.allocation_units 和 sys.partitions这样的管理视图来管理。许多内部对象和版本存储在这些管理视图里没有体现。所以,sp_spaceused的结果和真实使用 会有很大差异,tempdb的空间使用是不能用sp_spaceused来跟踪的。必须借助sys.dm_db_file_space_usage这样的管理视图和管理函数,才能看到全貌。

 

下面以一个实例,讨论一下如何用DBCC命令、管理视图(DMV)以及管理函数(DMF)来监视是什么语句正在使用tempdb。

为了使结果简单,我们在测试之前先把SQL Server重起一次。

然后我们在Management Studio里做一个连接(连接A),将下面语句输入。这些语句会使用tempdb的空间。

 

select @@spid

go

use adventureworks

go

select getdate()

go

select * into #mySalesOrderDetail

from Sales.SalesOrderDetail

— 创建一个temp table

— 这个操作应该会申请user objects page

go

waitfor delay ‘0:0:2’

select getdate()

go

drop table #mySalesOrderDetail

— 删除一个temp table

— 这个操作后user object page数量应该会下降

go

waitfor delay ‘0:0:2’

select getdate()

go

select top 100000 * from

[Sales].[SalesOrderDetail]

INNER JOIN [Sales].[SalesOrderHeader]

ON [Sales].[SalesOrderHeader] .[SalesOrderID] = [Sales].[SalesOrderHeader].[SalesOrderID];

— 这里做了一个比较大的join.

— 应该会有internal objects的申请.

go

select getdate()

— join 语句做完以后internal objects page数目应该下降

go

 

那用什么脚本可用监视上面的行为呢?下面的脚本就可以监视和发现当前的Tempdb使用者。这个脚本需要在使用tempdb的语句开始运行之前开始。(读者当然可以根据自己的喜好,修改这个脚本。)

脚本首先用“dbcc showfilestats”语句查询当前tempdb的总体使用量。再查询sys.dm_db_file_space_usage视图,得到 Tempdb里当前总共有多少用户对象、内部对象、以及版本存储。然后查询sys.dm_db_session_space_usage和 sys.dm_exec_sessions,找到当前使用Tempdb的所有连接。最后通过sys.dm_exec_sql_text,找到这些连接正在 运行的语句。

 

use tempdb

— 每隔1秒钟运行一次,直到用户手工终止脚本运行

while 1=1

begin

select getdate()

— 从文件级看tempdb使用情况

dbcc showfilestats

— Query 1

— 返回所有做过空间申请的session信息

Select ‘Tempdb’ as DB, getdate() as Time,

    SUM (user_object_reserved_page_count)*8 as user_objects_kb,

    SUM (internal_object_reserved_page_count)*8 as internal_objects_kb,

    SUM (version_store_reserved_page_count)*8  as version_store_kb,

    SUM (unallocated_extent_page_count)*8 as freespace_kb

From sys.dm_db_file_space_usage

Where database_id = 2

— Query 2

— 这个管理视图能够反映当时tempdb空间的总体分配

SELECT t1.session_id,

t1.internal_objects_alloc_page_count,  t1.user_objects_alloc_page_count,

t1.internal_objects_dealloc_page_count , t1.user_objects_dealloc_page_count,

t3.*

from sys.dm_db_session_space_usage  t1 ,

— 反映每个session累计空间申请

sys.dm_exec_sessions as t3

— 每个session的信息

where

t1.session_id = t3.session_id

and (t1.internal_objects_alloc_page_count>0

or t1.user_objects_alloc_page_count >0

or t1.internal_objects_dealloc_page_count>0

or t1.user_objects_dealloc_page_count>0)

— Query 3

— 返回正在运行并且做过空间申请的session正在运行的语句

SELECT t1.session_id,

st.text

from sys.dm_db_session_space_usage as t1,

sys.dm_exec_requests as t4

CROSS APPLY sys.dm_exec_sql_text(t4.sql_handle) AS st

 where  t1.session_id = t4.session_id

   and t1.session_id >50

and (t1.internal_objects_alloc_page_count>0

or t1.user_objects_alloc_page_count >0

or t1.internal_objects_dealloc_page_count>0

or t1.user_objects_dealloc_page_count>0)

waitfor delay ‘0:0:1’

end

图1

在运行这个脚本的连接(连接B)里(图1),我们选择好“Result to File”。先开始运行它,指定输出文件路径。然后,我们再运行连接A(图2)。连接A运行结束后,手工停止连接B的运行。

 

图2

 

在连接A的结果中(),可以得到四个时间。图片上的例子,是:

11:39:36.513     — 开始创建temp table

11:39:38.920 – 开始删除temp table

11:39:40.937 – 开始查询

11:39:45.733 – 查询结束

 

连接B生成的是一个文本文件。利用一些有“列出所有包含某个特定字符串”行功能的编辑器工具,可以把每个命令结果挑出来。

从连接B生成的文本文件里所有dbcc showfilestats的结果(图3),可以看出tempdb的使用空间有过两次增长(从23到210,从47到118),中间有一次下降(从210到47)。

 

 

图3

从连接B生成的文本文件里所有Query 1的结果(图3),我们可以看到有三段时间,user object和internal object空间有申请和释放动作。它们分别是11:39:36 – 11:39:37 (user_objects_kb增长),11:39:40 – 11:39:41 (user_objects_kb下降),11:39:40 – 11:39:43(internal_objects_kb增长)。

 

 

图4

从Query 2的结果(图4)可以看到Connection A在这三个时间段都处于运行状态。

 

图5

根据时间,可以从Query 3的结果(图5)里找到Connection A当时正在运行的语句。例如在11:39:40 – 11:39:43(internal_objects_kb增长)这段时间里,一直都在运行下面这句话:

 

 

图6

从上面的结果可以看出,连接A的语句中,用tempdb最多的时间点在11:39:41和11:39:42之间,连接正在做图6里面的那条查询语句。SQL Server需要空间存放一些内部对象,来完成Inner Join。