Can a http server detect that a client has cancelled their request?

后端 未结 2 648
庸人自扰
庸人自扰 2020-12-03 07:19

My web app must process and serve a lot of data to display certain pages. Sometimes, the user closes or refreshes a page while the server is still busy processing it. This

相关标签:
2条回答
  • 2020-12-03 07:30

    HTTP is stateless, hence the only way to detect a disconnected client is via timeouts.

    See the answers to this SO question (Java Servlet : How to detect browser closing ?).

    0 讨论(0)
  • 2020-12-03 07:46

    While @Oded is correct that HTTP is stateless between requests, app servers can indeed detect when the underlying TCP/IP connection has broken for the request being processed. Why is this? Because TCP is a stateful protocol for reliable connections.

    A common technique for .Net web apps processing a resource intensive request is to check Response.IsClientConnected (docs) before starting the resource intensive work. There is no point in wasting CPU cycles to send an expensive response to a client that isn't there anymore.

    private void Page_Load(object sender, EventArgs e)
    {
        // Check whether the browser remains
        // connected to the server.
        if (Response.IsClientConnected)
        {
            // If still connected, do work
            DoWork();
        }
        else
        {
            // If the browser is not connected
            // stop all response processing.
            Response.End();
        }
    }
    

    Please reply with your target app server stack so I can provide a more relevant example.

    Regarding your 2nd alternative to use XHR to post client page unload events to the server, @Oded's comment about HTTP being stateless between requests is spot on. This is unlikely to work, especially in a farm with multiple servers.

    0 讨论(0)
提交回复
热议问题