IronPython for ASP.NET 的 CTP 已經發布有一段時間了,我們在看了官方提供的範例之後,相信對一個 ASP.NET 應用程式中完全使用 IronPython 開發還是有一些擔心的。畢竟目前僅僅是 CTP 版本,並且缺乏 Visual Studio 的 Intellisence 的支援,在調試方面也有一些不足。
不過,今天我做了一些實驗,發現可以在已有的 C# 的 ASP.NET 項目中引入 IronPython,而不會影響到原先程式的功能,這樣,我們就可以混合使用 C#, IronPython 兩種語言來開發 ASP.NET 了。
具體的步驟是這樣的:
1. 首先,我們用通常的方式建立一個 C# 的 ASP.NET website 項目,或者 Web Application Project. 這兩種我都做過實驗,並且都可以支援 IronPython. 下面我就拿 Web Application Project 來舉例。
2. 然後,添加對 IronPython.dll, IronMath.dll, Microsoft.Web.IronPython.dll 三個 dll 的引用。這三個 dll 都可以在官方發布的 IronPython for ASP.NET 例子裡找到。
3. 在 web.config 中添加對 IronPython 語言的一些支援。
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<!-- 修改頁面的 Parser 以便支援 IronPython -->
<pages pageParserFilterType="Microsoft.Web.IronPython.UI.NoCompileCodePageParserFilter" compilationMode="Auto" />
<authentication mode="Windows" />
<compilation debug="false">
<assemblies>
<add assembly="Microsoft.Web.IronPython, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</assemblies>
</compilation>
<!-- 添加 httpModule -->
<httpModules>
<add name="DynamicLanguageHttpModule" type="Microsoft.Web.IronPython.DynamicLanguageHttpModule"/>
</httpModules>
<!-- 添加用於處理 python 程式的 http handler -->
<httpHandlers>
<add path="Web_*.py" verb="*" type="Microsoft.Web.IronPython.SimpleHandler" />
<add path="*.py" verb="*" type="System.Web.HttpForbiddenHandler" validate="true" />
</httpHandlers>
</system.web>
</configuration>
上面的檔案中我做了一點注釋。關於詳細的原理描述,請參閱我翻譯和摘要的白皮書。想瞭解詳細原理的朋友,可以用 Reflector 查看 Microsoft.Web.IronPython.dll,會有很多收穫的。
4. 在項目下添加 App_Script 檔案夾。
然後你就可以在這下面添加一些 .py 檔案了。其作用就像 App_Code 一樣。
在這個 demo 裡面,我寫了一個簡單的 foo.py:
def Foo():
return 'foo'
5. 現在,可以用 IronPython 建立頁面了。但是由於當前建立的是 C# 類型的項目,我們有一些動作需要手工來調整。
首先添加一個普通的 WebForm,比如命名為 ipy1.aspx, 然後將其 .aspx.cs 和 .aspx.designer.cs 檔案刪除。下面我們需要對 ipy1.aspx 的 Page Directive 做一些調整:
<%@ Page Language="IronPython" Codebehind="ipy1.aspx.py" %>
接下來,我們手工給這個頁面附加後台代碼檔案 ipy1.aspx.py,需要注意的是,用 IronPython 建立的 aspx 頁面和後台代碼檔案之間,並不是類的繼承關係。關於這一點,在白皮書中也有詳細的描述。
這個檔案的內容如下:
from System import Random
import foo
def Page_Load():
Response.Write(foo.Foo())
這裡我們引用了剛才定義的 foo.py 模組中的函數。
6. 開啟 IE 看一下:
同時,在這個項目下用 C# 編寫的程式不受任何影響:
通過上面的例子可以看到,在我們對 IronPython for ASP.NET 仍然不夠放心的情況下,可以通過這種方法,在已有的應用程式中逐步使用 IronPython,來簡化一些常規頁面開發過程!(毫無疑問,IronPython 是簡單的,不是嗎? )
這裡附上例子的代碼。