クライアントアプリケーションによって消費される余分なデータが必要なのでIHttpActionResultをラップしたいと思います。ラッピングIHttpActionResult - 汎用ソリューション
私の最初のアプローチが成功した場合、結果オブジェクトをラップする、シンプルなDTOを作成して返すようにした。
レスポンスDTO:
public class Response<T>
{
public string ErrorMessage { get; set; }
public bool Success { get; set; }
public string CodeStatus { get; set; }
public T Result { get; set; }
public Response(bool isSuccess, [Optional] T result, [Optional] string codeStatus, [Optional] string errorMessage)
{
Success = isSuccess;
Result = result;
CodeStatus = codeStatus;
ErrorMessage = errorMessage;
}
}
コントローラー:
public IHttpActionResult Get(int id)
{
return BadRequest(new Response<MyObjectClass>(false, null,"Invalid Id",400));
...
return Ok(new Response<MyObjectClass>(true, result);
}
、私は非常にそれを見つけましたラッピングに対処するには効果的ではありません。私はそれを非常にエレガントな方法で見つけることはできません。
例コントローラのアクション::これはまだレスポンスDTOを返す
public IHttpActionResult GetById(int id)
{
var result = _someService.Get(id);
if (result == null)
return NotFound().WithError("Invalid Id");
return Ok().WithSuccess(result);
}
いくつかの一般的な解決策を考え出したし、次になってしまったと私が試してみました。
私はレスポンスDTOの作成に対処するためIHttpActionResultを包みました:
public class HttpActionResult : IHttpActionResult
{
private readonly string _errorMessage;
private readonly IHttpActionResult _innerResult;
private readonly object _result;
private readonly bool _isSuccess;
public HttpActionResult(IHttpActionResult inner, bool isSuccess, object result,string errorMessage)
{
_errorMessage = errorMessage;
_innerResult = inner;
_result = result;
_isSuccess = isSuccess;
}
public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
HttpResponseMessage response = await _innerResult.ExecuteAsync(cancellationToken);
response.Content = new ObjectContent(typeof(Response), new Response(_isSuccess, _result, ((int)response.StatusCode).ToString(), _errorMessage), new JsonMediaTypeFormatter());
return response;
}
}
は最後に、私は、コントローラで簡単に使用することにIHttpActionResultに拡張メソッドを追加しました:
public static class IHttpActionResultExtensions
{
public static IHttpActionResult WithSuccess(this IHttpActionResult inner, object result = null, string message = null)
{
return new HttpActionResult(inner, true, result, message);
}
public static IHttpActionResult WithError(this IHttpActionResult inner, string message = null)
{
return new HttpActionResult(inner, false,null, message);
}
}
はに代わる何ですかAPIコントローラーでhttpメッセージをラッピングすることに対処しますか? 私の弱点は何ですか?
Ad.1-2。新しいステータスコードの作成は私の意図ではありませんでした。私はちょうどこれを応答の本体に含めることを望んでいました。私はそれが応答の本文ですべてを持つことは非常に一般的なパターンであり、実際の結果はこれらの余分な情報で包まれていることを見てきました。 – laszczm
広告。 3-4。私は 'ModelState'を詳述しますが、私はこのシナリオでは考慮しませんでした。私はそれを検証の目的でのみ使っています。 – laszczm
@laszczm誰もが宣伝しているほどRESTfulではありません:D 3-4については、モデル検証では 'ModelState'が使用されますが、エラーの伝達だけでなく、 –