リクエストのライフサイクル
このページは英語から自動翻訳されています。 原文を読む
以下では、HTTP リクエストの例を通して、リクエストの全ライフサイクルについて説明します。
- リクエストの受信: 各リクエストは、リクエスト自体とクライアントに配信されるレスポンスとの間に HTTP コンテキストを作成します。このコンテキストは Sisk の組み込みリスナーから提供され、HttpListener、Kestrel、または Cadente のいずれかになります。
- 外部リクエストの検証: HttpServerConfiguration.RemoteRequestsAction の検証がリクエストに対して行われます。
- リクエストが外部であり、プロパティが
Dropの場合、HttpServerExecutionStatus = RemoteRequestDroppedとともにクライアントへのレスポンスなしで接続が閉じられます。
- リクエストが外部であり、プロパティが
- 転送リゾルバーの構成: ForwardingResolver が構成されている場合、リクエスト元ホストの OnResolveRequestHost メソッドが呼び出されます。
- DNS マッチング: ホストが解決され、かつ複数の ListeningHost が構成されている場合、サーバーはリクエストに対応するホストを探します。
- 一致する ListeningHost がない場合、クライアントに 400 Bad Request のレスポンスが返され、HTTP コンテキストには
HttpServerExecutionStatus = DnsUnknownHostステータスが設定されます。 - ListeningHost が一致しても、その Router がまだ初期化されていない場合、クライアントに 503 Service Unavailable のレスポンスが返され、HTTP コンテキストには
HttpServerExecutionStatus = ListeningHostNotReadyステータスが設定されます。
- 一致する ListeningHost がない場合、クライアントに 400 Bad Request のレスポンスが返され、HTTP コンテキストには
- ルーターのバインディング: 対応する ListeningHost のルーターが受信した HTTP サーバーに関連付けられます。
- ルーターがすでに別の HTTP サーバーに関連付けられている場合、ルーターはサーバーの構成リソースを積極的に使用するため許可されず、
InvalidOperationExceptionがスローされます。これは HTTP サーバーの初期化時にのみ発生し、HTTP コンテキストの作成時には発生しません。
- ルーターがすでに別の HTTP サーバーに関連付けられている場合、ルーターはサーバーの構成リソースを積極的に使用するため許可されず、
- ヘッダーの事前定義:
- 設定されている場合、レスポンスに
X-Request-Idヘッダーを事前定義します。 - 設定されている場合、レスポンスに
X-Powered-Byヘッダーを事前定義します。
- 設定されている場合、レスポンスに
- コンテンツサイズの検証: リクエストコンテンツが HttpServerConfiguration.MaximumContentLength 未満かどうかを、設定が 0 より大きい場合にのみ検証します。
- リクエストが設定された
Content-Lengthを超える場合、クライアントに 413 Payload Too Large のレスポンスが返され、HTTP コンテキストにはHttpServerExecutionStatus = ContentTooLargeステータスが設定されます。
- リクエストが設定された
OnHttpRequestOpenイベントが、構成されたすべての HTTP サーバーハンドラに対して呼び出されます。
- 外部リクエストの検証: HttpServerConfiguration.RemoteRequestsAction の検証がリクエストに対して行われます。
- アクションのルーティング: サーバーは受信したリクエストに対してルーターを呼び出します。
- ルーターがリクエストに一致するルートを見つけない場合:
- Router.NotFoundErrorHandler プロパティが構成されている場合、アクションが呼び出され、そのレスポンスが HTTP クライアントに転送されます。
- 前述のプロパティが null の場合、デフォルトの 404 Not Found レスポンスがクライアントに返されます。
- ルーターが一致するルートを見つけたが、ルートのメソッドがリクエストのメソッドと一致しない場合:
- Router.MethodNotAllowedErrorHandler プロパティが構成されている場合、アクションが呼び出され、そのレスポンスが HTTP クライアントに転送されます。
- 前述のプロパティが null の場合、デフォルトの 405 Method Not Allowed レスポンスがクライアントに返されます。
- リクエストが
OPTIONSメソッドの場合:- ルーターは、リクエストメソッドに一致するルートがない場合(ルートのメソッドが明示的に RouteMethod.Options でない場合)に限り、クライアントに 200 Ok のレスポンスを返します。
- HttpServerConfiguration.ForceTrailingSlash プロパティが有効で、マッチしたルートが正規表現でなく、リクエストパスが
/で終わっておらず、リクエストメソッドがGETの場合:- パスとクエリを同じ場所に
/を付加した形でLocationヘッダーに設定した 307 Temporary Redirect の HTTP レスポンスがクライアントに返されます。
- パスとクエリを同じ場所に
OnContextBagCreatedイベントが、構成されたすべての HTTP サーバーハンドラに対して呼び出されます。BeforeResponseフラグが設定されたすべてのグローバル IRequestHandler インスタンスが実行されます。- ハンドラが null でないレスポンスを返した場合、そのレスポンスが HTTP クライアントに転送され、コンテキストは閉じられます。
- このステップでエラーがスローされ、HttpServerConfiguration.ThrowExceptions が無効化されている場合:
- Router.CallbackErrorHandler プロパティが有効な場合、呼び出され、その結果のレスポンスがクライアントに返されます。
- 前述のプロパティが未定義の場合、空のレスポンスがサーバーに返され、スローされた例外の種類に応じたレスポンス(通常は 500 Internal Server Error)が転送されます。
- ルートで定義され、
BeforeResponseフラグが設定されたすべての IRequestHandler インスタンスが実行されます。- ハンドラが null でないレスポンスを返した場合、そのレスポンスが HTTP クライアントに転送され、コンテキストは閉じられます。
- このステップでエラーがスローされ、HttpServerConfiguration.ThrowExceptions が無効化されている場合:
- Router.CallbackErrorHandler プロパティが有効な場合、呼び出され、その結果のレスポンスがクライアントに返されます。
- 前述のプロパティが未定義の場合、空のレスポンスがサーバーに返され、スローされた例外の種類に応じたレスポンス(通常は 500 Internal Server Error)が転送されます。
- ルーターのアクションが呼び出され、HTTP レスポンスに変換されます。
- このステップでエラーがスローされ、HttpServerConfiguration.ThrowExceptions が無効化されている場合:
- Router.CallbackErrorHandler プロパティが有効な場合、呼び出され、その結果のレスポンスがクライアントに返されます。
- 前述のプロパティが未定義の場合、空のレスポンスがサーバーに返され、スローされた例外の種類に応じたレスポンス(通常は 500 Internal Server Error)が転送されます。
- このステップでエラーがスローされ、HttpServerConfiguration.ThrowExceptions が無効化されている場合:
AfterResponseフラグが設定されたすべてのグローバル IRequestHandler インスタンスが実行されます。- ハンドラが null でないレスポンスを返した場合、ハンドラのレスポンスが前のレスポンスを置き換え、直ちに HTTP クライアントに転送されます。
- このステップでエラーがスローされ、HttpServerConfiguration.ThrowExceptions が無効化されている場合:
- Router.CallbackErrorHandler プロパティが有効な場合、呼び出され、その結果のレスポンスがクライアントに返されます。
- 前述のプロパティが未定義の場合、空のレスポンスがサーバーに返され、スローされた例外の種類に応じたレスポンス(通常は 500 Internal Server Error)が転送されます。
- ルートで定義され、
AfterResponseフラグが設定されたすべての IRequestHandler インスタンスが実行されます。- ハンドラが null でないレスポンスを返した場合、ハンドラのレスポンスが前のレスポンスを置き換え、直ちに HTTP クライアントに転送されます。
- このステップでエラーがスローされ、HttpServerConfiguration.ThrowExceptions が無効化されている場合:
- Router.CallbackErrorHandler プロパティが有効な場合、呼び出され、その結果のレスポンスがクライアントに返されます。
- 前述のプロパティが未定義の場合、空のレスポンスがサーバーに返され、スローされた例外の種類に応じたレスポンス(通常は 500 Internal Server Error)が転送されます。
- ルーターがリクエストに一致するルートを見つけない場合:
- レスポンスの処理: レスポンスが準備できたら、サーバーはクライアントへの送信のためにそれを準備します。
- Cross-Origin Resource Sharing ポリシー (CORS) ヘッダーは、現在の ListeningHost.CrossOriginResourceSharingPolicy で設定された内容に従ってレスポンスに定義されます。
- レスポンスのステータスコードとヘッダーがクライアントに送信されます。
- レスポンスコンテンツがクライアントに送信されます:
- レスポンスコンテンツが ByteArrayContent の派生クラスである場合、レスポンスバイトは直接レスポンス出力ストリームにコピーされます。
- 前述の条件を満たさない場合、レスポンスはストリームにシリアライズされ、レスポンス出力ストリームにコピーされます。
- ストリームが閉じられ、レスポンスコンテンツは破棄されます。
- HttpServerConfiguration.DisposeDisposableContextValues が有効な場合、リクエストコンテキストで定義された IDisposable を継承するすべてのオブジェクトが破棄されます。
OnHttpRequestCloseイベントが、構成されたすべての HTTP サーバーハンドラに対して呼び出されます。- サーバーで例外がスローされた場合、
OnExceptionイベントが、構成されたすべての HTTP サーバーハンドラに対して呼び出されます。 - ルートがアクセスログを許可し、HttpServerConfiguration.AccessLogsStream が null でない場合、ログ行がログ出力に書き込まれます。
- ルートがエラーログを許可し、例外が発生し、HttpServerConfiguration.ErrorsLogsStream が null でない場合、エラーログ出力にログ行が書き込まれます。
- サーバーが HttpServer.WaitNext でリクエストを待機している場合、ミューテックスが解放され、コンテキストがユーザーに利用可能になります。