基於Oracle的EntityFramework的WEBAPI2的實現(三)—— 建立APIController及設置返回類型JSON、XML等


建立普通的ApiControler

右擊項目中的controller文件夾·添加·控制器·包含操作的webapi2控制器(使用entity framework),寫個名字,如果:Test。然后選擇類,就是我們剛剛從數據庫映射過來的類,然后選擇我們之前設置的連接字符串名稱(我前面提到最好以Db開頭,Con結尾的那個東西),點確定,然后會發現controller文件夾中多出了一個類TestContoller。

打開TestController.cs,看見里面幫助我們生成了GET,PUT,POST等方法。運行項目,發現已經可以請求到這個項目的GET方法了(我們可以在數據庫里面手動加幾條數據,我們就會看見返回數據了,正常 情況下,返回的是200我就認為是正確的請求)。

使用Area

前面我們是在默認的Controller中建立的ApiController,但是,我們的項目一般是復雜類型的,不可將所有的東西放在一個文件夾中,所以,我們要使用Area(區域)。右擊項目中的Area文件夾,添加·區域,起個名字,然后確定。就會發現,在Area目錄中多了那個我們的文件夾(假如名字叫TArea)。目錄結構如圖:

 

image

其實相當於我們又建立了一個子項目。但是有地方需要我們進行修改,就是路由,原因有如下幾點:

  1. 路由可能會請求不到我們自定義的區域。
  2. 我區域中的控制器的命名空間和類名可能會和外部的控制器重復,導致路由找到兩個。

那么我們就要做如下幾點:

  1. 修改WEBAPI主路由設置類,將WebApiConfig.cs中的路由加上Area這個項。
  2. 修改Area下我們的區域內的AdminAreaRegistration.cs這個文件的內容。

個性WEBAPI主路由設置

代碼如下:

public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服務
            config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
            config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
            config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
            // Web API 路由
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                 name: "DefaultAreaApi",
                 routeTemplate: "Api/{area}/{controller}/{id}",
                 defaults: new { id = RouteParameter.Optional }
             );
            config.Filters.Add(new WebApi.Filters.ExceptionHandlingAttribute());
        }

config.Formatters的三條語句,其實就是在這一步順便加上的,因為文章沒必須再開一個區域寫這段代碼。config.Formatters是用來設置轉換器的,一旦加上了text/plain和application/json等(默認xml已經有了),就可以根據用戶請求時的content-type來返回與其一樣的格式的內容。如,用戶請求時content-type寫的是application/json,數據也是application/json格式的,那么得到的返回的值也會是application/json格式。xml和text/html相同的原理。當然,如果用戶在Accept頭中強寫了application/json等指定類型,那么不管用戶請求的數據是什么格式以及content-type是如何設置的,asp.net都會根據Accept中的格式進行序列化返回結果給用戶。我們加上上面那三句,純是為了增加對json以及純文件的支持。

routeTemplate是路由模板的設置,其中Api這個單詞可以由我們自己定義,那么在以后,我們請求api的時候,就需要在域名后加上這個自定義的字符,來告訴ASP.NET我們要請求的是API,而不是正常的頁面 或者 mvc的普通controller。我們會發現,這里和模板和mvc的模板不一樣,因為這里少了{Action}。mvc一般會在{controller}后面跟{action},而這里沒有,原因是我們的Action是Get、Post、Put、Delete等Http的Method方法,ASP.NET是直接根據HTTP請求的METHOD內容進行判斷是要調用哪個Action的,因此這里根本沒有{action}(也不能有啊,大哥)。{id}就不會說了,因為我們使用了EF,所以Id就代碼我們的主鍵,在Put(修改)和Get(根據ID)取數據時是有用的。Defaults中的設置意思是id是可選的,也就是說,可以不填寫,即Url中可以不存在這個id。

修改Area下我們的區域內的AdminAreaRegistration.cs

現在,我們需要讓我們的Area向主模塊中注冊,其它這個注冊操作是通過AdminAreaRegistration.cs來進行的,而vs本身也為我們自動生成了,但是,還是有地方是需要修改的,不然,會出現一些問題。修改后的代碼如下:

public class AdminAreaRegistration : AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "Admin";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context) 
        {
            string[] str = new string[]
            {
                "WebApi.Areas.Admin.Controllers"
            };
            context.MapRoute(
                "Admin_default",
                "Api/Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                str
            );
        }
    }

我們繼承了AreaRegistration這個父類,然后重寫了AreaName這個方法 ,這個方法是主路由用來取我們這個區域的{Area}的(不知道{Area}干什么的請看上一小節的路由部分)。一旦總路由找到了對應的Area是我們的這個,就會把請求轉到我們這個Area里面,由我們的Area路由進行處理。如果匹配到了對應的Controller和Action,那么就會調用這個Controller和Action進行處理。但是,需要注意的是,雖然我們區域中的ApiController在我們的區域文件夾中,但是,一旦編譯成功,在DLL才不會分文件夾呢,所以,在其它的地方也有可能存在被找到的ApiController,這個會導致異常(如果找到兩個的話)以及危險(沒找到自己的反而找到別的地方的了)。這時,我們需要用命名空間來限定,這就是那個str數組變量的作用,它的內容是幾個(一般是一個)命名空間,然后放到context.MapRoute中去。下次,這個區域的路由就到只在這幾個命名空間內尋找。其實還有一個作用,就是你的ApiController在另一外項目或者DLL中,使用這個方法,完全可以將那些在外部的ApiController引用到這里被你的區域調用,是不是很爽?

調試一下,看一下能否請求到這個Area中的Controller吧,祝你成功。

轉載請注明作者與出處:張峻崎 博客園


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM