﻿# ASP.NET MVC 開發心得分享 (10)：隱藏 MVC 版本編號

在預設的情況下，利用 ASP.NET MVC 技術製作的網站會在 HTTP 回應標頭(Response Header)中包含您目前使用的 ASP.NET MVC 版本編號，雖然目前也只有一版 ( ASP.NET MVC 1.0 ) 沒什麼好隱藏的，不過若基於資安考量希望能隱藏 ASP.NET MVC 送出的版本編號時，就可以利用本篇講的這個小技巧。

![在預設的情況下，利用 ASP.NET MVC 技術製作的網站會在 HTTP Response Header 中包含您目前使用的 ASP.NET MVC 版本編號](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/3197ddc3b0a5a2ce8c2f-image.png "在預設的情況下，利用 ASP.NET MVC 技術製作的網站會在 HTTP Response Header 中包含您目前使用的 ASP.NET MVC 版本編號")

由於 ASP.NET 3.5 提供的 Routing Module 在網址結構的設定十分彈性，也因此 ASP.NET MVC 在規劃網址結構時甚至可以讓使用者完全看不出來這是用 ASP.NET MVC 開發的網站，這時若隱藏 ASP.NET MVC 的版本編號也能讓多隱藏一些採用技術的細節。

這個技巧十分簡單，只要在 **Global.asax.cs** 檔案的 Application\_Start() 事件方法中加上一行即可：

```csharp
        protected void Application_Start()
        {
            // 加上此行可隱藏 ASP.NET MVC 版本資訊在 HTTP Header 中出現
            MvcHandler.DisableMvcResponseHeader = true;

            RegisterRoutes(RouteTable.Routes);
        }
```

就這麼簡單。 ^\_^

不過光是這樣實在不夠好玩，我們還可以**自訂 HTTP 回應標頭**的名稱，你想改成什麼都行，如下圖示。

![MvcHandler.MvcVersionHeaderName ](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/eccdc8b6d4e9c6b67fb9-image.png "MvcHandler.MvcVersionHeaderName ")

不過 **MvcHandler.MvcVersionHeaderName** 被定義成 **靜態唯讀欄位 ( static + readonly )**，以致於不能直接修改這個欄位(Field )的內容，必須利用 [System.Reflection](http://msdn.microsoft.com/zh-tw/library/system.reflection.aspx) 機制才能強迫修改這個欄位的內容，如下程式範例：

```
typeof(MvcHandler)    .GetField("MvcVersionHeaderName")    .SetValue(MvcHandler.MvcVersionHeaderName, "X-TheWillWillWeb-Version");
```

以上範例純粹好玩，多學點 [Reflection](http://msdn.microsoft.com/zh-tw/library/system.reflection.aspx) 也是不錯的，抽空研究一下吧。
