ApiController
HTTP のステータス コード 307 を介してリダイレクトすることにより、POST 要求に応答する があります。これは、ヘッダーからの情報のみを使用して行われるため、このアクションでは要求の本文は必要ありません。このアクションは次と同等です。
public HttpResponseMessage Post() {
var url;
// Some logic to construct the URL
var response = new HttpResponseMessage(HttpStatusCode.TemporaryRedirect);
response.Headers.Location = new System.Uri(url);
return response;
}
これは簡単ですが、改善したい点が 1 つあります。リクエストの本文には大量のデータが含まれる可能性があるため、HTTP ステータス コード 100 を利用して、このリクエストをより効率的にしたいと考えています。コントローラーをそのまま使用すると、会話は次のようになります。
> POST /api/test HTTP/1.1
> Expect: 100-continue
> ...
< HTTP/1.1 100 Continue
> (request body is sent)
< HTTP/1.1 307 Temporary Redirect
< Location: (the URL)
< ...
リダイレクト アクションではリクエスト ボディは必要ないため、会話を次のように短縮できるようにしたいと考えています。
> POST /api/controller HTTP/1.1
> Expect: 100-continue
> ...
< HTTP/1.1 307 Temporary Redirect
< Location: (the URL)
< ...
これを達成する方法を調査するために 1 日の大部分を費やしましたが、解決策を思いつくことができませんでした。私の研究では、次のことを学びました。
ApiController
のアクションが実行されるとき、100 Continue
はすでに送信されています。- が
ApiController
作成された時点で、100 Continue
はすでに送信されています。 HttpApplication
のPreRequestHandlerExecute
イベントがトリガーされたときに、100 Continue
応答が送信されていません。- が
DelegatingHandler
実行されると、100 Continue
はすでに送信されています。
これに基づいて、これまでに思いついた最善の解決策は、問題の がリクエストの受信者である場合に、 onHttpModule
を使用してレスポンスをオーバーライドするを作成することです。ただし、これはいくつかの理由 (コードの分離、Web API のパラメーター バインディングを利用しない、および の追加ロジックをバイパスする) により、理想的なソリューションとはほど遠いものです。RouteData
RequestContext
ApiController
AuthorizeAttribute
ApiController
これにはもっと良い解決策があるように思えますがExpect: 100-continue
、Web API アプリケーションでヘッダーを適切に処理する方法に関する情報はほとんど見つかりませんでした。ヘッダーを適切に処理するためにこれを実装する最も簡単な方法は何でしょうか?ApiController
Expect: 100-continue