• web api control注册及重写DefaultHttpControllerSelector、ApiControllerActionSelector、ApiControllerActionInvoker(转)


    出处:http://www.cnblogs.com/kingCpp/p/4651154.html

    复制代码
    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);
  • 相关阅读:
    织梦开发——相关阅读likeart应用
    织梦标签教程
    织梦专题调用代码
    HIT 2543 Stone IV
    POJ 3680 Intervals
    HIT 2739 The Chinese Postman Problem
    POJ 1273 Drainage Ditches
    POJ 2455 Secret Milking Machine
    SPOJ 371 Boxes
    HIT 2715 Matrix3
  • 原文地址:https://www.cnblogs.com/smileberry/p/7093331.html
Copyright © 2020-2023  润新知