ASP.NET之自定义异步HTTP处理程序(图文教程)(2)


    参数说明:
                          result : 有关进程状态的IAsyncResult(这里的result跟BeginProcessRequest返回的是同一个对象,只是内部的属性等等改变了)

注: 但是我们还要实现不在IHttpAsyncHandler接口中的一个属性和一个方法,否则IIS会报错

bool IsRusable
表明是否使用池,只需要实现get,返回false表示不使用,返回true表示使用。

   void ProceessRequest( HttpContext context )
同步HTTP处理程序被调用的方法(这里并不会调用该方法,但是必须实现)



  2. IAsyncResutl 接口

需实现方法以及属性如下:

      Object AsyncState
  获取用户定义的对象(其实就是以上的 extradata 并且只要实现get )

  WaitHandler AsyncWaitHandle
  获取用于等待异步操作完成的 WaitHandle (一般都是返回NULL 并且只要实现get )  bool CompletedSynchronously
  获取异步操作是否同步完成的指示(一般都是返回false)  bool IsCompleted
  获取异步操作是否已完成的指示

  四、实现该功能(iis7 / asp.net 4.0 / vs2010 / windows 7 64bit )

注: 1.新建空web项目,并添加 App_Code 文件夹,并部署在 iis 上

2.在App_Code中新建一个类,命名为"AsyncRequestHandler.cs"(这里的命名不影响,但是类名是关键)

3.在 AsyncRequestHandler.cs 中引用 "System.Threading" 命名空间

下面我们将一步一步的学习实现这个功能,虽然只是一个很简单的例子,但是可以让你在以后的开发中更加灵活的运用。

1.实现 IHttpAsyncHandler 接口
代码如下:

复制代码 代码如下:


public class AsyncHttpHandler : IHttpAsyncHandler
{
public AsyncHttpHandler()
{
//
//TODO: 在此处添加构造函数逻辑
//
}

public bool IsReusable
{
get
{
return false; //表明不使用池
}
}

public void ProcessRequest(HttpContext context) //不调用 必须实现的方法
{
throw new InvalidOperationException();
}

/// <summary>
/// 当客户申请时执行的异步处理
/// </summary>
/// <param>包含httpresponse、httprequest、server对象</param>
/// <param>回调函数</param>
/// <param>需要传递的参数</param>
/// <returns>返回有关进程的状态信息</returns>
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extradata) // 必须实现的方法
{
context.Response.Write("<p>AsyncHttpHandler</p>"); //向页面中写入html表明是该信息来自何处
AsyncOperation op = new AsyncOperation(context, cb, extradata); //实例化实现了 IAsyncResult 接口的类(主要实现异步处理的类)
op.StartAsyncWork(); //开始异步处理
return op; //返回该对象
}

/// <summary>
/// 当BeginProcessRequest中的 return op;与异步的处理完成后调用(调用完既呈现页面)
/// </summary>
/// <param>为op,但是属性已改变</param>
public void EndProcessRequest(IAsyncResult result)
{
}
}


2.实现 IAsyncResult 接口(与上面的代码在同一个文件中)
代码如下:

复制代码 代码如下:


public class AsyncOperation : IAsyncResult
{
HttpContext _context; //保存context的引用
AsyncCallback _cb;//保存回调委托的引用
object _state;//保存额外的信息
bool _iscomplate;//保存异步操作是否完成

/// <summary>
/// 构造函数,将AsyncHttpHandler的参数全部传递进来
/// </summary>
/// <param></param>
/// <param></param> //该回调不可被重写,否则将会出现客户端永久等待的状态
/// <param></param> //构造时该值可以传递任意自己需要的数据
public AsyncOperation(HttpContext context, AsyncCallback cb, object state)
{
_context = context;
_cb = cb;
_state = state;
_iscomplate = false; //表明当前异步操作未完成
}

/// <summary>
/// 实现获得当前异步处理的状态
/// </summary>
bool IAsyncResult.IsCompleted
{
get
{
return _iscomplate;
}
}

/// <summary>
/// 返回 false 即可
/// </summary>
bool IAsyncResult.CompletedSynchronously
{
get
{
return false;
}
}

/// <summary>
/// 将返回额外的信息
/// </summary>
object IAsyncResult.AsyncState
{
get
{
return _state;
}
}

/// <summary>
/// 为空
/// </summary>
WaitHandle IAsyncResult.AsyncWaitHandle
{
get
{
return null;
}
}

/// <summary>
/// 表明开始异步处理的主函数(方法名可以改,但上面的调用也需要一起改)
/// </summary>
public void StartAsyncWork()
{
ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncTask), null);//相信很多玩国.net winform 开发的一定认识
}

/// <summary>
/// 异步操作调用的方法
/// </summary>
/// <param>为QueueUserWorkItem方法中第二个参数传递的值</param>
public void StartAsyncTask(object workstate)
{
_context.Response.Write("<p>Completion IsThreadPoolThread is" + Thread.CurrentThread.IsThreadPoolThread + "</p>");
_iscomplate = true; //表明异步操作已完成
_cb(this);//调用回调函数表明完成
}
}


3.web.config 配置

内容如下(红色方框部分为需要添加的内容):

ASP.NET之自定义异步HTTP处理程序(图文教程)

4.iis绑定(如何绑定见 二 )

ASP.NET之自定义异步HTTP处理程序(图文教程)

5.测试

时你随意的写  test.async 或者  asd.async 等等,最后呈现的页面都是一致的。这样就达到我们的效果了

五、看完这些只是浅层

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjdjgf.html