System.ServiceModel.Channels.HttpRequestChannel.GotResponse C# (CSharp) Метод

GotResponse() приватный Метод

private GotResponse ( IAsyncResult result ) : void
result IAsyncResult
Результат void
		void GotResponse (IAsyncResult result)
		{
			HttpChannelRequestAsyncResult channelResult = (HttpChannelRequestAsyncResult) result.AsyncState;
			channelResult.CompletedSynchronously &= result.CompletedSynchronously;
			
			WebResponse res;
			Stream resstr;
			try {
				res = channelResult.WebRequest.EndGetResponse (result);
				resstr = res.GetResponseStream ();
			} catch (WebException we) {
				res = we.Response;
				if (res == null) {
					channelResult.Complete (we);
					return;
				}
				try {
					// The response might contain SOAP fault. It might not.
					resstr = res.GetResponseStream ();
				} catch (WebException we2) {
					channelResult.Complete (we2);
					return;
				}
			}

			var hrr = (HttpWebResponse) res;
			if ((int) hrr.StatusCode >= 400 && (int) hrr.StatusCode < 500) {
				channelResult.Complete (new WebException (String.Format ("There was an error on processing web request: Status code {0}({1}): {2}", (int) hrr.StatusCode, hrr.StatusCode, hrr.StatusDescription)));
			}

			try {
				Message ret;

				// TODO: unit test to make sure an empty response never throws
				// an exception at this level
				if (hrr.ContentLength == 0) {
					ret = Message.CreateMessage (MessageVersion.Default, String.Empty);
				} else {

					using (var responseStream = resstr) {
						MemoryStream ms = new MemoryStream ();
						byte [] b = new byte [65536];
						int n = 0;

						while (true) {
							n = responseStream.Read (b, 0, 65536);
							if (n == 0)
								break;
							ms.Write (b, 0, n);
						}
						ms.Seek (0, SeekOrigin.Begin);

						ret = Encoder.ReadMessage (
							ms, (int) source.Transport.MaxReceivedMessageSize, res.ContentType);
					}
				}

				var rp = new HttpResponseMessageProperty () { StatusCode = hrr.StatusCode, StatusDescription = hrr.StatusDescription };
#if MOONLIGHT
				if (hrr.SupportsHeaders) {
					foreach (string key in hrr.Headers)
						rp.Headers [key] = hrr.Headers [key];
				}
#else
				foreach (var key in hrr.Headers.AllKeys)
					rp.Headers [key] = hrr.Headers [key];
#endif
				ret.Properties.Add (HttpResponseMessageProperty.Name, rp);

				channelResult.Response = ret;
				channelResult.Complete ();
			} catch (Exception ex) {
				channelResult.Complete (ex);
			} finally {
				res.Close ();	
			}
		}