匯出ASP.NET Web API公開API方法至PostMan Collections

關於PostMan

PostMan - REST Client

PostMan是我在《ASP.NET MVC 4網站開發美學》第七章ASP.NET Web API裡介紹的兩個工具之一,它可以快速進行Web API的測試,不管是HTTP GET/POST/PUT/DELETE/PATCH…等方法或檔案上傳等都難不到它。但我們在測試Web API方法的過程裡,經常會發生一種不必要的錯誤,那就是打錯字或選錯HTTP動詞,明明就是”api/files“,老是打成”/files“,不然就是忘了改測試的HTTP動詞,這時就可以利用PostMan的Collections功能來預防與管理。

ASP.NET Web API的HTTP PATCH動詞與Patch方法實作

HTTP PATCH動詞與Patch方法

在ASP.NET Web API裡我們會利用HTTP PUT動詞與PUT方法來進行資料異動,不過PUT方法的異動是全部物件的異動,如果我們把部分資料傳入PUT方法進行異動,會產生一個非常驚訝的結果,就是其他沒有傳入的資料會全部被清除為空。正確的方法應該是使用HTTP PATCH動詞與Patch方法來進行部分資料的更新。

ASP.NET Web API HTTP PATCH方法實作

在《ASP.NET MVC 4網站開發美學》第7-52頁裡也有提到HTTP PATCH方法,書中未附上完整實作,以下提供實作內容:

ASP.NET Web API - Entity Framework(EDMX) Navigation Property引發的JSON物件循環參考錯誤

Entity Framework(EDMX) Navigation Property

上圖是一個ASP.NET Web API專案,從範例Northwind資料庫裡加入兩張有關連性的資料表到Entity Framework(EDMX)裡,很正常的,它會加入巡覽屬性(Navigation Property),當我們什麼都不修改,直接加入API Controller,例如,ProcutsController和OrderDetailsController然後建置、啟動、測試Web API服務會立即得到一個錯誤。

JSON的錯誤訊息與產生原因

完整訊息如下

小心,不要被Google Chrome偷偷吃掉你的記憶體

Google Chrome的快是要付出代價

Google Chrome 19記憶體使用情況

這是開啟Google Chrome 25,預設只連上blog.kkbruce.net所使用的記憶體情況,一開啟就吃了496.4 MB的記憶體(Firefox 19是161.3 MB,IE 10是138.5 MB。)。可以看得出來,Google Chrome的快是用你電腦的記憶體換來的,好或壞,這看個人。

為何說偷偷吃掉記憶體

先看第二張圖:

Google Chrome 19記憶體使用情況2

ASP.NET MVC 3-4無法新增Controller

問題的來龍去脈

Visual Studio 2012在安裝【Web Tools 2012.2】正式版更新之後,ASP.NET MVC 3與ASP.NET MVC 4(C#與VB.NET)專案,如果使用【Database first + Entity Framework】會無法新增MVC Controller與API Controller。

Database first示意圖

  1. 新增範例資料庫
    新增Northwind範例資料庫
  2. 新增Entity Framework實體資料模型(EDMX)
    新增Entity Framework實體資料模型(EDMX)

新增MVC / API Controller之英文版錯誤訊息:

新增MVC / API Controller之英文版錯誤訊息
'ProjectName.ClassName' is not part of the specified 'ProjectName.???Entities' class, and the 'ProjectName.???Entities' class could not be modifed to add a 'DbSet<ProjectName.ClassName>' property to it.(For example, the 'ProjectName.???Entities' class might be in a compiled assembly.)

新增MVC / API Controller之中文版錯誤訊息:

新增MVC / API Controller之中文版錯誤訊息
'ProjectName.ClassName'不是指定之'ProjectName.???Entities'類別的一部分,而且無法修改'ProjectName.???Entities'類別以新增'DbSet<ProjectName.ClassName>'屬性(例如,'ProjectName.???Entities'類別可能位於已編訪的組件中)