Пример #1
0
        /// <summary>
        /// Ends an asynchronous operation to get an incoming request information.
        /// </summary>
        /// <remarks>
        /// This method completes an asynchronous operation started by calling the <see cref="BeginGetContext"/> method.
        /// </remarks>
        /// <returns>
        /// A <see cref="HttpListenerContext"/> that contains a client's request information.
        /// </returns>
        /// <param name="asyncResult">
        /// An <see cref="IAsyncResult"/> obtained by calling the <see cref="BeginGetContext"/> method.
        /// </param>
        /// <exception cref="ObjectDisposedException">
        /// This object has been closed.
        /// </exception>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="asyncResult"/> is <see langword="null"/>.
        /// </exception>
        /// <exception cref="ArgumentException">
        /// <paramref name="asyncResult"/> was not obtained by calling the <see cref="BeginGetContext"/> method.
        /// </exception>
        /// <exception cref="InvalidOperationException">
        /// The EndGetContext method was already called for the specified <paramref name="asyncResult"/>.
        /// </exception>
        public HttpListenerContext EndGetContext(IAsyncResult asyncResult)
        {
            CheckDisposed();
            if (asyncResult == null)
            {
                throw new ArgumentNullException("asyncResult");
            }

            ListenerAsyncResult ares = asyncResult as ListenerAsyncResult;

            if (ares == null)
            {
                throw new ArgumentException("Wrong IAsyncResult.", "asyncResult");
            }

            if (ares.EndCalled)
            {
                throw new InvalidOperationException("Cannot reuse this IAsyncResult.");
            }
            ares.EndCalled = true;

            if (!ares.IsCompleted)
            {
                ares.AsyncWaitHandle.WaitOne();
            }

            lock (((ICollection)wait_queue).SyncRoot) {
                int idx = wait_queue.IndexOf(ares);
                if (idx >= 0)
                {
                    wait_queue.RemoveAt(idx);
                }
            }

            HttpListenerContext context = ares.GetContext();

            context.ParseAuthentication(SelectAuthenticationScheme(context));
            return(context);            // This will throw on error.
        }