/// <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. }