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 例子里找到。

逐步改用 IronPython 开发你的 ASP.NET 应用程序_c#

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 一样。

逐步改用 IronPython 开发你的 ASP.NET 应用程序_microsoft_02

在这个 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 看一下:

逐步改用 IronPython 开发你的 ASP.NET 应用程序_c#_03

同时,在这个项目下用 C# 编写的程序不受任何影响:

逐步改用 IronPython 开发你的 ASP.NET 应用程序_应用程序_04

通过上面的例子可以看到,在我们对 IronPython for ASP.NET 仍然不够放心的情况下,可以通过这种方法,在已有的应用程序中逐步使用 IronPython,来简化一些常规页面开发过程!(毫无疑问,IronPython 是简单的,不是吗? :) )

这里附上例子的代码