webapi訪問資料庫
Ⅰ WebApi 2 路由機制
.net中包含的路由有兩種,第一種是MVC模式的按url匹配action,第二種是WebApi模式的按http請求的方法匹配action,本文我們學習WebApi的路由模式。
首先新建一個WebApi項目,選擇ASP.NET Web應用程序(.NET Framework)
這里我們首先來看WebApi的基礎配置 WebApiConfig.cs ,其路徑為 /App_Start/WebApiConfig.cs
首先以瀏覽器啟動webapi項目
會發現頁面顯示403,這是很正常的,因為我們在新建項目的時候沒有加入MVC,所以沒有可視化的view頁面,不過我們卻拿到了這個項目的 埠號
為了更加方便直觀的看我們的介面請求,我們選擇postman,首先在項目新建一個 controller
通過以上的操作,我們就搭建好了一個webApi2的項目工程,後面我們就在這個工程的基礎上進行webApi 2的開發和學習。
webApi的路由過程主要經歷了如下三步
WebApiConfig.cs 這個文件是進行路由表的核心文件, WebApiConfig 裡面只有一個方法,這個方法在 Global.asax 文件里的 Application_Start() 方法被調用, Global.asax 文件是一個全局文件,當我們網頁啟動時就會去執行它。 Register(HttpConfiguration config) 方法是配置WEB API路由的。
因此 在webAP工程啟動的時候,會執行 Global.asax ,這個文件裡面注冊了 WebApiConfig.cs 的一系列初始化配置,從而實現了webapi。
WebApi 2 框架使用路由表。 並由Web API 的 Visual Studio 項目模板創建默認路由
轉到 MapHttpRoute 的定義,可以看到它有4個重載
分別來看看各個參數的作用
webApi2工程自動為我們創建了默認的路由
經過上面的講解,我們知道了匹配的URL是 api/{controller}/{id}
那麼我們在實際的請求中應該如何請求
新建一個 StudentsController
依次對以下地址進行請求
總結:
默認路由的缺點
如下
添加如下的方法(action)
得到了一下的結果
我們來看看這個請求是如何進行匹配的,首先找到 /App_Start/WebApiConfig.cs
按照路由模板來看,我們請求的路由沒有 action 名稱,那麼它是怎麼進行匹配的呢?
其實當我們訪問 http://localhost:65066/api/student 這個url的時候,webapi會自動去匹配 api/{controller}/{id} 這個模板,在這個路徑中,student是controller,那麼它又是怎麼去找到 getStudentName 這個action的呢?明明我們都沒有傳action這個參數,其實Webapi的路由規則是通過http方法去匹配對應的action,我們請求這個地址是用的 GET 方法,那麼webapi會找Order這個控制器裡面的get請求的方法,同事我們的這個 getStudentName 是以 get 開頭的,它符合了webapi的匹配規則,於是就請求成功了,但前提是你寫的方法必須是以get開頭的,如果當前這個controller一個get開頭的都沒有,那麼就顯示 請求的資源不支持 http 方法「GET」 。
當然不以get開頭的前提是你必須加上 [HttpGet] 這個特性,webapi才知道你這個是get的請求方法,就能正確進行匹配。
然後我們再回到 /App_Start/WebApiConfig.cs ,看下裡面 MapHttpRoute 的各個參數的含義,首先轉到它的定義,發現它是 HttpRouteCollection 的擴展方法, MapHttpRoute 有4類重載
在 WebApiConfig.cs 裡面修改為如下的路由模板
介面請求如下
通過 action 的名稱來匹配很好理解,上面的 StudentName() 是方法名, webApi 會默認它就是 action 的名稱,如果你想要方法名和 action 的名稱不一致,你也可以自定義 action 的名稱,這個可以通過特性 ActionName 來實現,如下:
首先看路由模板
對於同請求類型,同請求參數的請求,會出現 不傳參數,找不到匹配的資源 或 傳了參數,但是找到了與該請求匹配的多個操作 的問題,如下所示
解決以上的辦法有兩種
如果要使用特性路由,首先在 WebApiConfig.cs 的 Register 方法裡面必須先啟用特性路由(一般情況下,當我們新建一個 WebApi 項目的時候,會自動在 Register 方法裡面加上這句話。)
特性路由的目的是為了解決我們公共路由模板引擎解決不了的問題。一個action定義了特性路由之後,就能通過特性路由上面的路由規則找到。
只要出現了特性路由,匹配的規則是按特性路由來的
修改studentController如下
參考
參考
路由前綴的一般的做法是在控制器上面使用特性 [RoutePrefix] 來標識。
但是需要注意路由前綴不能以 / 開頭
Ⅱ MVC WebApi在調試開發下訪問正常,部署到伺服器訪問不到介面
1、伺服器是否正常啟動(查看日誌)
2、伺服器的IP+PORT是否可以訪問,查看埠是否被佔用
3、若服務正常啟動,埠也可以訪問,查看你的訪問路徑是否正確(部署後的上下文webcontent是否與調試中一致)
4、訪問不到有很多原因,要看你面對的具體問題去排查,比如報錯信息之類~