為 ASP.NET 4.0 Web Forms 專案加入 Web API

終究還是碰到了:在 .NET 4.0 的 Web Forms 專案中加入 Web API....

底下是我手動加入 ASP.NET Web API 至 ASP.NET 4.0 Web Forms 應用程式專案的步驟。

Step 1:加入組件參考

Tools \ Nuget Package Manager \ Package Manager Console,然後照下圖操作


圖中輸入的安裝指令是:

Install-Package Microsoft.AspNet.WebApi -Version 4.0.30506

上述指令也可以從 ASP.NET Web API 4.0.30506 的 Nuget 網頁獲得。

註:由於目標專案限定跑 .NET 4.0 環境,沒法跑 .NET 4.5(T_T),故無法安裝 Web API 2.x 的版本。

Web API 套件安裝完畢之後,我的專案增加了下列組件參考:
  1. Microsoft.Web.Infrastructure.dll
  2. Newtonsoft.Json.dll
  3. System.Net.Http.Formatting.dll
  4. System.Web.Http.dll
  5. System.Web.Http.WebHost.dll
另外,我還用了 WebApiContrib 和 NLog 套件,所以還要再加上 WebApiContrib.dll 和 NLog.dll。

Step 2:加入基礎設施

在專案根目錄下新建一個子目錄:App_Start,並在此目錄中加入一個新類別:WebApiConfig.cs。程式碼如下:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional }
            );

            // Make JSON the default response format for Web API.
            //var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
            //config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);

            var jsonFormatter = new JsonMediaTypeFormatter();
            //optional: set serializer settings here
            config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));

        }
    }

    public class JsonContentNegotiator : IContentNegotiator
    {
        private readonly JsonMediaTypeFormatter _jsonFormatter;

        public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
        {
            _jsonFormatter = formatter;
        }

        public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
        {
            //var logger = LogManager.GetLogger(GetType());       
            //logger.DebugFormat("request.Content.Headers.ContentType: {0}", request.Content.Headers.ContentType.MediaType);

            var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));

            return result;
        }
    }


然後修改 HttpApplication 的 Start 方法,也就是 Global.asax 中的 Start 方法,加入 WebApiConfig.Register 呼叫:


public class Global : System.Web.HttpApplication
{
    public void Start()
    {
        WebApiConfig.Register(System.Web.Http.GlobalConfiguration.Configuration);
        // 其他初始化程式碼.
    }
}


Step 3:加入 Web API Controller

在專案根目錄下新建子目錄:Controllers\Api。(放在 Api 子目錄下只是個人習慣,你也可以放在 Controllers 目錄下)

在 Api 目錄上點右鍵,Add \ New Item。然後看圖操作:


註:圖中選  v2.1 的程式碼範本也可以。

此程式碼範本會加入一個 Web API Controller 類別,而且已經提供幾個預設的方法,如 Get。方便起見,就直接使用範本產生的程式碼來測試。

Step 4:跳過身分驗證

如果網站本身已經有限制必須驗證過身分的使用者才能存取網站資源,那麼對 Web API 的請求可能也會被擋下來。此時可在 web.config 中加入以下設定,直接放行所有對 /api 路徑的請求。

<configuration>
  ...其他區段...

  <location path="Api">
    <system.web>
      <authorization>
        <allow users="?"/>
      </authorization>
    </system.web>
  </location>
</configuration>

Step 5:測試

在 Visual Studio 中執行此應用程式,網址輸入 http://[BlahBlahBlah]/api/Test/Get。應該要能看到瀏覽器顯示如下結果(IE 可能不顯示,而是問你要開啟還是另存檔案):

["value1","value2"]


這樣就行了!
Copyright © 2012. Huan-Lin 學習筆記 - All Rights Reserved
Powered by Blogger
Template Design by Cool Blogger Tutorials
Published by Templates Doctor