Asp.NetWeb Api開発(第三編)カスタム異常フィルタ


例外フィルタをカスタマイズしない場合、クライアントがAPIを呼び出してエラーが発生した場合、500などのエラーステータスと、エラーが発生したという文しか得られません.サービス側は異常コードをブロックできません.もちろん、すべてのActionにtry-catchを書いて処理をキャプチャすることもできます.しかし、これは私が望んでいるものではありません.単一のActionまたはコントローラ全体のすべてのActionの例外をキャプチャするために、例外フィルタをカスタマイズすることができます.
上のコード:
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());//<<<