Webcast_ ASP.NET 2.0中的异步页面
–参考–
Asynchronous Pages in ASP.NET 2.0
http://msdn.microsoft.com/msdnmag/issues/05/10/WickedCode/default.aspx
讲座中的内容来源于此
//—————————————————–
Asp.net运行原理:
//—————————————————–
IIS() -> aspnet_isapi.dll ->aspnet_wp.exe
Asp.net实际是一个IIS ISAPI Extension, 处理到.aspx, .asmx的请求
C:\WINDOWS\Microsoft.NET\Framework\<version>\aspnet_isapi.dll
Asp.net的工作进程(host):
在IIS6中,当IIS运行在 worker process isolation mode 时(default),
为IIS6的工作进程w3wp.exe
如果使用ASP.NET Process Model,Asp.net的工作进程为
C:\WINDOWS\Microsoft.NET\Framework\<version>\aspnet_wp.exe()
win2003上IIS进程池中的进程host.exe,host了.net CLR
进程隔离级别在IIS5.0和IIS6.0上的区别
运行帐号的不同 ASPNET(IIS5.0),Network service(IIS6.0)
[*]如何测试web 站点的吞吐量:
IIS Stress , Application center test.
//—————————————————–
Asp.net 1.1中的异步页面实现
//—————————————————–
–参考–
Use Threads and Build Asynchronous Handlers in Your Server-Side Web Code
http://msdn.microsoft.com/msdnmag/issues/03/06/Threading/
讲座中的例子也来源于此
通常情况下,ASP.NET 会调用页面的IHttpHandler.ProcessRequest来处理用户请求,
为了实现异步,在页面的code hehid class 中实现IHttpAsyncHandler,
然后使用IHttpAsyncHandler.BeginProcessRequest来处理请求.BeginProcessRequest会
launch另外一个线程,这个线程会调用base.ProcessRequest,来完成request处理,请注意,
在这种情况下,整个request处理不是使用线程池中的线程完成的,而是在BeginProcessRequest
launch出的线程中完成的.而且BeginProcessRequest在launch一个新线程后马上返回,这样一来.
执行BeginProcessReques的线程也会被重新放到线程池中.
* AsyncDelegate.ashx的扩展名表示它是一个Handler
//—————————————————–
Asp.net 2.1中的异步页面实现
//—————————————————–
1.设置
<%@Page Async="true"…%>
2.在Page_Load中添加
AddOnPreRenderCompleteAsync(new BeginEventHander(MyBeginMethod), new EndEventHandler(MyEndMethod));
//—————————————————–
异步调用Web 服务
//—————————————————–
使用proxy上的Completed Event
proxy.FooCompleted += new FooCompletedEventHandler(OnFooCompleted);
proxy.FooAsync (…);
…
void OnFooCompleted (Object source, FooCompletedEventArgs e)
{
// Called when Foo completes
}
//———————————————
完整的代码
//———————————————
public partial class AsyncPage : System.Web.UI.Page
{
private WebRequest _request;
void Page_Load (object sender, EventArgs e)
{
AddOnPreRenderCompleteAsync (new BeginEventHandler(BeginAsyncOperation), new EndEventHandler (EndAsyncOperation));
}
IAsyncResult BeginAsyncOperation (object sender, EventArgs e, AsyncCallback cb, object state)
{
_request = WebRequest.Create("http://msdn.microsoft.com");
//—我的工作环境在一个局域网中,要运行例子,需要添加:
_request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
return _request.BeginGetResponse (cb, state);
}
void EndAsyncOperation (IAsyncResult ar)
{
string text;
using (WebResponse response = _request.EndGetResponse(ar))
{
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
text = reader.ReadToEnd();
}
}
Regex regex = new Regex ("href\\s*=\\s*\"([^\"]*)\"", RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches(text);
StringBuilder builder = new StringBuilder(1024);
foreach (Match match in matches)
{
builder.Append (match.Groups[1]);
builder.Append("<br/>");
}
Output.Text = builder.ToString ();
}
}
