zoukankan      html  css  js  c++  java
  • web api control注册及重写DefaultHttpControllerSelector、ApiControllerActionSelector、ApiControllerActionInvoker

    namespace EWorkpal.WebApi
    {
        public class HttpNotFoundDefaultHttpControllerSelector : DefaultHttpControllerSelector
        {
            public HttpNotFoundDefaultHttpControllerSelector(HttpConfiguration configuration)
                : base(configuration)
            {
            }
            public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
            {
                HttpControllerDescriptor decriptor = null;
                try
                {
                    decriptor = base.SelectController(request);
                }
                catch (HttpResponseException ex)
                {
                    var code = ex.Response.StatusCode;
                    var result = new EWorkResultInfo<object> { Code = 10006, Entity = ex.Response.Content.ReadAsAsync<object>().Result };
                    if (code == HttpStatusCode.NotFound || code == HttpStatusCode.MethodNotAllowed)
                    {
                        ex.Response.Content = new ObjectContent(typeof(EWorkResultInfo), result, GlobalConfiguration.Configuration.Formatters.JsonFormatter);
                    }
                    throw;
                }
                return decriptor;
            }
    
    
        }
    
        public class HttpNotFoundControllerActionSelector : ApiControllerActionSelector
        {
            public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
            {
                HttpActionDescriptor decriptor = null;
                try
                {
                    decriptor = base.SelectAction(controllerContext);
                }
                catch (HttpResponseException ex)
                {
                    var code = ex.Response.StatusCode;
                    var result = new EWorkResultInfo<object> { Code = 10006, Entity = ex.Response.Content.ReadAsAsync<object>().Result };
                    if (code == HttpStatusCode.NotFound || code == HttpStatusCode.MethodNotAllowed)
                    {
                        ex.Response.Content = new ObjectContent(typeof(EWorkResultInfo), result, GlobalConfiguration.Configuration.Formatters.JsonFormatter);
                    }
                    throw;
                }
                return decriptor;
            }
        }
    
        public class CustomApiControllerActionInvoker : ApiControllerActionInvoker
        {
            public override Task<HttpResponseMessage> InvokeActionAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
            {
                var responseMessage = base.InvokeActionAsync(actionContext, cancellationToken);
    
                if (responseMessage.Exception != null)
                {
                    var baseException = responseMessage.Exception.InnerExceptions[0];
    
                    var result = new EWorkResultInfo<object>
                    {
                        Message = baseException.Message, //"服务器内部错误",
                        Code = 10001,
                        Entity = responseMessage.Exception
                    };
    
                    if (baseException is TimeoutException)
                    {
                        result.Code = 10004;
                        //result.Message = "任务超时";
                    }
    
                    return Task.Run(() => new HttpResponseMessage()
                    {
                        Content = new ObjectContent(typeof(EWorkResultInfo<object>), result, GlobalConfiguration.Configuration.Formatters.JsonFormatter)
                    }, cancellationToken);
                }
                return responseMessage;
            }
        } 
    }

    webapi.config

    public static class WebApiConfig
        {
            /// <summary>
            /// 
            /// </summary>
            /// <param name="config"></param>
            public static void Register(HttpConfiguration config)
            {
                // Web API configuration and services
                config.Filters.Add(new EWorkAuthorize());
                config.Filters.Add(new ModelValidationFilterAttribute());
                config.Services.Replace(typeof(IHttpActionInvoker), new CustomApiControllerActionInvoker());  
                config.Services.Replace(typeof(IHttpControllerSelector), new HttpNotFoundDefaultHttpControllerSelector(config));
                config.Services.Replace(typeof(IHttpActionSelector), new HttpNotFoundControllerActionSelector());
    
                // Web API routes
                config.MapHttpAttributeRoutes();
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{action}"//,//{id}
                    //defaults: new { id = RouteParameter.Optional }
                );
    
                var xmlFormatter = config.Formatters.FirstOrDefault(m => m is XmlMediaTypeFormatter);
                config.Formatters.Remove(xmlFormatter);
    
                config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                //config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
                config.Formatters.JsonFormatter.SerializerSettings.DateFormatString = "yyyy-MM-dd hh:mm";
                
            }
        }

    global注册

    GlobalConfiguration.Configure(WebApiConfig.Register);
  • 相关阅读:
    小X的密码破译
    小X的加法难题
    足球联赛
    机器分配
    化装晚会
    Soundex编码
    迷之阶梯
    使用JMeter做压力测试
    SCOI 2010 序列操作
    动态求区间K大值(权值线段树)
  • 原文地址:https://www.cnblogs.com/kingCpp/p/4651154.html
Copyright © 2011-2022 走看看