web-dev-qa-db-ja.com

asp.netコアにカスタムactionResultを記述する方法

WebApi2では、IHttpActionResultを継承することでカスタムActionResultを作成できます。

サンプル :

_public class MenivaActionResult : IHttpActionResult
    {
        private readonly HttpRequestMessage _request;
        private readonly ServiceResponseBase _response;

        public MenivaActionResult(HttpRequestMessage request, ServiceResponseBase response)
        {
            _request = request;
            _response = response;
        }


        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken token)
        {

            HttpResponseMessage httpresponseMessage = _response.Exception != null
                ? _request.CreateErrorResponse((HttpStatusCode)_response.HttpCode,
                    _response.Exception.Message+":"+_response.Exception.HelpCode)
                : _request.CreateResponse((HttpStatusCode)_response.HttpCode, _response.Data);
            return Task.FromResult(httpresponseMessage);
        }
    }
_

ServiceResponseBaseクラスオブジェクトは、サービスレイヤーからのすべての例外とデータを保持します。

このコードをasp.netコアに移植する方法。私は試しましたが、.netコアのHttpRequestMessageオブジェクトから応答メッセージを作成する方法がわかりません。 IActionResultにはTask ExecuteResultAsync(ActionContext context)メソッドのみがあります。このメソッドからの応答を変更する方法

15
Binson Eldhose

以下に例を示します。

public class TestResult
{
    public Exception Exception { get; set; }
    public object Data { get; set; }
}

public class TestActionResult : IActionResult
{
    private readonly TestResult _result;

    public TestActionResult(TestResult result)
    {
        _result = result;
    }

    public async Task ExecuteResultAsync(ActionContext context)
    {
        var objectResult = new ObjectResult(_result.Exception ?? _result.Data)
        {
            StatusCode = _result.Exception != null
                ? StatusCodes.Status500InternalServerError
                : StatusCodes.Status200OK
        };

        await objectResult.ExecuteResultAsync(context);
    }
}

ObjectResultは、アクションからIActionResult以外を返す場合に結果が変換されるタイプです。コンテンツネゴシエーションを行います。

ObjectResultから継承し、コンストラクターに書き込まれるステータスコードとデータをセットアップすることもできます。

ASP.NET Coreのコンテンツネゴシエーションの詳細: https://docs.Microsoft.com/en-us/aspnet/core/mvc/models/formatting#content-negotiation

26
juunas

@juunasの答えは技術的には正しいですが、実際に達成しようとしているのはカスタムエラー処理です。そして、より良い方法は、アクションフィルター、ミドルウェアフィルター、または別個のミドルウェアを使用してこのロジックを分離することです(対象範囲に応じて)。

主なアイデアは、コントローラーが例外を処理する責任を負わないということです。 OKステータスで期待される結果を返すか、何か問題がある(例外をスローする)と言って、パイプラインの他の部分に問題の処理を委任する必要があります。

SOを調べてください: 例:ASP.NET Core 1.0 Web APIでのエラー処理(クライアントへのex.Messageの送信) また、 ASP.NET Coreでのエラー処理 docが役立つ場合があります。

2
Set