在開發中,我使用json格式序列化,所以將默認的xml序列化移除
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // ... var json = config.Formatters.JsonFormatter; // 解決json序列化時的循環引用問題 json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; // 移除XML序列化器 config.Formatters.Remove(config.Formatters.XmlFormatter); } }
全局權限驗證過濾器
新建一個類繼承自AuthorizationFilterAttribute,它有一個虛方法OnAuthorization,在權限驗證的時候調用,重寫這個方法來驗證權限。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public class WebApiAuthAttribute : AuthorizationFilterAttribute { public override void OnAuthorization(HttpActionContext actionContext) { // 這是一個基本例子,使用的ASP.NET Forms 身份驗證 var context = HttpContext.Current; if (context.User.Identity.IsAuthenticated == false) { PreUnauthorized(actionContext); return; } } private void PreUnauthorized(HttpActionContext actionContext) { // 如果用戶沒有登錄,則返回一個通用的錯誤Model actionContext.Response = actionContext.Request.CreateResponse( HttpStatusCode.OK, new AjaxModel { StatusCode = AjaxStatusCode.Unauthorized, Message = "該操作需要用戶登錄" }); } }
最后只需要在WebApiConfig里面添加一個過濾器
config.Filters.Add(new WebApiAuthAttribute());
現在每一個請求都會驗證權限
全局異常過濾器
新建一個類繼承自ExceptionFilterAttribute,同樣有一個虛方法OnException,重寫這個方法來處理異常。
public override void OnException(HttpActionExecutedContext actionExecutedContext) { Logger.Error(actionExecutedContext.Exception); actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse( HttpStatusCode.OK, new AjaxModel { StatusCode = AjaxStatusCode.InternalServerError, Message = actionExecutedContext.Exception.Message }); }
最后只需要在WebApiConfig里面添加一個過濾器
config.Filters.Add(new WebApiErrorHandleAttribute());
