2013年7月10日 星期三

[webapi]微軟 ASP.NET Web API Self Host 的應用(1)

(本篇程式是用 vb.net 寫成)

因為瀏覽器的能力大增,現在許多 GUI 的彩色糖果(新功能)都在瀏覽器上簡單易用。憑藉著 javascript 及瀏覽器就能做到原生桌面程式的事,而且不用在 c++ 裡打滾,也不用在意平台,真是一個全新的世界的來臨。

最早,mozilla 就試著使用 XUL 想要進入桌面程式,Google 也趁著 chrome 已融入大家的生活中的時機,推出 Chrome App。XUL 算是只使用前端瀏覽器引擎配合自有原生執行程式,Chrome App 則是採取與chrome 共生的執行環境來使用作業系統資源。接下來,有其他的人,想出自帶 server 端的方式來實現使用瀏覽器當 GUI 的解決方法,例如 app.js,利用 node.js 來當做程式的後端。

在黑暗執行緒看到的兩篇文章[1], [2]。才知道微軟出了個套件 ASP.NET Web API Self Host,可以當做 server 端的程式,可寫成 Console 程式,也可以寫成 WinForm。而這套件正好可以與 Chrome App、app.js 所提供的後端支援的功能相同。於是,我也來試試看是否能做出些什麼 app 來…。因為黑大已經示範了寫成 console 的程式,我就來試試 WinForm 的程式。黑大用的是 c#,我就來試試 vb.net 吧。

我還是一步步把畫面剪下來,免得以後我自己忘記,所以落落長。初學者才需要這樣。

首先,開啟一個 WinForm 的專案。

image

先存檔,然後開啟 NuGet。安裝 ASP.NET Web API Self Host。

image

以下是看到相依套件的授權。

image

實際安裝的套件如下:

image

接下來,安排程式碼。首先,在 Form1.vb 的最前面,加入 imports: (這樣可以少打幾個字。)

Imports System.Web.Http
Imports System.Web.Http.SelfHost

然後,加入兩個 form1 的變數,如下:

Dim config As HttpSelfHostConfiguration
Dim httpserver As HttpSelfHostServer

然後,加入一個 sub,是啟動 host 的部份,如下:

Sub hostinit()
    config = New HttpSelfHostConfiguration("http://localhost:32767")

    config.Routes.MapHttpRoute("API", "{controller}/{action}/{id}", New With {.id = RouteParameter.Optional}) ' vs2010 just can not IntelliSense....

    httpserver = New HttpSelfHostServer(config)

    'http://blog2.darkthread.net/post-2013-06-04-self-host-web-api.aspx
    httpserver.OpenAsync.Wait()
End Sub

選擇 Form1 的 New 事件,加入 hostinit(),使得 Form1 一出現就會接受來自 localhost:32767 的 request

Public Sub New()

     ' 此為設計工具所需的呼叫。
     InitializeComponent()

     ' 在 InitializeComponent() 呼叫之後加入任何初始設定。
     hostinit()
End Sub

在 Form1 的結束時,也要關掉 32767 的監聽。

Protected Overrides Sub Finalize()
    httpserver.CloseAsync.Wait()
    MyBase.Finalize()
End Sub

最後,也要加上 Controller 的物件,BlahController 來接受 request。(不要放在 Form1 裡面。我是放在另一個檔案 BlahController.vb)

Imports System.Web.Http
Public Class BlahController
    Inherits ApiController
    <HttpGet()> Public Function getDate() As String
        Return System.DateTime.Today.ToString("yyyy/MM/dd")
    End Function
End Class

完成了程式碼的安排後,還要記得黑大提醒的一件事,在 Windows 7、Windows 2008 這些作業系統開發時,因為權限控管較嚴,開 port 監聽需要較高權限來開放。我選擇了用 netsh 這個方法來開放權限。先開啟命令列(記得要用 administrator 權限開啟命令列)

netsh http add urlacl url=http://+:32767/ user=machine\username

記得上面的 machine 及 username 要換成你的電腦名稱及當下登入的使用者名稱。

接下來就可以試著啟動程式,開啟瀏覽器,輸入:

http://localhost:32767/Blah/getDate

如果瀏覽器的是 IE,會是這樣的結果:

image

按下開啟,內容是:

image

如果是用 chrome 的話,則會是:

image

 

出現了兩個不同的回傳內容。

 

接下來開始跟黑大不一樣了。

 

我們要開始問,如果我們要能夠服務 .html, .js, .css, .jpg, .png, .gif ... 等等一般的 web server 可以服務的檔案,該怎麼辦?

 

參考

1. 黑暗執行緒,不用IIS也能執行ASP.NET Web API,http://blog2.darkthread.net/post-2013-06-04-self-host-web-api.aspx
2. 黑暗執行緒,【範例】呼叫Self-Hosted ASP.NET Web API,http://blog2.darkthread.net/post-2013-06-05-post-to-web-api.aspx

3. http://www.dotnetcurry.com/ShowArticle.aspx?ID=896

4. http://stackoverflow.com/questions/17450846/is-it-possible-to-serve-a-web-page-from-a-self-hosted-web-api-in-a-windows-servi

5. https://github.com/darrelmiller/HypermediaApiSite

6. GetManifestResourceStream http://msdn.microsoft.com/en-us/library/System.Reflection.Assembly.aspx

7. return 405 while get .js http://stackoverflow.com/questions/17170277/jquery-get-returns-404-undefined-from-self-hosting-web-api

8. http://www.codeproject.com/Articles/455565/How-to-access-Manifest-Embedded-resources-from-an


類似 app.js 的平台,我試過的有:

google chrome packaged apps

appjs

還沒試過的平台:

node-webkit https://github.com/rogerwang/node-webkit

xul https://developer.mozilla.org/en/docs/XUL

Appcelerator Titanium http://en.wikipedia.org/wiki/Appcelerator_Titanium

Ember.js http://emberjs.com/

NACL https://developers.google.com/native-client/

 

VB.NET 的 IntelliSense 看不到 .Routes.MapHttpRoute 但 CS 可以。又多了一個換 CS 的理由。(逃)
http://forums.asp.net/t/1819836.aspx/1

沒有留言:

張貼留言