HttpWebRequest.BeginGetResponse(AsyncCallback, Object) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
인터넷 리소스에 대한 비동기 요청을 시작합니다.
public:
override IAsyncResult ^ BeginGetResponse(AsyncCallback ^ callback, System::Object ^ state);
public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state);
public override IAsyncResult BeginGetResponse(AsyncCallback? callback, object? state);
override this.BeginGetResponse : AsyncCallback * obj -> IAsyncResult
Public Overrides Function BeginGetResponse (callback As AsyncCallback, state As Object) As IAsyncResult
매개 변수
- callback
- AsyncCallback
AsyncCallback 대리자입니다.
- state
- Object
이 요청의 상태 개체입니다.
반환
응답에 대한 비동기 요청을 참조하는 IAsyncResult.
예외
스트림은 BeginGetResponse(AsyncCallback, Object) 이전 호출에서 이미 사용 중입니다.
-또는-
TransferEncoding 값으로 설정되고 SendChunkedfalse
.
-또는-
스레드 풀이 부족합니다.
Method GET 또는 HEAD이고 ContentLength 0보다 크거나 SendChunkedtrue
.
-또는-
KeepAlive
true
, AllowWriteStreamBufferingfalse
, ContentLength -1이고, SendChunkedfalse
Method POST 또는 PUT입니다.
-또는-
HttpWebRequest 엔터티 본문이 있지만 BeginGetResponse(AsyncCallback, Object) 메서드는 BeginGetRequestStream(AsyncCallback, Object) 메서드를 호출하지 않고 호출됩니다.
-또는-
ContentLength 0보다 크지만 애플리케이션이 약속된 데이터를 모두 쓰지는 않습니다.
Abort() 이전에 호출되었습니다.
예제
다음 코드 예제에서는 BeginGetResponse 메서드를 사용하여 인터넷 리소스에 대한 비동기 요청을 만듭니다.
메모
비동기 요청의 경우 자체 시간 제한 메커니즘을 구현하는 것은 클라이언트 애플리케이션의 책임입니다. 다음 코드 예제에서는 이 작업을 수행하는 방법을 보여줍니다.
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Threading;
public static class WebRequestAPMSample
{
private const int BufferSize = 1024;
private class RequestState
{
public StringBuilder ResponseBuilder { get; }
public byte[] ReadBuffer { get; }
public WebRequest Request { get; }
public WebResponse Response { get; set; }
public Stream ResponseStream { get; set; }
public RequestState(WebRequest request)
{
ReadBuffer = new byte[BufferSize];
ResponseBuilder = new StringBuilder();
Request = request;
}
public void OnResponseBytesRead(int read) => ResponseBuilder.Append(Encoding.UTF8.GetString(ReadBuffer, 0, read));
}
public static ManualResetEvent allDone = new ManualResetEvent(false);
public static void Main()
{
try
{
// Create a WebRequest object to the desired URL.
WebRequest webRequest = WebRequest.Create("http://www.contoso.com");
webRequest.Timeout = 10_000; // Set 10sec timeout.
// Create an instance of the RequestState and assign the previous myHttpWebRequest
// object to its request field.
RequestState requestState = new RequestState(webRequest);
// Start the asynchronous request.
IAsyncResult result = webRequest.BeginGetResponse(new AsyncCallback(ResponseCallback), requestState);
// Wait for the response or for failure. The processing happens in the callback.
allDone.WaitOne();
// Release the WebResponse resources.
requestState.Response?.Close();
}
catch (WebException e)
{
Console.WriteLine("\nMain(): WebException raised!");
Console.WriteLine("\nMessage:{0}", e.Message);
Console.WriteLine("\nStatus:{0}", e.Status);
Console.WriteLine("Press any key to continue..........");
Console.Read();
}
catch (Exception e)
{
Console.WriteLine("\nMain(): Exception raised!");
Console.WriteLine("Source :{0} ", e.Source);
Console.WriteLine("Message :{0} ", e.Message);
Console.WriteLine("Press any key to continue..........");
Console.Read();
}
}
private static void HandleSyncResponseReadCompletion(IAsyncResult asyncResult)
{
RequestState requestState = (RequestState)asyncResult.AsyncState;
Stream responseStream = requestState.ResponseStream;
bool readComplete = false;
while (asyncResult.CompletedSynchronously && !readComplete)
{
int read = responseStream.EndRead(asyncResult);
if (read > 0)
{
requestState.OnResponseBytesRead(read);
asyncResult = responseStream.BeginRead(requestState.ReadBuffer, 0, BufferSize, new AsyncCallback(ReadCallBack), requestState);
}
else
{
readComplete = true;
HandleReadCompletion(requestState);
}
}
}
private static void ResponseCallback(IAsyncResult asynchronousResult)
{
try
{
// AsyncState is an instance of RequestState.
RequestState requestState = (RequestState)asynchronousResult.AsyncState;
WebRequest request = requestState.Request;
requestState.Response = request.EndGetResponse(asynchronousResult);
// Read the response into a Stream.
Stream responseStream = requestState.Response.GetResponseStream();
requestState.ResponseStream = responseStream;
// Begin the Reading of the contents of the HTML page and print it to the console.
IAsyncResult asynchronousReadResult = responseStream.BeginRead(requestState.ReadBuffer, 0, BufferSize, new AsyncCallback(ReadCallBack), requestState);
HandleSyncResponseReadCompletion(asynchronousReadResult);
}
catch (WebException e)
{
Console.WriteLine("\nRespCallback(): Exception raised!");
Console.WriteLine("\nMessage:{0}", e.Message);
Console.WriteLine("\nStatus:{0}", e.Status);
allDone.Set();
}
}
// Print the webpage to the standard output, close the stream and signal completion.
private static void HandleReadCompletion(RequestState requestState)
{
Console.WriteLine("\nThe contents of the Html page are : ");
if (requestState.ResponseBuilder.Length > 1)
{
string stringContent;
stringContent = requestState.ResponseBuilder.ToString();
Console.WriteLine(stringContent);
}
Console.WriteLine("Press any key to continue..........");
Console.ReadLine();
requestState.ResponseStream.Close();
allDone.Set();
}
private static void ReadCallBack(IAsyncResult asyncResult)
{
if (asyncResult.CompletedSynchronously)
{
// To avoid recursive synchronous calls into ReadCallBack,
// synchronous completion is handled at the BeginRead call-site.
return;
}
try
{
RequestState requestState = (RequestState)asyncResult.AsyncState;
Stream responseStream = requestState.ResponseStream;
int read = responseStream.EndRead(asyncResult);
// Read the HTML page and then print it to the console.
if (read > 0)
{
requestState.OnResponseBytesRead(read);
IAsyncResult asynchronousResult = responseStream.BeginRead(requestState.ReadBuffer, 0, BufferSize, new AsyncCallback(ReadCallBack), requestState);
HandleSyncResponseReadCompletion(asynchronousResult);
}
else
{
HandleReadCompletion(requestState);
}
}
catch (WebException e)
{
Console.WriteLine("\nReadCallBack(): Exception raised!");
Console.WriteLine("\nMessage:{0}", e.Message);
Console.WriteLine("\nStatus:{0}", e.Status);
allDone.Set();
}
}
}
설명
주의
WebRequest
, HttpWebRequest
, ServicePoint
및 WebClient
사용되지 않으므로 새 개발에 사용하면 안 됩니다. 대신 HttpClient 사용합니다.
BeginGetResponse 메서드는 인터넷 리소스의 응답에 대한 비동기 요청을 시작합니다. 비동기 콜백 메서드는 EndGetResponse 메서드를 사용하여 실제 WebResponse반환합니다.
HttpWebRequest 클래스에 설정된 속성이 충돌하는 경우 몇 가지 경우에 ProtocolViolationException throw됩니다. 이 예외는 애플리케이션이 ContentLength 속성과 SendChunked 속성을 true
설정한 다음 HTTP GET 요청을 보내는 경우에 발생합니다. 이 예외는 애플리케이션이 HTTP 1.0 프로토콜만 지원하는 서버로 청크를 보내려고 하는 경우 발생합니다. 여기서는 지원되지 않습니다. 이 예외는 애플리케이션이 ContentLength 속성을 설정하지 않고 데이터를 보내려고 시도하거나 버퍼링을 사용하지 않도록 설정하고 유지 연결(KeepAlive 속성이 true
)에서 SendChunkedfalse
경우 발생합니다.
WebException throw되는 경우 예외의 Response 및 Status 속성을 사용하여 서버의 응답을 확인합니다.
BeginGetResponse 메서드는 이 메서드가 비동기 상태가 되기 전에 일부 동기 설정 작업(예: DNS 확인, 프록시 검색 및 TCP 소켓 연결)을 완료해야 합니다. 따라서 오류에 대한 예외가 throw되거나 메서드가 성공하기 전에 초기 동기 설정 작업을 완료하는 데 상당한 시간(네트워크 설정에 따라 최대 몇 분)이 걸릴 수 있으므로 UI(사용자 인터페이스) 스레드에서 이 메서드를 호출해서는 안 됩니다.
스레드 풀에 대한 자세한 내용은 관리되는 스레드 풀
메모
애플리케이션은 특정 요청에 대해 동기 및 비동기 메서드를 혼합할 수 없습니다. BeginGetRequestStream 메서드를 호출하는 경우 BeginGetResponse 메서드를 사용하여 응답을 검색해야 합니다.
메모
이 멤버는 애플리케이션에서 네트워크 추적을 사용하도록 설정할 때 추적 정보를 출력합니다. 자세한 내용은 .NET Framework
적용 대상
추가 정보
.NET