顯示具有 MVC4 Book 標籤的文章。 顯示所有文章
顯示具有 MVC4 Book 標籤的文章。 顯示所有文章

NLog - 新版<target xsi:type="Database" />設置方式

NLog - 新版<target xsi:type="Database" />設置方式

ASP.NET MVC4網站開發美學出版後不久,NLog調整了<target>裡Database的設置方式,目前我在網路上看到所有NLog Database的設置,有99.9%都還是舊版範例,這裡提供新的組態設置方式給大家參考。

NLog - 舊版<target xsi:type="Database"設置方式

以下是舊版Database設置方式,也是你在網路上都可以查詢的到的組態:

 <target xsi:type="Database" name="database">
     <dbprovider>mssql</dbprovider>

     <!-- database connection parameters -->
     <!-- alternatively you could provide a single 'connectionstring' parameter -->

     <dbhost>.</dbhost>
     <dbdatabase>NLogDatabase</dbdatabase>
     <dbusername>nloguser</dbusername>
     <dbpassword>nlogpassword</dbpassword>

     <commandText>
         insert into NLog_Errro(time_stamp,level,logger,message) values(@time_stamp, @level, @logger, @message);
     </commandText>

     <parameter name="@time_stamp" layout="${date}" />
     <parameter name="@level" layout="${level}" />
     <parameter name="@logger" layout="${logger}" />
     <parameter name="@message" layout="${message}" />
 </target>  
 

使用Autofac和Unity學習MVC 4,5和Web API 1,2的IoC,DI技巧

IoC與DI

IoC
Inversion of control,中文稱控制反轉。由Martin Fowler提出。這裡引用MVP 91哥的說明:系統架構設計應該以抽象的邏輯概念為主,才能更貼近現實世界,才能更符合domain model,當Business logic不變時,需求變更、技術變更、DB變更,都應該要把風險和成本壓到最低。
DI
Dependency injection,中文稱相依注入。在IoC的思考模式與實作下,最終的結果就是相依於介面(Interface),但類別中最後只存有介面的話,程式是不會動的,這時我們就會利用DI技巧,在應用程式啟動時去注入介面所對應的實體(也就是一般我們在程式碼裡寫的new ClassName())。

MVC與Web API的Controller的IoC與DI處理

不管是在ASP.NET MVC或ASP.NET Web API,在Controller的概念上或本質上可以說是一模一樣。這裡主要差異點會是在DI套件的實作差異上。

Controller使用Respository Pattern處理資料實體相依

一般我們會透過基架(MVC 5將scaffold翻譯為基架)來產生MVC的Controller與View Page,或是Web API的API Controller。例如,使用Northwind資料庫的Product資料表來產生API Controller會是這樣:

  public class ProductsController : ApiController
  {
      private NorthwindEntities db = new NorthwindEntities();

      // GET api/Products
      public IEnumerable<Product> GetProducts()
      {
          return db.Products.AsEnumerable();
      }

      // 省略
  }
  

預設範本所產生的程式碼會產生與NorthwindEntities資料實體(new NorthwindEntities())產生依賴關係。每個API Controller都還要處理db.Products,這造成API Controller的職責不夠單一,這在裡我們就先採用Repository Pattern 1來分離資料庫處理程式碼與API Controller的相依關係。

1 Repository Pattern實作請參考《ASP.NET MVC 4網站開發美學》第七章 Page 7-40頁。

  public class ProductsController : ApiController
  {
      //private NorthwindEntities db = new NorthwindEntities();

      private IProductRepository _product;

      public ProductsController() {
          _product = new ProductRepository();
      }

      // 重要,但要等一下才會知道
      public ProductsController(IProductRepository r)
      {
          _product = r;
      }

      // GET api/Products
      public IEnumerable<Product> GetProducts()
      {
          return _product.GetAll();
      }

      // 省略
  } 
  

