16

ODataController で例外を発生させるためのベスト プラクティスを知りたいと思っています。

メソッドで例外を発生させると、デフォルトで応答コード 500 に変換され、コンテンツにエラーの詳細が含まれます。応答コードを明示し、無効なキーの場合は 400 を送信したいと思います。

例: 入力リクエストに無効なキーが含まれている場合、400 の HttpResponseCode を返す必要があり、コンテンツには例外を発生させるのと同様のエラーの詳細が含まれている必要があります。

ご意見をお寄せいただきありがとうございます

4

4 に答える 4

23

OData (少なくとも v3 以降) は、特定の jsonを使用してエラーを表します。

{
    "error": {
        "code": "A custom error code",
        "message": {
            "lang": "en-us",
            "value": "A custom long message for the user." 
        },
        "innererror": {
            "trace": [...],
            "context": {...}
        }
    }
}

Microsoft .Net には、サーバー側で OData エラーを形成するMicrosoft.Data.OData.ODataErrorおよびMicrosoft.Data.OData.ODataInnerErrorクラスが含まれています。

エラーの詳細を含む適切な OData エラー応答 ( HttpResponseMessage ) を形成するには、次のことができます。

1) System.Web.OData.Extensions.HttpRequestMessageExtensions.CreateErrorResponseメソッドを使用して、コントローラーのアクションで HttpResponseMessage を形成して返す

return Request.CreateErrorResponse(HttpStatusCode.Conflict, new ODataError { ErrorCode="...", Message="...", MessageLanguage="..." }));

2) HttpResponseMessage の作成と同じメソッドを使用して HttpResponseException をスローする

throw new HttpResponseException(
    Request.CreateErrorResponse(HttpStatusCode.NotFound,  new ODataError { ErrorCode="...", Message="...", MessageLanguage="..." }));

3) カスタムの型指定された例外をスローし、Web Api アクション フィルターを使用して変換する

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is CustomException)
        {
            var e = (CustomException)context.Exception;

            var response = context.Request.CreateErrorResponse(e.StatusCode, new ODataError
            {
                ErrorCode = e.StatusCodeString,
                Message = e.Message,
                MessageLanguage = e.MessageLanguage
            });
            context.Response = response;
        }
        else
            base.OnException(context);
    }
}
于 2014-09-17T09:59:55.023 に答える
1

OData を使用する ASP.NET Core の場合、メソッドの を、カスタム例外をキャッチしてスローするカスタム属性に置き換えEnableQueryAttributeます。ほとんどの場合、これにより、標準エラー処理が期待どおりに介入できるようになります。このソリューションは、もともとhttps://github.com/OData/WebApi/issues/1898で見つかりました。GetODataException

カスタム属性には、次のようなものを使用します。

public class CustomEnableQueryAttribute : EnableQueryAttribute
{
    public override void ValidateQuery(HttpRequest request, ODataQueryOptions queryOptions)
    {
        try
        {
            base.ValidateQuery(request, queryOptions);
        }
        catch (ODataException e)
        {
            throw new CustomException(e.Message, e){UserMessage = "Invalid OData query."};
        }
    }
}

Getメソッドで、次のようなものを使用します。

[HttpGet, CustomEnableQuery]
public virtual IQueryable<TDomainDto> Get()
{
    return Repository.Get();    
}
于 2020-07-30T15:29:38.570 に答える