Sisk

リクエストライフサイクル

このページは英語から自動翻訳されています。 原文を読む

以下では、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 のルータが受信した HTTP サーバーに関連付けられます。
      • ルータが既に別の HTTP サーバーに関連付けられている場合、ルータはサーバーの構成リソースを積極的に使用するため許可されず、InvalidOperationException がスローされます。これは HTTP サーバーの初期化時にのみ発生し、HTTP コンテキストの作成時には発生しません。
    • ヘッダーの事前定義:
      • 設定されている場合、レスポンスに X-Request-Id ヘッダーを事前に設定します。
      • 設定されている場合、レスポンスに X-Powered-By ヘッダーを事前に設定します。
    • コンテンツサイズの検証: リクエストコンテンツが HttpServerConfiguration.MaximumContentLength 未満かどうかを、サイズが 0 より大きい場合にのみ検証します(デフォルトは 100 MB)。
      • リクエストが設定された Content-Length を超える場合、クライアントに 413 Payload Too Large が返され、HTTP コンテキストには HttpServerExecutionStatus = ContentTooLarge が設定されます。
    • OnHttpRequestOpen イベントが、構成されたすべての HTTP サーバーハンドラに対して呼び出されます。
  • アクションのルーティング: サーバーは受信したリクエストに対してルータを呼び出します。
    • ルータがリクエストに一致するルートを見つけない場合:
      • 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 がクライアントに返されます。
    • 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)が転送されます。
    • AfterResponse フラグが付いたすべてのグローバル IRequestHandler インスタンスが実行されます。
      • ハンドラが非 null のレスポンスを返した場合、そのレスポンスが前のレスポンスを置き換え、直ちに HTTP クライアントに転送されます。
      • このステップでエラーがスローされ、HttpServerConfiguration.ThrowExceptions が無効な場合:
        • Router.CallbackErrorHandler プロパティが有効であれば呼び出され、その結果のレスポンスがクライアントに返されます。
        • 前者が未定義の場合、空のレスポンスがサーバーに返され、例外の種類に応じたレスポンス(通常は 500 Internal Server Error)が転送されます。
    • ルートで定義され、AfterResponse フラグが付いたすべての IRequestHandler インスタンスが実行されます。
      • ハンドラが非 null のレスポンスを返した場合、そのレスポンスが前のレスポンスを置き換え、直ちに HTTP クライアントに転送されます。
      • このステップでエラーがスローされ、HttpServerConfiguration.ThrowExceptions が無効な場合:
        • Router.CallbackErrorHandler プロパティが有効であれば呼び出され、その結果のレスポンスがクライアントに返されます。
        • 前者が未定義の場合、空のレスポンスがサーバーに返され、例外の種類に応じたレスポンス(通常は 500 Internal Server Error)が転送されます。
  • レスポンスの処理: レスポンスが準備できたら、サーバーはクライアントへ送信するためにそれを準備します。
    • 現在の ListeningHost.CrossOriginResourceSharingPolicy に設定された内容に従って、レスポンスに Cross-Origin Resource Sharing (CORS) ヘッダーが設定されます。
    • レスポンスのステータスコードとヘッダーがクライアントに送信されます。
    • レスポンスコンテンツがクライアントに送信されます:
      • レスポンスコンテンツが ByteArrayContent の派生クラスである場合、レスポンスバイトが直接レスポンス出力ストリームにコピーされます。
      • 前者に該当しない場合、レスポンスはストリームにシリアライズされ、レスポンス出力ストリームにコピーされます。
    • ストリームが閉じられ、レスポンスコンテンツは破棄されます。
    • HttpServerConfiguration.DisposeDisposableContextValues が有効な場合、リクエストコンテキストで定義された [IDisposable] を継承するすべてのオブジェクトが破棄されます。
    • OnHttpRequestClose イベントが、構成されたすべての HTTP サーバーハンドラに対して呼び出されます。
    • サーバーで例外がスローされた場合、OnException イベントが、構成されたすべての HTTP サーバーハンドラに対して呼び出されます。
    • ルートがアクセスログを許可し、HttpServerConfiguration.AccessLogsStream が null でない場合、ログ出力にログ行が書き込まれます。
    • ルートがエラーログを許可し、例外が発生し、HttpServerConfiguration.ErrorsLogsStream が null でない場合、エラーログ出力にログ行が書き込まれます。
    • サーバーが HttpServer.WaitNext でリクエストを待機している場合、ミューテックスが解放され、コンテキストがユーザーに利用可能になります。

ドキュメントと API リファレンスを検索するには入力してください。