6

Microsoft ASP.NET Web API を使用して RESTful サービスを構築しています。

私の問題は、何か問題が発生したときに Web API がユーザーに返す HttpErrors に関するものです (例: 400 Bad Request または 404 Not Found)。

問題は、応答コンテンツでシリアル化された HttpError を取得したくないということです。これは、提供される情報が多すぎる場合があるため、OWASP セキュリティ ルールに違反するためです。次に例を示します。

リクエスト:

http://localhost/Service/api/something/555555555555555555555555555555555555555555555555555555555555555555555

応答として、もちろん 400 を取得しますが、次のコンテンツ情報が含まれます。

{
 "$id": "1",
 "Message": "The request is invalid.",
 "MessageDetail": "The parameters dictionary contains a null entry for parameter 'id'  of non-nullable type 'System.Int32' for method 'MyNamespaceAndMethodHere(Int32)' in 'Service.Controllers.MyController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
}

このようなものは、私の WebService が ASP.NET WebAPI テクノロジに基づいていることを示すだけでなく (それほど悪くはありません)、名前空間、メソッド名、パラメーターなどに関する情報も提供します。

Global.asax に IncludeErrorDetailPolicy を設定しようとしました

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Never;

ええ、それは何とかうまくいきました。結果には MessageDetail セクションが含まれていませんが、それでも、この HttpError をまったく取得したくありません。

カスタムの DelegatingHandler も作成しましたが、コントローラーで生成した 400 と 404 にも影響します。

私の質問は次のとおりです。応答コンテンツからシリアライズされた HttpError を取り除く便利な方法はありますか? ユーザーが悪い要求に対して返してほしいのは、応答コードだけです。

4

2 に答える 2

2

カスタム IHttpActionInvoker を使用するのはどうですか? 基本的に、空の HttpResponseMessage を送信するだけです。

これは非常に基本的な例です:

public class MyApiControllerActionInvoker : ApiControllerActionInvoker
{
    public override Task<HttpResponseMessage> InvokeActionAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
    {
        var result = base.InvokeActionAsync(actionContext, cancellationToken);

        if (result.Exception != null)
        {
            //Log critical error
            Debug.WriteLine("unhandled Exception ");

            return Task.Run<HttpResponseMessage>(() => new HttpResponseMessage(HttpStatusCode.InternalServerError));
        }
        else if (result.Result.StatusCode!= HttpStatusCode.OK)
        {
            //Log critical error
            Debug.WriteLine("invalid response status");

            return Task.Run<HttpResponseMessage>(() => new HttpResponseMessage(result.Result.StatusCode));
        }


        return result;
    }
}

Global.asax で

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpActionInvoker), new MyApiControllerActionInvoker());

Web Api に関係なくできるもう 1 つの重要なことは、過剰な asp.net および IIS HTTP ヘッダーを削除することです。ここに良い説明があります。

于 2013-07-11T10:21:59.810 に答える