与Asp.net异步的Response.Redirect问题

时间:2013-11-22 14:55:28

标签: c# asp.net async-await response.redirect

我是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;
        }
    }

2 个答案:

答案 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)

我使用的黑客是:

  1. 我在编写API调用方法的类中使用了静态字典作为var d= new Dictionary<string, bool>();

  2. 我将代码行client.timeout = new System.TimeSpan(0,0,60);用于API发送请求。

  3. API超时后,它将抛出TaskTimeoutException,在TaskTimeoutException catch块中将代码写为d.Add("timeout", true);

  4. 现在,我创建了自定义操作过滤器并应用了以下代码:

    public class MyCustomActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if(MyApiClass.d.ContainsKey("timeout") && d["timeout"])
            {
                throw new Exception();
            }
        }
    }
    
  5. 我在操作上应用了[MyCustomActionFilter ]

  6. 执行操作并输入自定义过滤器时,它会通过检查字典条目来引发Exception。

  7. 如果发生超时,则字典条目为true,因此,在此基础上,我们检查该条目并引发异常。现在,我们在 Global.asax.cs 中有Application_Error()可以捕获异常。

  8. Application_Error()中,我们编写了用于重定向到所需页面的代码。

注意:在第4步中,您可以创建自定义异常,以提供更精确的日志详细信息。