透過Repository Patter我們分離了資料庫相關程式碼,而且我們偷偷留下一個含介面參數的建構函式,等一下在討論這部分。就目前使用了Repository Pattern的Controller,就算刪除此含介面參數的建構函式,程式依然會正常運作。

但引入使用Repository Pattern後的API Controller產生了新的問題,這些API Controller又會與特定實體類別產生相依關係,我們必須在無參數建構函式去初始化一個實體類別,以呼叫分離後的資料庫處理程式(例如:_product = new ProductRepository();)。

提升ASP.NET MVC專案安全性與效能小技巧

ASP.NET MVC專案最佳化

在討論ASP.NET MVC時,大多是針對MVC模式與MVC應用程式在討論,較少看到有人討論ASP.NET MVC專案本身,其實ASP.NET MVC專案有幾個地方可以微調整,有些可以增加安全性,有些可以增加效能。

取消Header輸出MVC專案版本

預設的ASP.NET MVC專案在一次回應請求的標頭裡包含著些ASP.NET MVC專案的版本,以 http://kkbruce.tw 為例,預設情況下的回應標頭(Response Header)為:

HTTP/1.1 200 OK
Cache-Control: public, max-age=3600
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Sat, 27 Jul 2013 17:49:36 GMT
Last-Modified: Sat, 27 Jul 2013 16:49:36 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/8.0
X-AspNetMvc-Version: 4.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RTpcUHJvamVjdHNca2ticnVjZS50d1xra2JydWNlLnR3XEJvb3RzdHJhcFxHZXR0aW5nU3RhcnRlZA==?=
X-Powered-By: ASP.NET
Date: Sat, 27 Jul 2013 16:49:39 GMT
Content-Length: 7699
  

由回應標頭(Response Header)中可以看出目前此網站的ASP.NET MVC 4的專案,如果某個版本ASP.NET MVC專案某一天爆發漏洞,那麼要找下手的目標是很容易的。

所有一個簡單的需求,不管我們的ASP.NET MVC專案是什麼版本,MVC 2/3/4/5…都不要在回應標頭(Response Header)顯示ASP.NET MVC專案版本,其實也很容易,只需要在 Global.asax 的 Application_Start() 透過以下設置:

MVC 4發行至IIS 7.5之後Bundle功能無法運作

MVC 4 - Bundling and Minification

Bundling and Minification 在書中 5.6 小節我翻譯為「合併與最小化」,這是一個對於網站而言非常非常非常實用的功能,它能快速合併你所有設置的所有檔案成為一個檔案(多合一)併進行最小化的工作,重點是完全自動化,不需要再去其他類似JavaScript最小化、CSS最小化的網站,或下載工具利用工具在上線前再自己手動進行類似工作。各位可以參考前端優化的幾篇文章。

IIS 7.5無法運作Bundle功能?

當 Visual Studio 2012 發行 ASP.NET MVC 4 專案至 Windows Server 2008 R2 x64 平台(IIS 7.5)後發現 Bundle 功能無法運作。利用程式碼 BundleTable.EnableOptimizations = True 進行設置依然無效。

在網路上搜尋了一陣子,找不到什麼有關的資料,絕大部分都是討論 Bundle 的設置或 BundleTable.EnableOptimizations 程式不然就是 web.cofnig 裡 debug="true" 這個參數。

然後又花費無數青春,在一陣發瘋似亂搞亂測之後,找到了問題的根源。

發行ASP.NET MVC 4之前遠端Windows Server 2008 R2的環境準備

可被佈署的伺服器環境

ASP.NET MVC 的書籍在教發行時,通常都是以本機為實作環境,本機通常會安裝 Visual Studio 開發工具,在安裝 Visual Studio 開發工具時會一併安裝 Deploy 的工具與環境,所以本機實作比較沒問題。但實作發行至遠端伺服器時,怎麼樣就是不給發行,這是因為除了帳號密碼外,伺服器還需要可被佈署的環境。有了可被佈署的環境,我們就能如書中所教的一樣,將MVC專案順利發行至遠端伺服器。

