C# 响应。Asp.net异步重定向问题

C# 响应。Asp.net异步重定向问题,c#,asp.net,async-await,response.redirect,C#,Asp.net,Async Await,Response.redirect,我是asp.net 4.5 async新手,在异步方法中调用response.redirect时遇到以下问题。问题是,响应只是“挂起”,是否有其他人在尝试使用异步重定向时遇到类似问题?这段代码将在一个全新的项目中工作,但是,在我们现有的代码中,它不适用于新的页面。我确保尽我所能从我们的web.config中删除所有内容,并删除了我们的母版页。撞到砖墙…有什么想法吗?谢谢 protected void Page_Load(object sender, EventArgs e) {

我是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;
        }
    }
受保护的无效页面加载(对象发送方,事件参数e)
{
RegisterAsyncTask(新的PageAsyncTask(PageLoadAsync));
}
专用异步任务PageLoadAsync()
{
var data=await GetData();
如果(数据==HttpStatusCode.OK)
响应。重定向(“http://www.google.com");
}
专用异步任务GetData()
{
使用(var client=new HttpClient())
{
var response=wait client.GetAsync(“https://www.google.com");
返回response.StatusCode;
}
}
这段代码将在一个全新的项目中工作,但是,在我们现有的代码中,它不适用于新的页面

我假设您现有的站点已经升级到.NET4.5

首先要检查的是
httpRuntime.targetFramework
设置为
4.5
。在升级时,默认情况下不会设置此选项

根据评论编辑:

要检查的另一件事(以防万一)是
Page.Async
设置为
true

在本例中,解决方案是调用
Response.Redirect(“http://www.google.com“,false)
,它显式地为
endResponse
参数传递
false
true
的默认值仅用于向后兼容的原因。

我使用的hack是:

  • 我使用了一个静态字典作为
    vard=newdictionary()

  • 我将代码行
    client.timeout=newsystem.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]

  • 当执行操作并输入自定义筛选器时,它会通过检查字典条目引发异常

  • 如果超时发生,那么字典条目将为true,因此,在此基础上,我们检查条目并抛出异常。现在,我们在Global.asax.cs中找到了捕获异常的
    Application\u Error()

  • 应用程序\u Error()
    中,我们编写了重定向到所需页面的代码


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

    我认为您无法在异步线程上执行
    重定向
    。我不明白为什么需要异步,您仍然需要等待HttpClient响应,然后才能完成加载/呈现页面。你不会同时做很多事情。顺便说一句:如果你有互联网连接,谷歌将永远工作;)他需要异步,因为他正在执行I/O密集型任务(向远程资源发送HTTP请求)。假设此资源需要很长时间才能响应。在此期间,您将危及ASP.NET工作线程。现在假设这个端点同时被200个用户击中=>您的站点将死亡,因为没有任何工作线程可用于服务请求。这就是为什么在这种情况下使用异步非常重要的原因。@DarinDimitrov,工作线程将如何获得响应?或者服务器会像HTML5WebSocket一样将更新(块)推送到客户端?我仍然不清楚RegisterAsyncTask是如何工作的?
    client.GetAsync方法使用I/O完成端口。您可以在此处阅读有关它们的更多信息:。在服务器到服务器的通信中没有区块或HTML5WebSocket。这一点很好。我们的项目是4.5,配置中的targetFramework是4.5。我们已经在十页左右的篇幅中实现了异步,它正在工作。问题是,在对同一响应进行异步调用之后,我们的两个页面需要执行重定向。正在尝试找出测试项目和我们的项目之间的差异。感谢您的回答。我几乎不想问这个问题,但您确实将
    Page.Async
    设置为
    true
    ,对吗?另一个有效的问题。是的,我知道。不。。我没有。出于某种原因,我的脑子里一直在想,false是默认值,我曾经尝试过用true。。我已经在我们的一个实时页面上实现了它,这看起来也很开心。有时候最简单的事情最容易被忽视。非常感谢!我会认为你的答案是正确的。