1. ホーム
  2. c#

[解決済み】OKでないレスポンスに対してIHttpActionResultでコンテンツを返す。

2022-04-14 03:12:31

質問

Web API 2のコントローラから返す場合、以下のようにレスポンスがOK(ステータス200)であれば、レスポンスと一緒にコンテンツを返すことができます。

    public IHttpActionResult Get()
    {
        string myResult = ...
        return Ok(myResult);
    }

可能であれば、ここでは可能な限り、組み込みの結果型を使いたい。 https://msdn.microsoft.com/en-us/library/system.web.http.results(v=vs.118).aspx

質問ですが、他のタイプのレスポンス(200以外)の場合、どのようにすればメッセージ(文字列)を一緒に返すことができるのでしょうか?例えば、こんなことができます。

    public IHttpActionResult Get()
    {
       return InternalServerError();
    }

が、これは違う。

    public IHttpActionResult Get()
    {
       return InternalServerError("Message describing the error here");
    }

理想的には、これを一般化して、IHttpActionResultのどのような実装でもメッセージを送り返せるようにしたい。

これを行う(独自の応答メッセージを構築する)必要があるのでしょうか。

    public IHttpActionResult Get()
    {
       HttpResponseMessage responseMessage = ...
       return ResponseMessage(responseMessage);
    }

それとも、もっといい方法があるのでしょうか?

どのように解決するのですか?

結局、次のような解決策をとることにしました。

public class HttpActionResult : IHttpActionResult
{
    private readonly string _message;
    private readonly HttpStatusCode _statusCode;

    public HttpActionResult(HttpStatusCode statusCode, string message)
    {
        _statusCode = statusCode;
        _message = message;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        HttpResponseMessage response = new HttpResponseMessage(_statusCode)
        {
            Content = new StringContent(_message)
        };
        return Task.FromResult(response);
    }
}

...このように使うことができます。

public IHttpActionResult Get()
{
   return new HttpActionResult(HttpStatusCode.InternalServerError, "error message"); // can use any HTTP status code
}

改善提案をお待ちしています :)