采集原理(不要跟贴,谢谢。)
占位,请勿跟贴,如需技术讨论请加,
MSN:pc@mye.cn
从ISAPI开始(占位)
http://www.chinaitpower.com/A/2002-07-23/29847.html
[ 本帖最后由 faunus 于 2008-11-1 21:54 编辑 ]
正则表达式(占位)
正则表达式正则表达式关于.NET异步调用的初步总结
异步调用的实质:异步调用通过委托将所需调用的方法置于一个新线程上运行,从而能够使一个可能需要较长时间的任务在后台执行而不影响调用方的其他行为。
异步调用的实现:
前面已经讲道,异步调用通过委托实现。委托支持同步和异步调用。在同步调用中,一个委托的实例可记录多个目标方法;在异步调用中,一个委托实例中有且只能包含一个目标方法。异步调用使用委托实例的BeginInvoke方法和EndInvoke方法分别开始调用和检索返回值,这两个方法在编译期生成。调用BeginInvoke后委托立即返回;调用EndInvoke时倘若委托方法未执行完毕,则阻塞当前线程至调用完毕。
假设有一个委托
public delegate int ASyncHandler(int a, string b, ref string c);
那么,其BeginInvoke与EndInvoke的形式如下:
public IAsyncResult BeginInvoke(int a, string b, ref string c, AsyncCallback callback, object asyncState);
public int EndInvoke(ref string c, IAsyncResult asyncResult);
也就是说,BeginInvoke与EndInvoke的参数列表与当前委托签名有关,可以总结为:
public IAsyncResult BeginInvoke(委托所具有的全部参数,AsyncCallback callback,object asyncState);
public 委托返回值 EndInvoke(委托参数中ref/out部分,IAsyncResult asyncResult);
BeginInvoke返回一个IAsyncResult,其实质是实现IAsyncResult的System.Runtime.Remoting.Messaging.AsyncResult类。该对象相当于一个“凭证”,在调用EndInvoke时用于确认应等待返回的方法(猜测如此)。就像去银行,存钱时拿到一份存折(凭证),取款时依据存折(凭证)取款。
EndInvoke检索委托返回值,并返回标有ref/out的参数值。
IAsyncResult接口声明:
public interface IAsyncResult
{
object AsyncState { get;}
WaitHandle AsyncWaitHandle { get;}
bool CompletedSynchronously { get;}
bool IsCompleted { get;}
}
等待调用结束的三种方法:
1、使用EndInvoke主动等待异步调用结束。这是最简单的一种方法,适用于非用户界面程序及一些IO操作,因为在调用EndInvoke之后当前线程被阻塞,除了等待什么都不能做。
2、使用WaitHandle等待异步调用结束。IAsyncResult中有WaitHandle成员,获取用于等待异步操作完成的WaitHandle,即调用结束信号。使用WaitHandle.WaitOne()可以阻塞当前线程至异步调用完成。这样做的好处是:在调用WaitOne之后、EndInvoke之前,可以执行其他处理。
3、主动轮询。使用IAsyncResult中有IsCompleted成员检索当前异步调用情况。该方法适用于用户界面程序,想象可在一个循环内做到既等待委托完成,又可以更新用户界面。
4、使用回调,在异步调用结束时执行一个操作。前面的BeginInvoke方法签名的最后两个参数用于回调。需要用到AsyncCallback委托:
http://www.chenjiliang.com/Image/Extension/cs.ico复制http://www.chenjiliang.com/Image/Save.jpg保存
public delegate void AsyncCallback(IAsyncResult asyncResult);
回调方法在系统线程池中执行。BeginInvoke的最后一个参数(object asyncState)可以传递包含回调方法将要使用的信息的对象。在回调方法中调用EndInvoke可以通过取得System.Runtime.Remoting.Messaging.AsyncResult.AsyncDelegate实现。
方法1、2相差不算太大。
异步操作总结
class Program
{
// 委托原型
public delegate int DelegateHandler(int i);
// 目标方法
static int Test(int i)
{
Console.WriteLine("Async Thread:{0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(5000);
return ++i;
}
// 异步等待模式 :EndInvoke
static void Async_EndInvoke()
{
DelegateHandler dlg = new DelegateHandler(Test);
IAsyncResult ar = dlg.BeginInvoke(1, null, null);
int result = dlg.EndInvoke(ar);
Console.WriteLine(result);
}
// 异步等待模式 :WaitHandle.WaitOne
static void Async_WaitOne()
{
DelegateHandler dlg = new DelegateHandler(Test);
IAsyncResult ar = dlg.BeginInvoke(1, null, null);
ar.AsyncWaitHandle.WaitOne();
int result = dlg.EndInvoke(ar);
Console.WriteLine(result);
}
// 异步等待模式 :IsCompleted
static void Async_IsCompleted()
{
DelegateHandler dlg = new DelegateHandler(Test);
IAsyncResult ar = dlg.BeginInvoke(1, null, null);
while (!ar.IsCompleted) Thread.Sleep(10);
int result = dlg.EndInvoke(ar);
Console.WriteLine(result);
}
// 异步等待模式 :CallBack
static void Aysnc_CallBack()
{
DelegateHandler dlg = new DelegateHandler(Test);
dlg.BeginInvoke(1,
delegate(IAsyncResult ar)
{
int result = (ar.AsyncState as DelegateHandler).EndInvoke(ar);
Console.WriteLine(result);
}, dlg);
}
// 异步等待模式 :CallBack & Timeout
static void Async_TimeOut()
{
DelegateHandler dlg = new DelegateHandler(Test);
IAsyncResult iar = dlg.BeginInvoke(1,
delegate(IAsyncResult ar)
{
int result = (ar.AsyncState as DelegateHandler).EndInvoke(ar);
Console.WriteLine(result);
}, dlg);
ThreadPool.RegisterWaitForSingleObject(iar.AsyncWaitHandle,
delegate(object state, bool timeout)
{
// 如果没有超时,该回调方法会在目标方法后立即执行。
// 不管超时与否,该回调方法都会执行,因此要判断timeout参数。
Console.WriteLine("Timeout:{0}, Thread:{1}", timeout, Thread.CurrentThread.ManagedThreadId);
}, null, 10000, true);
}
static void Main()
{
Console.WriteLine("Main Thread:{0}", Thread.CurrentThread.ManagedThreadId);
Async_TimeOut();
Console.WriteLine("Press any key to exit...");
Console.ReadKey(true);
}
[ 本帖最后由 faunus 于 2008-11-8 20:43 编辑 ]
页面状态管理之asp.net
---(客户端)---------1、视图状态
视图状态是 ASP.NET 页框架默认情况下用于保存往返过程之间的页和控件值的方法。当呈现页的 HTML 形式时,需要在回发过程中保留的页的当前状态和值将被序列化为 Base64 编码的字符串,并输出到视图状态的隐藏字段中。
您可以通过使用页的 ViewState 属性将往返过程中的数据保存到 Web 服务器来利用自己的代码访问视图状态。ViewState 属性是一个包含密钥/值对(其中包含视图状态数据)的字典。
视图状态信息将序列化为 XML,然后使用 Base64 编码进行编码,这将生成大量的数据。将页回发到服务器时,视图状态的内容将作为页回发信息的一部分发送。 页面本身将 20 字节左右的信息保存在 ViewState 中,用于在回传时将 PostBack 数据和 ViewState 值分发给正确的控件。因此,即使该页面或应用程序禁用了 ViewState,仍可以在 ViewState 中看到少量的剩余字节。下列服务器控件不能禁止ViewState
Textbox
Checkbox
Checkbox List
RadioButtonList
控件 TextBox 的 TextMode 属性设置为 Password时,它的状态将不会被保存在 ViewState 中,这应该是出于安全性的考虑。
2、控件状态
3、隐藏域
4、Cookie
5、查询字符串
---(服务器端)---------
6、应用程序状态
7、会话状态
8、配置文件属性
[ 本帖最后由 faunus 于 2008-10-21 12:46 编辑 ]
ViewState专题
ViewState ASP.net机制:http://blog.csdn.net/jianxiong8814/archive/2008/02/14/2096173.aspx
ViewState JAVA机制:
http://www.operamasks.org/articles/magic-8/html_single/index.html#d0e91
ViewState 分析工具:
http://dotnet.itpub.net/post/20969/294403
ViewState 解码工具:
http://hi.baidu.com/freezesoul/blog/item/727830faec94201da8d31114.html
结论:http://bbs.locoy.com/spider-31315-1-1.html
[ 本帖最后由 faunus 于 2008-10-23 14:28 编辑 ]
HTTP标头专题
成员名称 说明Accept Accept 标头,指定响应可接受的 MIME 类型。
AcceptCharset Accept-Charset 标头,指定响应可接受的字符集。
AcceptEncoding Accept-Encoding 标头,指定响应可接受的内容编码。
AcceptLanguage Accept-Langauge 标头,指定响应首选的自然语言。
Allow Allow 标头,指定支持的 HTTP 方法集。
Authorization Authorization 标头,指定客户端为向服务器验证自身身份而出示的凭据。
CacheControl Cache-Control 标头,指定请求/响应链上所有缓存控制机制必须服从的指令。
Connection Connection 标头,指定特定连接需要的选项。
ContentEncoding Content-Encoding 标头,指定已应用于伴随正文数据的编码。
ContentLanguage Content-Langauge 标头,指定伴随正文数据的自然语言。
ContentLength Content-Length 标头,指定伴随正文数据的长度(以字节为单位)。
ContentLocation Content-Location 标头,指定可从其中获得伴随正文的 URI。
ContentMd5 Content-MD5 标头,指定伴随正文数据的 MD5 摘要,用于提供端到端消息完整性检查。
ContentRange Content-Range 标头,指定在完整正文中应用伴随部分正文数据的位置。
ContentType Content-Type 标头,指定伴随正文数据的 MIME 类型。
Cookie Cookie 标头,指定向服务器提供的 Cookie 数据。
Date Date 标头,指定开始创建请求的日期和时间。
Expect Expect 标头,指定客户端要求的特定服务器行为。
Expires Expires 标头,指定日期和时间,在此之后伴随的正文数据应视为陈旧的。
From From 标头,指定控制请求用户代理的用户的 Internet 电子邮件地址。
Host Host 标头,指定所请求资源的主机名和端口号。
IfMatch If-Match 标头,指定仅当客户端的指示资源的缓存副本是最新的时,才执行请求的操作。
IfModifiedSince If-Modified-Since 标头,指定仅当自指示的数据和时间之后修改了请求的资源时,才执行请求的操作。
IfNoneMatch If-None-Match 标头,指定仅当客户端的指示资源的缓存副本都不是最新的时,才执行请求的操作。
IfRange If-Range 标头,指定如果客户端的缓存副本是最新的,仅发送指定范围的请求资源。
IfUnmodifiedSince If-Unmodified-Since 标头,指定仅当自指示的日期和时间之后修改了请求的资源时,才执行请求的操作。
KeepAlive Keep-Alive 标头,指定用以维护持久性连接的参数。
LastModified Last-Modified 标头,指定上次修改伴随的正文数据的日期和时间。
MaxForwards Max-Forwards 标头,指定一个整数,表示此请求还可转发的次数。
Pragma Pragma 标头,指定可应用于请求/响应链上的任何代理的特定于实现的指令。
ProxyAuthorization Proxy-Authorization 标头,指定客户端为向代理验证自身身份而出示的凭据。
Range Range 标头,指定代替整个响应返回的客户端请求的响应的子范围。
Referer Referer 标头,指定从中获得请求 URI 的资源的 URI。
Te TE 标头,指定响应可接受的传输编码方式。
Trailer Trailer 标头,指定标头字段显示在以 chunked 传输编码方式编码的消息的尾部。
TransferEncoding Transfer-Encoding 标头,指定对消息正文应用的转换的类型(如果有)。
Translate Translate 标头,与 WebDAV 功能一起使用的 HTTP 规范的 Microsoft 扩展。
Upgrade Upgrade 标头,指定客户端支持的附加通信协议。
UserAgent User-Agent 标头,指定有关客户端代理的信息。
Via Via 标头,指定网关和代理程序要使用的中间协议。
Warning Warning 标头,指定关于可能未在消息中反映的消息的状态或转换的附加信息。
HTTP协议
案例一点的:http://meymz.blog.163.com/blog/static/38120921200771033135285/
直观一点的:
http://www.wesoho.com/article.asp?id=2603
有点用:
http://bbs.w3china.org/dispbbs.asp?BoardID=10&ID=62708&replyID=143393&skin=1
[ 本帖最后由 faunus 于 2008-10-23 16:13 编辑 ]
cookie专题
cookieCollection是一个针对一个域所有的cookie的集合。cookeContainer是一个容器,里面可以装多个域的cookie的集合,即一个cookieContainer可以包含多个
cookieCollection,这个容器可以定义大小,决定最多装多少个cookie,如果装满了还要再
装,它会自动剔除原来过期的cookie.
cookie的结构:Cookie由变量名和值组成,类似Javascript变量。其属性里既有标准的Cookie变量,也有用户自己创建的变量,属性中变量是用“变量=值”形式来保存。根据Netscape公司的规定,Cookie格式如下:
Set-Cookie:
NAME=VALUE;
Expires=DATE;
Path=PATH;
Domain=DOMAIN_NAME;
SECURENAME=VALUE:
这是每一个Cookie均必须有的部分。
NAME是该Cookie的名称,VALUE是该Cookie的值。在字符串“NAME=VALUE”中,不含分号、逗号和空格等字符。
Expires=DATE:Expires变量是一个只写变量,它确定了Cookie有效终止日期。该属性值DATE必须以特定的格式来书写:星期几,DD-MM-YY HH:MM:SS GMT,GMT表示这是格林尼治时间。反之,不以这样的格式来书写,系统将无法识别。该变量可省,如果缺省时,则Cookie的属性值不会保存在用户的硬盘中,而仅仅保存在内存当中,Cookie文件将随着浏览器的关闭而自动消失。
Domain=DOMAIN-NAME:Domain该变量是一个只写变量,它确定了哪些Internet域中的Web服务器可读取浏览器所存取的Cookie,即只有来自这个域的页面才可以使用Cookie中的信息。这项设置是可选的,如果缺省时,设置Cookie的属性值为该Web服务器的域名。
Path=PATH:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie。一般如果用户输入的URL中的路径部分从第一个字符开始包含Path属性所定义的字符串,浏览器就认为通过检查。如果Path属性的值为“/”,则Web服务器上所有的WWW资源均可读取该Cookie。同样该项设置是可选的,如果缺省时,则Path的属性值为Web服务器传给浏览器的资源的路径名。可以看出我们借助对Domain和Path两个变量的设置,即可有效地控制Cookie文件被访问的范围。
Secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时,浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即为HTTPS。
以上的cookie内容中,真正发送给服务器的内容,只有NAME和VALUE对,其他东西都是给客户端的浏览器用来管理cookie的,比如是否存放在硬盘上?存放多久?这浏览器在访问哪个网站的时候要发这个cookie.
这几个类型的转换方法:
cookieContainer.GetCookies()获得cookieCollection,而cookieCollection直接加索引号获得某一个具体的cookie,
cookieContainer.add()可以添加cookie或者cookieCollection,甚至直接用http的头中的cookie信息就可以直接往cookieContainer中添加cookie,用cookieContainer.SetCookies(Uri, string)来实现,其中的string就是cookie的字符串内容,这个字符串可以通过response.Headers.Get("Set-Cookie")获得,这里注意一点,SetCookies()函数中的Uri,不能和cookie字符串中的域名Domain完全相同,比如Uri=new Uri("http://.google.com"),而cookie中的Domain=.google.com,这个时候cookieContainer.SetCookies()函数将会报错,提示域名不正确,解决方法是,uri = new Uri("http://www.google.com")即可,反正改为其他的类似路径都可以,为什么不能相同,谁知道呢,问微软去.
CookieContainer.GetCookieHeader()函数可以读出cookieContainer中所有指定网站的cookie,以字符串方式显示.自己想要输入字符串单独构造cookie,也很简单,Cookie的构造函数就搞定.
System.Web.HttpCookieCollection 类 和 System.Net.CookieCollection 类 的差异
http://blog.csdn.net/shanliwa/archive/2008/06/18/2559901.aspx
顺便说一下环境
http://bbs.locoy.com/spider-31216-1-1.html
通过COM来获取CookieContainer,简单又好用
http://www.cnblogs.com/xdotnet/archive/2007/01/08/cookie_container_com.html
[ 本帖最后由 faunus 于 2008-10-27 20:16 编辑 ]
其它
关于KeepAlivehttp://www.phpv.net/html/1570.html
关于Accept-Charset:gzip,deflate
而现在的浏览器几乎都支持 GZip 和 Deflate 压缩,因此在传输一些大的JS或CSS文件(如EXTJS)时对它进行压缩则可以减少下载时间,
从而提高加载速度。
===========
对比一下使用情况
===========
使用:Accept-Encoding:gzip,deflate
HTTP/1.0 200 OK
Date: Fri, 24 Oct 2008 00:13:38 GMT
Server: Apache
Last-Modified: Fri, 24 Oct 2008 00:10:51 GMT
ETag: "5c406-459f49d3178c0"-gzip
Accept-Ranges: bytes
X-Powered-By: mod_xlayout_jh/0.0.1vhs.markIII.remix
Cache-Control: max-age=60
Expires: Fri, 24 Oct 2008 00:14:38 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Type: text/html
Age: 51
Content-Length: 90255
X-Cache: HIT from nanjing75-169.HP08040113.sina.com.cn
Via: 1.0 nanjing75-169.HP08040113.sina.com.cn:80 (squid/2.6.STABLE13)
Connection: close
--------------------未使用Accept-Encoding
HTTP/1.0 200 OK
Date: Fri, 24 Oct 2008 00:11:31 GMT
Server: Apache
Last-Modified: Fri, 24 Oct 2008 00:10:51 GMT
ETag: "5c406-459f49d3178c0"
Accept-Ranges: bytes
X-Powered-By: mod_xlayout_jh/0.0.1vhs.markIII.remix
Cache-Control: max-age=60
Expires: Fri, 24 Oct 2008 00:12:31 GMT
Vary: Accept-Encoding
Content-Length: 389863
Content-Type: text/html
Age: 51
X-Cache: HIT from nanjing75-167.HP08040111.sina.com.cn
Via: 1.0 nanjing75-167.HP08040111.sina.com.cn:80 (squid/2.6.STABLE13)
Connection: close
===========
在DotNet2.0中提供了GZip和Deflate压缩算法,
自定义一个 CompressionHttpHandler,
实现 System.Web.IHttpHandler 接口.
首先取得请求的路径,然后判断浏览器返回的服务端标头是否使用GZip压缩,
如果使用,则设置Content-encoding为gzip,
然后设置输出的stream用GZip解压缩的,
最后将文件写入到HTML文本中。
另:GZip.gz,Deflate.de,
经测试(几大网站),GZIP可用,Deflate始终未起作为,跟服务端设置有关.利用httpwebrequest下载deflate压缩的网页的关键点 作者:wintle 日期:2007-04-03 10:16
如果网页采用的仅是由deflate压缩的,则普通的写法会失效。
关键在于:
s = New InflaterInputStream(New MemoryStream(b), New Inflater(true))
如果不这样指定,仅s = New InflaterInputStream(New MemoryStream(b)),则会默认地要转化成gzip来处理。而gzip是有头的,而inflate是没头的。所以会出错。
参见:
http://www.icsharpcode.net/opensource/sd/Forum/topic.asp?TOPIC_ID=893
参考这段也行:http://blog.csdn.net/wszhoho/archive/2008/04/24/2323698.aspx
http://www.wintle.cn/article.asp?id=342
结论:http://bbs.locoy.com/viewthread.php?tid=31352&extra=page%3D1&frombbs=1
[ 本帖最后由 faunus 于 2008-10-29 21:09 编辑 ]