C# WebApi请求中的取消

C# WebApi请求中的取消,c#,asp.net-web-api,cancellation-token,C#,Asp.net Web Api,Cancellation Token,关于使用CancellationToken取消WebApi请求,有几种参考资料,例如(该概念似乎适用于所有最新版本): 现在我还了解到,对于HTTP连接,通常不会在每次发送新请求时打开和关闭TCP连接,但通常会保持TCP连接打开,至少这是我从MDN中理解本文的方式: 所以我的问题是: 如果我正在执行来自C#的HTTP请求,是否每次都会建立并关闭底层TCP连接,这样机制基本上就是一个TCP连接,并且服务器可以在令牌中请求取消 那么,这是否最终取决于我总是为每个请求打开一个新的TCP连接?或

关于使用CancellationToken取消WebApi请求,有几种参考资料,例如(该概念似乎适用于所有最新版本):

现在我还了解到,对于HTTP连接,通常不会在每次发送新请求时打开和关闭TCP连接,但通常会保持TCP连接打开,至少这是我从MDN中理解本文的方式:

所以我的问题是:

如果我正在执行来自C#的HTTP请求,是否每次都会建立并关闭底层TCP连接,这样机制基本上就是一个TCP连接,并且服务器可以在令牌中请求取消


那么,这是否最终取决于我总是为每个请求打开一个新的TCP连接?或者,在TCP连接无法关闭的情况下,是否还有其他方法也可以使用?

以下是Github中HttpWebrequest.Abort()方法的源代码

     private void Abort(Exception exception, int abortState)
    {
        GlobalLog.ThreadContract(ThreadKinds.Unknown, "HttpWebRequest#" + ValidationHelper.HashString(this) + "::Abort()");
        if (Logging.On) Logging.Enter(Logging.Web, this, "Abort", (exception == null? "" :  exception.Message));

        if(Interlocked.CompareExchange(ref m_Aborted, abortState, 0) == 0) // public abort will never drain streams
        {
            GlobalLog.Print("HttpWebRequest#" + ValidationHelper.HashString(this) + "::Abort() - " + exception);

            NetworkingPerfCounters.Instance.Increment(NetworkingPerfCounterName.HttpWebRequestAborted);

            m_OnceFailed = true;
            CancelTimer();

            WebException webException = exception as WebException;
            if (exception == null)
            {
                webException = new WebException(NetRes.GetWebStatusString("net_requestaborted", WebExceptionStatus.RequestCanceled), WebExceptionStatus.RequestCanceled);
            }
            else if (webException == null)
            {
                webException = new WebException(NetRes.GetWebStatusString("net_requestaborted", WebExceptionStatus.RequestCanceled), exception, WebExceptionStatus.RequestCanceled, _HttpResponse);
            }

            try
            {

                    // Want to make sure that other threads see that we're aborted before they set an abort delegate, or that we see
                    // the delegate if they might have missed that we're aborted.
                    Thread.MemoryBarrier();
                    HttpAbortDelegate abortDelegate = _AbortDelegate;

                    if (abortDelegate == null || abortDelegate(this, webException))
                    {
                        // We don't have a connection associated with this request

                        SetResponse(webException);
                    }
                    else
                    {
                        // In case we don't call SetResponse(), make sure to complete the lazy async result
                        // objects. abortDelegate() may not end up in a code path that would complete these
                        // objects.
                        LazyAsyncResult writeAResult = null;
                        LazyAsyncResult readAResult = null;

                        if (!Async)
                        {
                            lock (this)
                            {
                                writeAResult = _WriteAResult;
                                readAResult = _ReadAResult;
                            }
                        }

                        if (writeAResult != null)
                            writeAResult.InvokeCallback(webException);

                        if (readAResult != null)
                            readAResult.InvokeCallback(webException);
                    }

                    if (!Async)
                    {
                        LazyAsyncResult chkConnectionAsyncResult = ConnectionAsyncResult;
                        LazyAsyncResult chkReaderAsyncResult = ConnectionReaderAsyncResult;

                        if (chkConnectionAsyncResult != null)
                            chkConnectionAsyncResult.InvokeCallback(webException);
                        if (chkReaderAsyncResult != null)
                            chkReaderAsyncResult.InvokeCallback(webException);
                    }

                    if (this.IsWebSocketRequest && this.ServicePoint != null)
                    {
                        this.ServicePoint.CloseConnectionGroup(this.ConnectionGroupName);
                    }

            }
            catch (InternalException)
            {
            }
        }

        if(Logging.On)Logging.Exit(Logging.Web, this, "Abort", "");
    }
这清楚地表明TCP连接正在关闭。服务器以自己的方式响应关闭的TCP端口。
链接:

在进行HTTP请求-响应交换之后,您不必担心连接是否关闭,因为这对取消机制没有影响。确实有影响的是,在HTTP请求-响应交换过程中,连接被关闭,因为如果服务器端处理取消令牌,这会触发取消服务器端的请求处理。因此,换句话说,如果在发送响应之前关闭了连接,而不管连接是哪种类型(保持活动状态或每次交换),这就是服务器启动取消过程的原因