MVC对异步 Controller 的支持
2011-07-04 17:38 smat 阅读(1166) 评论(0) 编辑 收藏 举报我的朦胧讲解,希望有更好的见解!
异步 Controller
1、需要继承基类 AsyncController
2、在 Async 为后缀的方法中写发起异步操作的逻辑;在 Completed 为后缀的方法中写异步操作完成后的逻辑;此两个方法的前缀就是这个异步 Controller 的 Action
3、AsyncManager.OutstandingOperations.Increment() - 递增当前异步操作的计数器;AsyncManager.OutstandingOperations.Decrement(); - 递减当前异步操作的计数器。当异步操作的计数器为 0 时,则调用以 Completed 为后缀的方法
4、AsyncManager.Parameters[key] - 传递指定参数到以 Completed 为后缀的方法中
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Net;
using System.Xml;
using System.ServiceModel.Syndication;
namespace MVC.Areas.AsynchronousController.Controllers
{
[HandleError]
public class HomeController : AsyncController
{
// IndexAsync() 以及 IndexCompleted() 是一对,其 Action 为 Index
// 开始一个异步操作
public void IndexAsync()
{
// 递增计数器
AsyncManager.OutstandingOperations.Increment();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.cnblogs.com/lizhao/rss");
request.BeginGetResponse(new AsyncCallback(OnGetRssFeedAsyncCompleted), request);
}
// 完成异步操作后
public ActionResult IndexCompleted(IEnumerable<SyndicationItem> items)
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
ViewData["SyndicationItems"] = items;
return View();
}
private void OnGetRssFeedAsyncCompleted(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
using (XmlReader reader = XmlReader.Create(response.GetResponseStream()))
{
SyndicationFeed feed = SyndicationFeed.Load(reader);
// 传递指定参数到 IndexCompleted() 方法中
AsyncManager.Parameters["items"] = feed.Items;
// 递减计数器,当计数器为 0 时,则调用 IndexCompleted()
AsyncManager.OutstandingOperations.Decrement();
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Net;
using System.Xml;
using System.ServiceModel.Syndication;
namespace MVC.Areas.AsynchronousController.Controllers
{
[HandleError]
public class HomeController : AsyncController
{
// IndexAsync() 以及 IndexCompleted() 是一对,其 Action 为 Index
// 开始一个异步操作
public void IndexAsync()
{
// 递增计数器
AsyncManager.OutstandingOperations.Increment();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.cnblogs.com/lizhao/rss");
request.BeginGetResponse(new AsyncCallback(OnGetRssFeedAsyncCompleted), request);
}
// 完成异步操作后
public ActionResult IndexCompleted(IEnumerable<SyndicationItem> items)
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
ViewData["SyndicationItems"] = items;
return View();
}
private void OnGetRssFeedAsyncCompleted(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
using (XmlReader reader = XmlReader.Create(response.GetResponseStream()))
{
SyndicationFeed feed = SyndicationFeed.Load(reader);
// 传递指定参数到 IndexCompleted() 方法中
AsyncManager.Parameters["items"] = feed.Items;
// 递减计数器,当计数器为 0 时,则调用 IndexCompleted()
AsyncManager.OutstandingOperations.Decrement();
}
}
}
}
页面:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<%@ Import Namespace="System.ServiceModel.Syndication" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Index</title>
</head>
<body>
<div>
<h2>
<%: ViewData["Message"] %></h2>
<div>
<!--
调用异步 Controller 的 Demo
注意:Inherits="System.Web.Mvc.ViewPage<dynamic>",这里用了 dynamic 类型
-->
<% foreach (SyndicationItem item in (IEnumerable<SyndicationItem>)ViewData["SyndicationItems"])
{ %>
<a href="<%= item.Id %>">
<%= item.Title.Text %></a><br />
<% } %>
</div>
</div>
</body>
</html>
<%@ Import Namespace="System.ServiceModel.Syndication" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Index</title>
</head>
<body>
<div>
<h2>
<%: ViewData["Message"] %></h2>
<div>
<!--
调用异步 Controller 的 Demo
注意:Inherits="System.Web.Mvc.ViewPage<dynamic>",这里用了 dynamic 类型
-->
<% foreach (SyndicationItem item in (IEnumerable<SyndicationItem>)ViewData["SyndicationItems"])
{ %>
<a href="<%= item.Id %>">
<%= item.Title.Text %></a><br />
<% } %>
</div>
</div>
</body>
</html>