1

asp.net mvc4 webapi フレームワークから servicestack フレームワークに移行しようとしています。webapi に delegatingHandler がありますが、これは servicestack でこれに相当しますか?

ここでリクエストを検証し、それ以上先に進むことなくカスタム レスポンスを返します。

私の委譲ハンドラー

public class xyzDH : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        int maxLengthAllowed = 200;
        long? contentLen = request.Content.Headers.ContentLength; 
        if (contentLen > maxLengthAllowed)
        {
            var defaultResponse = ResponseHelper.GetBaseResponse("Content Lenght Issue", true, UploadLogSizeIssue);
            return Task<HttpResponseMessage>.Factory.StartNew(() =>
            {
                var response = new HttpResponseMessage(HttpStatusCode.OK)
                    {
                        Content = new StringContent(defaultResponse.ToString(), Encoding.UTF8, "message/http")
                    };
                return response;
            });
        }

        return base.SendAsync(request, cancellationToken);
    }
}
4

1 に答える 1

5

ServiceStack の単純なアーキテクチャをざっと見て、 ServiceStackがどのようにまとめられているかを全体的に理解することをお勧めします。

カスタム フック、フィルター、および拡張ポイント

ServiceStack では、Order of Operations wiki ページ で特定されている多数のカスタム フックと拡張ポイントを使用できます。これを行うには、カスタムフィルター属性またはグローバル フィルターを使用できます。これにより、応答に直接書き込むことができます。その後、httpResponse.EndServiceStackRequest()拡張メソッドを呼び出して、要求に対してこれ以上処理を行わないことを通知できます。

バリデーター

リクエスト検証のコンテキストで質問しているので、組み込みの FluentValidation を使用して宣言型の検証を可能にするServiceStack の組み込みの検証を確認する必要があります。

エラー処理

多くの場合、通常の C# 例外をスローするだけで十分です。ServiceStack は、サービス クライアントでの例外のシリアル化を含む、これに関する優れたストーリーを提供します。例外処理をカスタマイズするさまざまな方法については、エラー処理 wikiを参照してください。

グローバル リクエスト フィルタの使用

これは、WebApi Delegating Handler を ServiceStack Global Request Filterで書き直す方法です。

this.RequestFilters.Add((httpReq, httpResp, requestDto) =>
{
    int maxLengthAllowed = 200;
    if (httpReq.ContentLength > maxLengthAllowed)
    {
        //httpRes.StatusCode = 200; //No-op, not needed since its the default
        //Guess it could also be "message/http" but never heard of it
        httpRes.ContentType = "text/plain"; 
        httpRes.Write("Content Length Issue"); //Whatever you want in body
        httpRes.EndServiceStackRequest(); //No more processing for this request
    }
});

警告:200 OK上記のように、無効な HTTP 要求に対して戻ることはお勧めしません。リクエストが有効でない場合は、ArgumentException を継承する C# Exception400 BadRequestをスローするたびに ServiceStack が自動的に書き込むエラーである必要があります。

于 2013-04-08T21:39:35.520 に答える