11

大きなハッカーなしで、ランナー内で ServiceStack リクエストの生のリクエスト本文を取得することは可能ですか?

新しい API (サービスとランナー) を使用して、ServiceStack の上で実行する oauth サービス プロバイダーを作成しています。OAuth 署名がどのように機能するかにより、リクエストごとに生のリクエスト ボディを取得する必要があります。OAuth 保護レイヤーが Runner に追加されているため、無効な OAuth リクエストは Service クラスにボイラープレートを使用したり、特別な「OAuthService」クラスをサブクラス化したりすることなく、空/エラー応答を簡単に返すことができます。

4

1 に答える 1

15

Raw Request Body にアクセスする方法は、 を使用するIHttpRequest.GetRawBody()か、から読み取ることIHttpRequest.InputStreamです。

ただし、HTTP リクエストの本文は転送のみのストリームであるため、デフォルトでは一度しか呼び出すことができません。これは通常、リクエスト DTO を逆シリアル化するために ServiceStack によって呼び出されます。シリアライゼーションとデシリアライゼーションのドキュメントは、ServiceStack にリクエストのデシリアライズをスキップし、未読のリクエスト ストリームをリクエスト DTO に挿入するように指示する方法を示しています。

public class Hello : IRequiresRequestStream
{
    /// <summary>
    /// The raw Http Request Input Stream
    /// </summary>
    Stream RequestStream { get; set; }
}

ServiceStack にリクエスト DTO をデシリアライズするだけでなく、生のリクエスト本文にもアクセスさせたい場合は、ServiceStack にリクエストを読み取る前にバッファリングするように指示する必要があります。これは、PreRequestFilter を追加することで実行できます。

appHost.PreRequestFilters.Insert(0, (httpReq, httpRes) => {
    httpReq.UseBufferedStream = true;
});

バッファリングされたためhttpReq.GetRawBody()、複数回呼び出すか、から直接読み取ることができるようになりました。IHttpRequest.InputStream

于 2013-07-07T18:24:59.507 に答える