我是asp.net 4.5 async的新手,并且在异步方法中调用response.redirect会遇到以下情况。问题是响应只是“挂起”有没有其他人在尝试使用异步重定向时遇到过类似的问题?此代码将在一个全新的项目中使用,但不能与我们现有代码中的新页面一起使用。我确保从web.config中删除所有内容并删除了我们的母版页。打砖墙......任何想法?谢谢!
protected void Page_Load(object sender, EventArgs e)
{
RegisterAsyncTask(new PageAsyncTask(PageLoadAsync));
}
private async Task PageLoadAsync()
{
var data = await GetData();
if (data == HttpStatusCode.OK)
Response.Redirect("http://www.google.com");
}
private async Task<HttpStatusCode> GetData()
{
using (var client = new HttpClient())
{
var response = await client.GetAsync("https://www.google.com");
return response.StatusCode;
}
}
答案 0 :(得分:16)
此代码适用于全新的项目,但不适用于现有代码中的新页面。
我假设您现有的网站已经升级到.NET 4.5。
要检查的第一件事是httpRuntime.targetFramework
设置为4.5
。升级时默认设置为 not 。
根据评论进行修改:
要检查的另一件事(以防万一)是Page.Async
设置为true
。
在这种情况下,解决方案是调用Response.Redirect("http://www.google.com", false)
,它会false
显式传递endResponse
参数。默认值true
仅用于向后兼容的原因as described here。
答案 1 :(得分:0)
我使用的黑客是:
我在编写API调用方法的类中使用了静态字典作为var d= new Dictionary<string, bool>();
。
我将代码行client.timeout = new System.TimeSpan(0,0,60);
用于API发送请求。
API超时后,它将抛出TaskTimeoutException
,在TaskTimeoutException
catch块中将代码写为d.Add("timeout", true);
现在,我创建了自定义操作过滤器并应用了以下代码:
public class MyCustomActionFilter : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if(MyApiClass.d.ContainsKey("timeout") && d["timeout"])
{
throw new Exception();
}
}
}
我在操作上应用了[MyCustomActionFilter ]
。
执行操作并输入自定义过滤器时,它会通过检查字典条目来引发Exception。
如果发生超时,则字典条目为true,因此,在此基础上,我们检查该条目并引发异常。现在,我们在 Global.asax.cs 中有Application_Error()
可以捕获异常。
在Application_Error()
中,我们编写了用于重定向到所需页面的代码。
注意:在第4步中,您可以创建自定义异常,以提供更精确的日志详细信息。