1.WebApi的Filter介紹:
大家知道什麼是AOP(aspect oriented programming)嗎?它是可以通過預編譯方式和運作期動态代理實作在不修改源代碼的情況下給程式動态統一添加功能的一種技術。它是一種新的方法論,它是對傳統OOP(object oriented programming)程式設計的一種補充。OOP是關注将需求功能劃分為不同的并且相對獨立,封裝良好的類,并讓它們有着屬于自己的行為,依靠繼承和多态等來定義彼此的關系;AOP是希望能夠将通用需求功能從不相關的類當中分離出來,能夠使得很多類共享一個行為,一旦發生變化,不必修改很多類,而隻需要修改這個行為即可。AOP是使用切面(aspect)将橫切關注點子產品化,OOP是使用類将狀态和行為子產品化。在OOP的世界中,程式都是通過類和接口組織的,使用它們實作程式的核心業務邏輯是十分合适。但是對于實作橫切關注點(跨越應用程式多個子產品的功能需求)則十分吃力,比如日志記錄,權限驗證,異常攔截等。而Filter恰好展現的AOP思想(也可以說是一夫當關萬夫莫開了)。
2.Filter的功能主要有:
(1)驗證使用者是否登入,如果使用者沒有登入,系統直接跳轉到登入頁面。
(2)權限控制。
(3)記錄日志。
(4)異常處理。
3.Filer權限控制實作:
項目結構如圖
(1)建立一個webapi項目并添加控制器
public class LoginController : ApiController
{
[HttpGet]
public string ToLogin(string username)
{
return username+",你好登入成功!";
}
}
View Code
(2)添加MyAuthorFilter類
public class MyAuthorFilter : IAuthorizationFilter
{
public bool AllowMultiple
{
//get { throw new NotImplementedException(); }
get { return true; }
}
public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
IEnumerable<string> values;
if (actionContext.Request.Headers.TryGetValues("UserName", out values))
{
string userName = values.FirstOrDefault();
if (userName != "ych")
{
return new
HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
}
}
else
{
return new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
}
return await continuation();
}
}
(3)設定路由保證被注冊
public static void Register(HttpConfiguration config)
{
// Web API 配置和服務
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Filters.Add(new MyAuthorFilter());
}
請求結果:
4.Filer異常處理實作:
public class LoginController : ApiController
{
[HttpGet]
public string ToLogin(string username)
{
throw new Exception("抛異常," + username);
}
}
(2)添加MyExceptionFilter類
public class MyExceptionFilter : IExceptionFilter
{
//public bool AllowMultiple=>true;
public bool AllowMultiple
{
get { return true; }
}
public async Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
{
Exception ex = actionExecutedContext.Exception;
}
}
public static void Register(HttpConfiguration config)
{
// Web API 配置和服務
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Filters.Add(new MyExceptionFilter());
}
(4)用postman請求(http://localhost:43417/api/Login/tologin?username=qq)如圖
這樣就講完了,你可以自己将異常什麼的記錄日志哦,活學活用才是硬道理!