Windows Server 2008 R2佈署環境準備

以下 Windows Server 2008 R2 為實作平台。

要確認是否具備佈署環境依以下清單檢查:

ASP.NET MVC裡Model使用ADO.NET來開發

MVC Model只能使用Entity Framework?

關於MVC裡的Model是否只能使用Entity Framework,答案是否定的。會這樣自問自答是因為有讀者問說,怎麼所有寫ASP.NET MVC的書都是用Entity Framework。MVC裡的Model根本不關心你用什麼技術,例如我們在書裡2.2節就例了一大堆的Model可用技術。在早期ASP.NET MVC 2的書,Model大概都是用LINQ to SQL,那個時候的讀者應該也是會問一樣的問題吧。時代會進步,技術也沒有停過,會選擇Entity Framework我是很單純,我是學習與推廣微軟技術的人,ORM技術對於範例程式碼有較好的可讀性,撰寫與偵錯速度也快,在非特別環境(或特別限制)下,就我而言,我是個懶人,我會選擇讓我可以最懶的技術。

twMVC#8 - ASP.NET Web API課後補充資料與專案範例檔

感謝twMVC的邀請

twMVC 第八場 ASP.NET Web API 課程,講師與工作人員合照

首先,感謝twMVC邀請,讓我有機會和大家分享ASP.NET Web API此一主題,課程中有提到一些注意事項,有些內容在《ASP.NET MVC 4網站開發美學》沒交代清楚,整理成以下文章,以補充書中內容。

ASP.NET Web API上傳大檔案至Windows Azure Blob儲存體

學好Windows Azure必看的一本書

Windows Azure Platform應用程式開發教戰手札(第二版)
圖片來源:http://books.gotop.com.tw/v_ACL036700

首先,如果各位對Windows Azure不是很熟悉的話,我推薦小朱的《Windows Azure Platform應用程式開發教戰手札(第二版)》。

ASP.NET Web API介接服務

「介接服務」的意思是,在Web API裡,我們可以拿別人的服務來成為我的服務,Client只是使用者,他不需要知道細節。以「上傳檔案」而言,當Client上傳一個檔案,你可以儲存在本機,也就是進行File I/O的動作,你可以儲存在Database裡,也就是進行Database I/O動作。

在以下範例中,我們要在Web API裡去儲存檔案至Windows Azure的Blob儲存體中,也就是說,我們拿Windows Azure Storage服務來當成我們服務內容之一。

快速存取Web API的好幫手 - HttpClient類別

HttpClient類別範例補充

我們之前就介紹過HttpClient類別,在準備twMVC#8 Web API課程我又把範例改寫了一下,主要是進行ASP.NET Web API的服務存取及存取其他網路上Web API服務。

匯出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的錯誤訊息與產生原因

完整訊息如下

Web Tools 2012.2 Release for ASP.NET Web API

Web Tools 2012.2正式版

Web Tools 2012.2正式版進行了多項更新,這些更新不會影響原有專案內容,更新區分為兩部份,一是ASP.NET的更新,ASP.NET的更新包含WebForm與MVC,在MVC的更新中又以ASP.NET Web API提供更完整的功能。二是Visual Studio 2012開發工具功能的再提升。

ASP.NET Web API功能更新:

  1. OData
  2. Tracing
  3. API Help Page

Ch07 - ASP.NET Web API - Northwind範例T-SQL檔案

ASP.NET Web API - Northwind範例T-SQL檔案

首先跟大家拜個早年。今年過年前最高興的事,當然是年前有辦法將書送到各位讀者的手中。這幾天除了拜讀其他作者著作章節外,也自己進行了第五校,說真的,還是紙本好,看起來又快又順。雖然電子書是趨勢,但我願意背著800頁的大書到處跑。

