异步调用一个ashx(httphandler)
1 var requestUrl = Request.Url.ToString(); 2 requestUrl = requestUrl.Replace("protocol=SendAsync", protocol=Send"); 3 if (!string.IsNullOrEmpty(requestUrl)) 4 { 5 WebClient client = new WebClient(); 6 client.DownloadStringAsync(new System.Uri(requestUrl)); 7 return "{\"success\':true,\"message\":\"请求已发送\"}"; 8 }
client.DownloadStringAsync会抛出异常:
“System.InvalidOperationException”类型的异常在 System.Web.dll 中发生,但未在用户代码中进行处理
其他信息: 现在无法开始异步操作。异步操作只能在异步处理程序或模块中开始,或在页生存期中的特定事件过程中开始。如果此异常在执行 Page 时发生,请确保 Page 标记为 <%@ Page Async="true" %>。此异常也可能表明试图调用“异步无效”方法,在 ASP.NET 请求处理内一般不支持这种方法。相反,该异步方法应该返回一个任务,而调用方应该等待该任务。
请问:可能是什么问题?
加上await:
await client.DownloadStringAsync(new System.Uri(requestUrl));
所在方法加上async
await async 只支持Task的方法。不写Task就没法通过编译。
public async Task<string> SendEmailAsync() { var requestUrl = Request.Url.ToString(); requestUrl = requestUrl.Replace("protocol=SendAsync", "protocol=Send"); if (!string.IsNullOrEmpty(requestUrl)) { WebClient client = new WebClient(); client.DownloadStringTaskAsync(new System.Uri(requestUrl)); return "{\"success\':true,\"message\":\"请求已发送\"}"; } return "{\"success\':false,\"message\":\"参数异常\"}"; }
但是这样返回值是这样的 System.Threading.Tasks.Task`1[System.String]
而且请求也过不去
您有时间的话就再帮我看一下。谢谢。已经前进了一步
@众生皆苦: 调用这个方法的方法也要改成异步的,异步要从上到下全部异步。
@dudu:感谢帮助。调用之前的代码还有好多呢。能不能有其他的解决办法?我看其他人的文章里 直接使用DownloadStringAsync也是可以的 并不需要TASK啊。能不能从这个方向帮忙看一下?十分感谢。
@众生皆苦: 如果是ASP.NET程序,必须要从上到下全部异步,我们当时就改了大量代码,详见:
@dudu: 哦 好的我去看看 改代码我倒是不怕 就是调用这个方法的时候使用的是反射 不知道怎么搞了。
再次感谢。谢谢。