none
=========请微软工程师帮一下关于 IAsyncHttpHandler=============== RRS feed

答案

  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.SqlClient;
    
    namespace AsyncHandler
    {
        /// <summary>
        /// Async 的摘要说明
        /// </summary>
        public class Async : IHttpHandler, IHttpAsyncHandler
        {
            public void ProcessRequest(HttpContext context) { }
    
            public bool IsReusable { get { return false; } }
    
            private SqlConnection m_conn;
            private SqlCommand m_cmd;
            private HttpContext m_context;
    
            // 定义一个委托来创造异步操作返回对象
            private System.Action action;
    
            public IAsyncResult BeginProcessRequest(
                HttpContext context, AsyncCallback cb, object extraData)
            {
                
                this.m_context = context;
    
                if (context.Request.QueryString["xx"] != null)
                {
                    this.m_conn = new SqlConnection("server=.\\sqlexpress;database=musicstore;integrated security=true;Asynchronous Processing=true");
                    this.m_cmd = new SqlCommand("select 1", this.m_conn);
                    this.m_conn.Open();
    
                    IAsyncResult result = this.m_cmd.BeginExecuteNonQuery(cb, extraData);
                    
                    return result;  
                }
                else
                {
                    // 创建委托实例
                    this.action = () => { };
                    return action.BeginInvoke(cb, extraData);
                }            
            }
    
            public void EndProcessRequest(IAsyncResult result)
            {
                
                this.m_context.Response.ContentType = "text/plain";
    
                if ( this.action != null)
                {
                    this.action.EndInvoke(result);
    
                    this.m_context.Response.Write("No Data Access!");
                }
                else  if (this.m_cmd != null)
                {
                    this.m_cmd.EndExecuteNonQuery(result);
                    this.m_conn.Dispose();
    
                    this.m_context.Response.Write("Data Access Complete!");
                }
            }
        }
    }

    通过创建一个委托来完成。

    在结束的时候,检查是哪个对象的委托。


    冠军

    2012年6月1日 14:37

全部回复

  • 你好

    如果不是在同一个请求线程里,那么HttpContext里不会含有Form提交的内容。

    如果在一个页面中有一个Form,然后当这个Form提交的时候又要发送请求让你写的这个handler运行。那么发送这个请求的时候,需要把Form中的值传递到这个请求中去。视情况而定。

    2012年6月1日 5:38
    版主
  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.SqlClient;
    
    namespace AsyncHandler
    {
        /// <summary>
        /// Async 的摘要说明
        /// </summary>
        public class Async : IHttpHandler, IHttpAsyncHandler
        {
            public void ProcessRequest(HttpContext context) { }
    
            public bool IsReusable { get { return false; } }
    
            private SqlConnection m_conn;
            private SqlCommand m_cmd;
            private HttpContext m_context;
    
            // 定义一个委托来创造异步操作返回对象
            private System.Action action;
    
            public IAsyncResult BeginProcessRequest(
                HttpContext context, AsyncCallback cb, object extraData)
            {
                
                this.m_context = context;
    
                if (context.Request.QueryString["xx"] != null)
                {
                    this.m_conn = new SqlConnection("server=.\\sqlexpress;database=musicstore;integrated security=true;Asynchronous Processing=true");
                    this.m_cmd = new SqlCommand("select 1", this.m_conn);
                    this.m_conn.Open();
    
                    IAsyncResult result = this.m_cmd.BeginExecuteNonQuery(cb, extraData);
                    
                    return result;  
                }
                else
                {
                    // 创建委托实例
                    this.action = () => { };
                    return action.BeginInvoke(cb, extraData);
                }            
            }
    
            public void EndProcessRequest(IAsyncResult result)
            {
                
                this.m_context.Response.ContentType = "text/plain";
    
                if ( this.action != null)
                {
                    this.action.EndInvoke(result);
    
                    this.m_context.Response.Write("No Data Access!");
                }
                else  if (this.m_cmd != null)
                {
                    this.m_cmd.EndExecuteNonQuery(result);
                    this.m_conn.Dispose();
    
                    this.m_context.Response.Write("Data Access Complete!");
                }
            }
        }
    }

    通过创建一个委托来完成。

    在结束的时候,检查是哪个对象的委托。


    冠军

    2012年6月1日 14:37