HTTP处理程序异步问题.NET 4.5.2

时间:2016-12-16 12:49:16

标签: asp.net httphandler

我正在将.NET 4.5.2用于Web应用程序,并且我有一个HTTP处理程序,它返回一个已处理的图像。我正在使用jQuery对进程处理程序进行异步调用,我开始收到以下错误:

  

此时无法启动异步操作。异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。如果在执行页面时发生此异常,请确保将页面标记为<%@ Page Async =" true" %取代。此异常也可能表示尝试调用" async void"方法,在ASP.NET请求处理中通常不受支持。相反,异步方法应该返回一个Task,调用者应该等待它。

这是处理程序代码:

       public void ProcessRequest(HttpContext context)
    {
        string CaseID = context.Request.QueryString["CaseID"].ToString();
        int RotationAngle = Convert.ToInt16(context.Request.QueryString["RotationAngle"].ToString());
        string ImagePath = context.Request.QueryString["ImagePath"].ToString();

        applyAngle = RotationAngle;

        string ImageServer = ConfigurationManager.AppSettings["ImageServerURL"].ToString();
        string FullImagePath = string.Format("{0}{1}", ImageServer, ImagePath);

        WebClient wc = new WebClient();
        wc.DownloadDataCompleted += wc_DownloadDataCompleted;
        wc.DownloadDataAsync(new Uri(FullImagePath));
    }

    private void wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
    {
        Stream BitmapStream = new MemoryStream(e.Result);

        Bitmap b = new Bitmap(BitmapStream);
        ImageFormat ImageFormat = b.RawFormat;

        b = RotateImage(b, applyAngle, true);

        using (MemoryStream ms = new MemoryStream())
        {
            if (ImageFormat.Equals(ImageFormat.Png))
            {
                HttpContext.Current.Response.ContentType = "image/png";
                b.Save(ms, ImageFormat.Png);
            }

            if (ImageFormat.Equals(ImageFormat.Jpeg))
            {
                HttpContext.Current.Response.ContentType = "image/jpg";
                b.Save(ms, ImageFormat.Jpeg);
            }
            ms.WriteTo(HttpContext.Current.Response.OutputStream);
        }
    }

知道这意味着什么,我可以做些什么来克服这个问题?

提前致谢。

1 个答案:

答案 0 :(得分:0)

您的代码将无法正常工作,因为您在ProcessRequest方法中创建WebClient但不等待它完成。因此,一旦方法完成,客户端将成为孤立的。到响应到达时,请求本身已经完成。没有可以编写响应的上下文或输出流。

要创建异步HTTP处理程序,您需要从HttpTaskAsyncHandler类派生并实现ProcessRequestAsync方法:

public class MyImageAsyncHandler : HttpTaskAsyncHandler
{

   public override async Task ProcessRequestAsync(HttpContext context)
   {
      //...
      using(WebClient wc = new WebClient())
      {
          var data=await wc.DownloadDataTaskAsync(new Uri(FullImagePath));        
          using(var BitmapStream = new MemoryStream(data))
          {
              //...
              ms.WriteTo(context.Response.OutputStream);
             //...
          }
      }
   }
}