0

以下代码在访问对应的url时会抛出异常。对象stateinStartNew()ctxin不同ProcessRequest。为什么会这样?我怎样才能得到一个有效的HttpContextBase对象StartNew()

using System.Web;
using System.Web.Routing;

namespace AsyncUseHttpContextBaseWillFail
{
    public class FooHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            var ctx = new HttpContextWrapper(context);
            System.Threading.Tasks.Task.Factory.StartNew(state =>
            {
                //ArgumentException: Value does not fall within the expected range.
                var ip = ((HttpContextBase)state).Request.UserHostAddress;
            }, ctx);
        }

        public bool IsReusable
        {
            get { return false; }
        }
    }

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.Add(new Route(string.Empty, new FooRoute()));
        }
    }

    public class FooRoute : IRouteHandler
    {
        public virtual IHttpHandler GetHttpHandler(RequestContext context)
        {
            return new FooHandler();
        }
    }
}
4

2 回答 2

1

史蒂夫上面的评论是使这项工作正常工作的最佳选择。使用 IHttpAsyncHandler 或 HttpTaskAsyncHandler。即使您确实设法将有效的 HttpContext[Base] 传递到您的回调中,如果 ProcessRequest 已经返回,那么 ASP.NET 运行时可能已经清理了 HttpContext 实例,并且您将尝试使用已释放的对象。异步工作应始终由异步处理程序执行,以避免此问题。

于 2013-01-20T19:43:41.877 回答
0

将所需数据从HttpContext局部变量中复制出来,并在您的 lambda 中使用这些变量。从第二个线程访问HttpContext是不安全的。

于 2013-01-20T20:25:13.230 回答