本書有附有範例檔案,不過可能是出版社趕著在過年前把書印出來,目前在GOTOP網站上還沒有看到,ASP.NET Web API一章會同時有Visual Basic與C#的範例檔。在7-31頁裡,有一段需要匯入Northwind-Table.sql,以執行建立範例所需的Northwind資料庫,此T-SQL是我改寫過的,這樣在SqlLocalDB中執行才不會出錯。原本是要上傳完整ASP.NET Web API範例檔,家鄉宜蘭這邊網路情況不佳(7-11),只好先上傳Northwind-Table.sql這一支檔案,讓讀者可以按書中內容接下去實作。

ASP.NET MVC 4網站開發美學 - 目錄與預購

目錄

以下為《ASP.NET MVC 4網站開發美學》全書目錄,本書共11章792頁。以下是非常長的一串目錄,可以讓讀者先瞭解將會閱讀到什麼的主題與內容。

ASP.NET MVC 4網站開發美學 - 前言與預購

前言

本書命名為《網站開發美學》,是因為開發ASP.NET MVC網站讓我們覺得好美。

ASP.NET MVC 4網站開發美學 - 導讀與預購

導讀

ASP.NET MVC 由2007 年開始發展至今,我們看到MVC 開發模式逐漸地 成熟,並且一步一步成為網頁開發的主流。在ASP.NET MVC 4.0 這個版本裡, 我們看到了許多令人驚喜的魔法,簡單、快速、強大又充滿彈性,更重要的是, 當開發人員掌握了MVC 開發精髓,便能用更少的時間做更多的事。

Web Optimization Framework 1.1.0-alpha1新功能預覽

ASP.NET MVC 4 - 合併與最佳化(bundling and minification)補充資料

合併與最佳化 - 1.1.0 Alpha 1

在ASP.NET MVC 4網站開發美學第5.6小節談到【合併與最佳化】這個主題,內容中討論的相關功能就是由【System.Web.Optimization.dll】所提供,以前必須由擴充套件來達到的功能,現在都由ASP.NET MVC 4內建的System.Web.Optimization.dll提供,我查了一下書中的截圖,在Visual Studio 2010 RTM版本內版本為1.0.0-beta2,應該是安裝了Visual Studio 2012 Update 1,所以目前開啟的專案已內已經是版本1.0.0。以下會補充一些書藉沒有的內容,共有二篇補充資料,此為第一篇,第二篇會討論Microsoft ASP.NET Web Optimization Framework 1.1.0-alpha1這個下一版本又會提供那些新功能。

啟用合併與最佳化的影響

http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification提供了一分資料,有使用B/M與沒有使用B/M的差異:

項目 使用B/M 未用B/M 改善
檔案請求 9 34 256%
KB傳送 3.26 11.92 266%
KB接收 388.51 530 36%
載入時間 510 MS 780 MS 53%

ASP.NET MVC 4網站開發美學 - 我們如何合作?

北中南Microsoft MVP大合作

ASP.NET MVC 4網站開發美學-封面

這是我人生第一本合著,想多留點回憶,宣傳文會多一些,請各位見諒。

第一次寫作就是以合作方式進行,這讓我非常高興,我是應Demo的邀請,知道作者群之後,有點嚇一跳,因為是一次北、中、南三地Microsoft MVP大合作,怎麼溝通與討論,這很好玩。

ASP.NET MVC 4大綱討論

在網路的時代,當然是用網路來解決。

書藉的大綱討論絕大部分都是在Demo所提供的一套http://www.mindomo.com/工具裡完成,一般不管是XMind之類的工具,都是離線式的應用工具,不合適協同作業,Mindomo是線上工具,這讓我們在不同地點也能清楚整個架構,直接的討論、回應、修改。

除了線上,另一個重點是,像我用XMind,雖然它有發佈至線上的功能,但都是發佈之後的資料都是公開的,像我們這種團隊合作的資料是需要隱私且不公開的,而且還要能邊討論邊修改,這部份Mindomo都是上上之選。

最重要是感謝Demo的付費,讓所有作者有一個好的討論空間。(Mindomo免費與付費功能差異不在此文討論。)

ASP.NET MVC 4大綱 for Mindomo