[Web API][筆記]在WebForm裡面建立Web API程式

最近小喵學著 Web API ,大部分的書籍或者網站,都是教使用 ASP.NET MVC 的專案來設計,也順利的完成了一些書上的範例練習。不過 MVC 小喵還是初學,所以之前開發的系統大部分是WebForm的系統,小喵就心想,如果是要應用在之前開發的系統中,不知道是否可行呢? 於是小喵開始搜尋一下,看看是否能夠在WebForm的專案中使用Web API,找到不少的資料,不過大部分是C#。小喵用VB.NET來練習一回,順便紀錄一下~

緣起

最近小喵學著 Web API ,大部分的書籍或者網站,都是教使用 ASP.NET MVC 的專案來設計,也順利的完成了一些書上的範例練習。不過 MVC 小喵還是初學,所以之前開發的系統大部分是WebForm的系統,小喵就心想,如果是要應用在之前開發的系統中,不知道是否可行呢? 於是小喵開始搜尋一下,看看是否能夠在WebForm的專案中使用Web API,找到不少的資料,不過大部分是C#。小喵用VB.NET來練習一回,順便紀錄一下~

 

建立Controller

首先新增一個空的WebForm網站專案來測試

001

 

在網站專案上按右鍵→加入→加入新項目

002

 

選擇【Web API控制器類別】

其中控制器類別名稱,務必是您的【控制器名】+ 【Controller】,Controller後面的數字務必要去掉

003

 

接著會出現一個提示,說明建議您把這個類別存放在App_Code這個資料夾中,選擇【是(Y)】

004

 

此時會建立出App_Code的資料夾,將您的 Controller 城市產生在裡面,順便產生Bin的資料夾,將相關會用到的dll自動幫您加入在其中

005

而這Controller產生的程式碼,與在MVC專案中產生的空白具有讀寫的WebAPI的相關程式碼相同如下


Imports System.Net
Imports System.Web.Http

Public Class ValuesController
    Inherits ApiController

    ' GET api/<controller>
    Public Function GetValues() As IEnumerable(Of String)
        Return New String() {"value1", "value2"}
    End Function

    ' GET api/<controller>/5
    Public Function GetValue(ByVal id As Integer) As String
        Return "value"
    End Function

    ' POST api/<controller>
    Public Sub PostValue(<FromBody()> ByVal value As String)

    End Sub

    ' PUT api/<controller>/5
    Public Sub PutValue(ByVal id As Integer, <FromBody()> ByVal value As String)

    End Sub

    ' DELETE api/<controller>/5
    Public Sub DeleteValue(ByVal id As Integer)

    End Sub
End Class

為了區別Controller與一般的類別程式,小喵會在App_Code這個資料夾中,多增加一個【Controllers】的資料夾,然後把Controllers相關的程式檔案放在這個資料夾中。

順便在App_Code中加入兩個資料夾,分別為物件定義的【Infos】與資料存取的【DAOs】

(PS.不過這個步驟不是必需的,算是小喵自己為了區隔類別程式用途的一個方式)

006

 

 

到目前為止,初步的Controller大致已經OK囉,其實還蠻簡單的,只要注意命名在Controller之後不要有數字就可以了

 

Global.asax中設定Route

接著,要來設定Route。在WebForm中不像MVC專案中,已經預先幫我們寫好相關的Route的程式碼,因此這個部分我們必須手工打造,主要是寫在Global.asax裡面。

因此我們先產生一個Global.asax的檔案

一樣在WebForm專案上右鍵→加入→加入新控制項,選擇【全域應用程式類別】,這部分會產生Global.asax的檔名,這部分我們就不做更動,依照原來的【Global.asax】來處理。

 

007

 

Imports相關的命名空間

在Global.asax裡面,加入Imports 【System.Web.Routing】與【System.Web.Http】這兩個命空間,並且在Application_Start的事件中,加入Route的這段程式碼如下:


<%@ Application Language="VB" %>
<%@ Import Namespace="System.Web.Routing" %>
<%@ Import Namespace="System.Web.Http" %>

<script runat="server">

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        ' Code that runs on application startup
        RouteTable.Routes.MapHttpRoute(name:="DefaultApi", _
            routeTemplate:="api/{controller}/{id}", _
            defaults:=New With {.id = System.Web.Http.RouteParameter.Optional})
    End Sub
    
    Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
        ' Code that runs on application shutdown
    End Sub
        
    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        ' Code that runs when an unhandled error occurs
    End Sub

    Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
        ' Code that runs when a new session is started
    End Sub

    Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
        ' Code that runs when a session ends. 
        ' Note: The Session_End event is raised only when the sessionstate mode
        ' is set to InProc in the Web.config file. If session mode is set to StateServer 
        ' or SQLServer, the event is not raised.
    End Sub
       
</script>

到這邊,初步的 Web API 已經完成囉。

 

 

執行測試

最後要讓這個專案在執行時,可以先有個預設的畫面,所以順便加上Default.aspx的首頁WebForm,不過這個步驟不是必要的。

執行後首先是顯示Default.aspx的畫面。我們試著把api的路徑輸入進去

http://localhost:28356/api/values

 

在Chrome裡面可以得到如預期的xml內容


This XML file does not appear to have any style information associated with it. The document tree is shown below.
<ArrayOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <string>value1</string>
        <string>value2</string>
</ArrayOfstring>

 

然後我們在PostMan裡面測試一下,看看api的部分是否能夠正常

得到如預期的json


[
    "value1",
    "value2"
]

 

以上小喵把過程筆記一下,順便提供大家參考~

 


以下是簽名:


Microsoft MVP
Visual Studio and Development Technologies
(2005~2019/6)