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 は値に設定され、SendChunked は false
。
-又は-
スレッド プールがスレッド不足です。
Method は GET または HEAD で、ContentLength が 0 より大きいか、SendChunked が true
。
-又は-
KeepAlive が true
、AllowWriteStreamBuffering が false
、ContentLength が -1、SendChunked が false
、Method が POST または PUT のいずれかです。
-又は-
HttpWebRequest にはエンティティ本体がありますが、BeginGetRequestStream(AsyncCallback, Object) メソッドを呼び出さずに BeginGetResponse(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を返します。
ProtocolViolationException は、HttpWebRequest クラスに設定されたプロパティが競合している場合にスローされる場合があります。 この例外は、アプリケーションが ContentLength プロパティと SendChunked プロパティを true
に設定し、HTTP GET 要求を送信した場合に発生します。 この例外は、アプリケーションが HTTP 1.0 プロトコルのみをサポートするサーバーにチャンクを送信しようとした場合に発生します。このプロトコルはサポートされていません。 この例外は、アプリケーションが ContentLength プロパティを設定せずにデータを送信しようとした場合、またはバッファリングが無効でキープアライブ接続 (KeepAlive プロパティが true
) に false
SendChunked.
WebException がスローされた場合は、例外の Response プロパティと Status プロパティを使用して、サーバーからの応答を確認します。
BeginGetResponse メソッドでは、このメソッドが非同期になる前に、いくつかの同期セットアップ タスク (DNS 解決、プロキシ検出、TCP ソケット接続など) を完了する必要があります。 その結果、このメソッドは、エラーの例外がスローされるか、メソッドが成功する前に初期同期セットアップ タスクを完了するのにかなりの時間 (ネットワーク設定によっては最大で数分) かかる場合があるため、ユーザー インターフェイス (UI) スレッドで呼び出さないでください。
スレッド プールの詳細については、「マネージド スレッド プールの」を参照してください。
手記
アプリケーションは、特定の要求に対して同期メソッドと非同期メソッドを混在させることができません。 BeginGetRequestStream メソッドを呼び出す場合は、BeginGetResponse メソッドを使用して応答を取得する必要があります。
手記
このメンバーは、アプリケーションでネットワーク トレースを有効にすると、トレース情報を出力します。 詳細については、「.NET Frameworkでのネットワーク トレースの
適用対象
こちらもご覧ください
.NET