2010-10-07 101 views
1

我们正在为大型(遗留)Web应用程序编写经典的ASP。使用WSC(Windows脚本组件)将GUI与业务逻辑分开可以很好地工作; WSC包含业务逻辑,经典的asp用于显示返回的信息。 WSC的返回字符串值,ADO记录集以及某些情况下的vbscript对象。如何在WSC内部调试Python

目前我们正试图从使用WSCs内部的VBscript切换到Python(pyscript),以至少使用的语言是现代的,并且具有更多现代功能(如SOAP,ORM解决方案或Memcached)。

使用在传统的ASP Python代码工作正常使用pywin32和注册的Python作为脚本语言,但我们遇到了两个基本问题:

  1. 在WSC,使用“工具”标签应所有IIS的标准对象(服务器,会话,请求,响应等)都可用于WSC中的代码。使用Python时,它似乎不起作用。也许我正在使用不正确的语法,或者我需要Python代码中的一些额外定义,但我似乎无法弄清楚如何到达这些对象。 更多关于WSC的信息:http://aspalliance.com/414

  2. 当ASP页面发生错误时,回溯显示在浏览器中,一切正常。但是,如果WSC内部发生错误,则很少或没有反馈给浏览器。当使用VBscript时,Windows允许开发人员选择一个调试器,并且(在我们的例子中)Visual Studio启动并向我们显示错误和包含错误的行。只要你在本地进行开发(所以本地开发机器运行IIS)就可以工作。 当使用Python,什么也没有发生,只是在浏览器中一个非常模糊的信息,即:

错误“80020009” 异常发生。

我已经尝试了解决这个问题的不同方法;我试过导入win32traceutil并打开一个跟踪收集器窗口。奇怪的是它会捕获我所有的print()语句,但不是Python错误消息。它几乎看起来像stdout被捕获,但stderr不是。如果在Python中有任何其他方法来重定向或显示错误消息,我也想尝试一下。我甚至考虑过使用一个非常大的try..except,但除了非常糟糕的风格外,WSC包含一堆单独的函数,它将意味着在每个函数中都实现try..except。我真的不想去那里。

如果任何人都可以帮助我解决这两个问题(尤其是nr 2是我们公司使用Python的一大亮点),我们将不胜感激。如果还有其他方法可以使Python追溯以某种方式显现,那将是一大进步。

顺便说一句,我已经发布了这个问题到不同的邮件列表,包括pywin32邮件列表,但直到现在没有人能够帮助我们。

所以,帮我计算器,你是我唯一的希望......

感谢所有,

埃里克

下面我有一个非常简单的例子,包括ASP页和的Python WSC,ASP页面实例化WSC并从中调用一些函数。 Response.write不起作用,因为由于某种原因,Response对象不能被使用(问题编号:1),如果Python代码中有错误,浏览器将不会显示traceback或任何明确的消息(问题2)。 代码需要被IIS下ofcourse运行,Python和PyWin32需要安装(或ActiveState的Python发行,这将已经包括PyWin32)

python.wsc:

<?xml version="1.0" encoding="Windows-1252" ?> 
<component> 
<?component error="true" debug="true"?> 
<registration 
     description="python" 
     progid="python.WSC" 
     version="1.00" 
     classid="{F236F59E-3F6F-44EA-A374-DBFA9F90ECB3}" 

</registration> 
<public> 
     <method name="testmethod"> 
     </method> 
     <method name="helloWho"> 
       <PARAMETER name="who"/> 
     </method> 
</public> 

<implements type="ASP" id="ASP"/> 

<script language="Python"> 
<![CDATA[ 
def testmethod(): 
     Response.Write('output of results converted to a string') 

def helloWho(who): 
     return "Hello "+who+"!" 
]]> 
</script> 
</component> 

ASP页:

<%@ Language=VBscript %> 
<% 
     set pythonwsc= GetObject("script:"&Server.MapPath("./python.wsc")) 
     response.write(pythonwsc.helloWho("world")&"<br>") 
     pythonwsc.testmethod() 
%> 

回答

0

为#2,您需要捕捉异常在调用组件的VBScript。 WSC只是一个COM组件。暂时忽略当你调用WSC时有python在运行。这只是一个COM组件。

调用该组件时可能发生错误。调用可能失败的组件时,使用错误处理是一种很好的做法。在VBSCript中,这意味着在错误恢复或其他。

在Javascript中,它意味着一个try..catch子句。

好奇:为什么在WSC中使用python?为什么不只是Jscript - 更主流,也相当现代。

+0

嗨切谢,谢谢你的回答。 你的意思是处理ASP页面或WSC中的错误?恐怕ASP页面并不能让我知道WSC中的错误。处理WSC中的Python代码中的错误是可行的,但是在编码/调试时,这并不实际。 – 2010-10-26 07:28:32

+0

至于为什么Python:Python有一些非常成熟的(网络)框架,在我们当前的项目中使用它可以让我们熟悉该语言,并在以后在其他项目(网页或桌面)中使用它。 Javascript仍然主要是客户端语言。我听说过服务器端的JavaScript实现,但我认为总的来说,Python是一个更安全的选择。 – 2010-10-26 07:34:27

+0

您可以处理ASP页面和WSC中的错误。 Javascript有try/catch,使用它,你可以在WSC的首选错误日志中记录错误。至于“服务器端JavaScript实现” - 如何ASP? ASP最初的两种语言是VBScript和JScript。 JScript仍然受支持。我期望在服务器端使用单一语言(在页面呈现代码和WSC中使用Javascript)可以节省一些麻烦。 – Cheeso 2010-11-01 02:43:05