我正在将.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);
}
}
知道这意味着什么,我可以做些什么来克服这个问题?
提前致谢。
答案 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);
//...
}
}
}
}