程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 如何改寫WebApi部分默認規則,改寫webapi規則

如何改寫WebApi部分默認規則,改寫webapi規則

編輯:C#入門知識

如何改寫WebApi部分默認規則,改寫webapi規則


為什麼要改

最近公司在推廣SOA框架,第一次正經接觸這種技術(之前也有但還是忽略掉吧),感覺挺好,就想自己也折騰一下,實現一個簡單的SOA框架

用過mvc進行開發,印象之中WebApi和Mvc好像是一樣的,帶著這樣的預設開始玩WebApi,然後被虐得找不到著北。

被虐的原因,是Mvc和WebApi在細節上差別還是有點大,例如:

這是這兩種技術我知道的最大的差別,其他的沒發現或者說是沒注意,也有可能這些差別是因為我不會用,畢竟接觸WebApi時間不長。如果我有些地方說錯了,請指正。

就這兩個不同點,我查了很多資料,也沒有辦法解決,第一個還好,加個特性就行了,第二個的話好像就算加了[FromBody]也還是不行,感覺就是一堆限制。接著,既然這麼多讓我不爽的地方,那我就來改造它吧。

改造的目標,有以下幾個:

定下了目標之後,感覺微軟為什麼要這樣設計WebApi呢,或許它有它的道理。

目標好定,做起來真是頭大,一開始想參考公司的SOA框架的實現,但因為我用了OWIN技術來進行宿主,而看了公司的框架好像不是用的這個,總之就是看了半天沒看懂應該從哪個地方開始,反而是越看越糊,畢竟不是完全一樣的技術,所以還是自己弄吧。

OK,廢話了這麼多,進入正題吧。首先來一個鏈接,沒了這個文章我就不可能改造成功:http://www.cnblogs.com/beginor/archive/2012/03/22/2411496.html

OWIN宿主

其實這個網上很多,我主要是為了貼代碼,不然的話下面幾小節寫不下去

省略了部分不太重要的代碼,Services.Add和Replace從字面就能明白是什麼意思,但我沒有試過是否必須要像上面那樣寫才行

對控制器的限制

這個其實比較簡單,測試中WebApi好像沒調用GetControllerMapping方法,直接調用了SelectController方法,最後一個方法中有兩個Get方法調用,Get只是把從字典獲取值的TryGetValue功能給封裝了一下,InitControllers方法是從當前所有的程序集中找繼承了ApiController的類,找到之後緩存起來。這段代碼整體比較簡單。

對Action的限制

GetActionMapping方法很簡單,從控制器類型中找到所有的Action方法並返回

SelectAction方法相對復雜,其實就是第二個目標的邏輯,代碼看起來比較多其實並有很難的地方。

對Action的參數的限制

這一塊比較難,我試了很久才成功,而且還有坑

這個類其實就是把.Net的默認實現給改了一點點,也就是從第17行到第20行,現在的判斷邏輯是如果參數的類型為基礎類型的話,則從Url或Form表單中獲取,而這個邏輯是寫在MyValueProviderFactory中的,ValueProviderAttribute是.Net自帶的。其他並沒有改動,怕是也改不動吧,因為一時間看不懂這些代碼是什麼意思。

這個很簡單,略過。

核心是GetValue方法,首先從查詢字符串中取值,若沒有則判斷是否有緩存,若沒有的話再一次判斷Body中是否表單參數,是的話就直接讀取。這個地方其實一開始並沒有想用緩存,但如果不用的話就會出現一個問題,如果一個Action有多個參數,那麼就掛了。

原因在於:

接下來的邏輯其實都簡單了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved