Asp.NetWeb Api開発(第三編)カスタム異常フィルタ
例外フィルタをカスタマイズしない場合、クライアントがAPIを呼び出してエラーが発生した場合、500などのエラーステータスと、エラーが発生したという文しか得られません.サービス側は異常コードをブロックできません.もちろん、すべてのActionにtry-catchを書いて処理をキャプチャすることもできます.しかし、これは私が望んでいるものではありません.単一のActionまたはコントローラ全体のすべてのActionの例外をキャプチャするために、例外フィルタをカスタマイズすることができます.
上のコード:
次に、このプロパティをすべてのControllerまたは単一アクションにマークします.
上のコード:
using System.Net;
using System.Net.Http;
using System.Web.Http.Filters;
using RRP.Models.Response;
namespace RRPService.WebApi.Comm
{
///
///
///
public class DExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
//
string fLog = context.Exception.ToString();
// Response
context.Response = new HttpResponseMessage(HttpStatusCode.OK);
context.Response.Content = new StringContent(Dimoo.Lib.DataPack.JSerialize(new BaseResult() { success = 0, msg = " " }));
}
}
}
次に、このプロパティをすべてのControllerまたは単一アクションにマークします.
using System.Linq;
using System.Web.Http;
namespace RRPService.WebApi.App.Controllers
{
[DExceptionFilter]
public class CompanyController : ApiController
{
[HttpPost]
[Route("api/1110")]
public RRP.Company.Models.Response.C3000O Login(RRP.Company.Models.Request.C3000I aIn)
{
return RRP.Company.BLL.C3000(aIn);
}
[DExceptionFilter]
[HttpPost]
[Route("api/1110")]
public RRP.Company.Models.Response.C3001O Login2(RRP.Company.Models.Request.C3001I aIn)
{
return RRP.Company.BLL.C3001(aIn);
}
}
}
最後にGlobal.asaxにカスタム例外フィルタを登録します.using RRPService.WebApi.Comm;
using System.Web.Http;
using System.Web.Mvc;
namespace RRPService.WebApi.App
{
///
/// web api
///
public class WebApiApplication : System.Web.HttpApplication
{
///
///
///
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
GlobalConfiguration.Configuration.Filters.Add(new DExceptionFilterAttribute());//<<<