wcf web api支援多個宿主環境:自宿主(windows服務或者控制台)和iis宿主(asp.net webform/mvc)。這個入門文章主要演示在asp.net mvc3**宿主:
設定站點的埠號為9000
2、向解決方案中加入web api的引用
通過nuget來新增web api的程式集引用,右擊專案屬性,選擇manage nuget packages
在nuget管理擴充套件器上查詢online的webapi.all
3、建立乙個contacts api類
右擊專案contactmanager選擇新增乙個資料夾,取名apis,然後在apis資料夾上右擊新增類,類名叫做contactsapi:
using
system.servicemodel;
namespace
contactmanager.apis
}contractsapi 加了servicecontractattribute表示這是乙個wcf 服務,將通過http方式暴露出來。
4、通過asp.net routing註冊contractsapi api需要通過asp.net mvc宿主,使用asp.net route的mapserviceroute擴充套件方法把它註冊進去。切換到global.asax.cs檔案,新增以下引用
using
contactmanager.apis;
using
在registerroutes方法裡加入下述**
routes.mapserviceroute
<
contactsapi
>("
api/contacts");
下面的黃色部分很重要,mvc的預設路由是對映到controller + action
public
static
void
registerroutes(routecollection routes)
.axd/");
routes.mapserviceroute
<
contactsapi
>("
api/contacts");
routes.maproute(
"default",
//route name"//
", //url with parameters
new
//parameter defaults);}
mapserviceroute需要乙個泛型引數指定服務(api),以及乙個將被追加到iis base url的路徑。在這裡,我們指定的contacts,也就是宿主為http://localhost:9000/api/contacts。
5. 通過乙個http get 方法暴露contacts:首先建立乙個poco(plain old c#)contract類,代表我們在api上傳遞的聯絡人,本質上就是乙個dto(資料傳輸物件),在http上我們把它作為資源,然後建立乙個http get方法暴露資源。
右擊專案contactmanager專案選擇新增新的資料夾resources,在resources檔案下建立乙個新的類contact。
namespace
contactmanager.resources
public
string
name }}
返回到contactapi類,新增下述引用:
using
system.servicemodel.web;
using
contactmanager.resources;
新增乙個get方法返回所有的contracts
[webget(uritemplate =""
)]public
iqueryable
<
contact
>
get()
,new
contact ,
newcontact ,
newcontact ,
newcontact ,
newcontact
};return
contacts.asqueryable();
}get方法上加了webget attribute表示這是乙個http get。注意這裡的uritemplate被設定為,預設情況下,操作的uri是方法名get,在這種情況下,我們是在route中設定的uri。
6、通過瀏覽器查詢contracts.按f5執行專案,然後再瀏覽器位址列中輸入http://localhost:9000/api/contacts
7、查詢返回json格式的contracts。http提供了一些內容協商機制 — 當有多個可得的表現形式的時候,對特定的響應選擇最好的表現形式的處理過程。
伺服器驅動協商(server-driven negotiation)
如果響應的最好的表現形式的選擇是通過伺服器上的演算法來實現,那麼這種方式的協商稱做伺服器驅動協商。選擇是基於響應可得的表現形式(根據不同的維度,響應會不同;例如,語言,內容編碼,等等)和請求訊息裡特定的頭域或關於請求的其他資訊(如:網路客戶端的位址)。
伺服器驅動協商是有優點的,當從可行的表現形式裡進行選擇的演算法對使用者**進行描述是比較困難的時候,或者當伺服器期望傳送最好的猜測給客戶端而只通過乙個響應(以避免後續請求的迴路(乙個請求會返回乙個響應)延遲如果此最好的猜測對使用者適合的時候)的時候。為了改善伺服器的猜測,使用者**應該包含請求頭域(accept,accept-language,accept-encoding,等等),這些頭域能描述它對響應的喜好。
web api返回的響應很容易新增一種**型別(media types )。
按下 exectue按鈕,雙擊左邊的panel檢視http的response,切換到rawtab,你可以看到下面的json格式的資料:
8、啟用odata 查詢支援
web api支援odata協議,接受odata的uri格式查詢,當odata 查詢到達web api, 在返回客戶端之前在服務端會進行必要的過濾和排序。查詢使用iqueryable 介面,服務端並沒有去查詢所有的資料,傳送過濾和排序到服務端。
return
contacts.asqueryable();
執行程式,在瀏覽器裡輸入 http://localhost:9000/api/contacts?$top=4&$orderby=name ,看到瀏覽器之返回了按名字排序的top 4個contract
也可以通過fidder去查詢,具體可參照第7步。
總結
通過這個quick start,我們學習到了以下內容
教你 4 步搭建彈性可擴充套件的 WebAPI
作者 蕭起 阿里云云原生團隊 本文整理自 serverless 技術公開課 常見的 webapi 架構如上圖所示,主要包括客戶端 瀏覽器 伺服器 資料庫,webapi 由伺服器提供,同時伺服器要完成負載均衡 登入鑑權的相關操作。當客戶端流量快速增大時,伺服器端只能通過水平擴充套件加機器的方式來增加提...
教你 4 步搭建彈性可擴充套件的 WebAPI
作者 蕭起 阿里云云原生團隊 本文整理自 serverless 技術公開課 常見的 webapi 架構如上圖所示,主要包括客戶端 瀏覽器 伺服器 資料庫,webapi 由伺服器提供,同時伺服器要完成負載均衡 登入鑑權的相關操作。當客戶端流量快速增大時,伺服器端只能通過水平擴充套件加機器的方式來增加提...
一文教你如何構建動態鏈結庫
話說前一篇文章一文教你如何構建靜態鏈結庫向大家介紹了如何構建靜態庫,雖然解決了我們的一 煩,但靜態庫在使用中任然存在一些缺點。動態鏈結庫又叫共享庫 shared object 就可以解決以上問題。它其實是乙個目標模組,在執行或載入時,可以載入到任意的記憶體位址,並和正在執行在記憶體中的程式鏈結起來。...