我的公司希望更新传统的visual basic 6 / classic asp代码。我们无法访问visual basic 6编译器,因此使用Visual Studio 10并将visual basic 6代码重新编译为VB.NET类似乎是个好主意。通过一些小的修改编译了所有内容,我们将其注册为从经典asp中调用的com对象。
现在我们尝试从asp服务器访问全局变量。在Google上进行广泛搜索后,提到的唯一方法是使用System.Web.HttpContext.Current
或System.Web.HttpContext.Current.Application
。但是,这似乎不起作用。
以下是导致错误的代码。我们已导入System
和System.Web
。
Public Function DoSomethingUseful() As String
Dim objCurrent As System.Web.HttpContext
DoSomethingUseful = Nothing
objCurrent = System.Web.HttpContext.Current
If objCurrent Is Nothing Then
Throw New Exception("No Context.") '<--- THIS EXCEPTION IS THROWN
End If
问题是我们无法获取http上下文的当前实例并抛出异常。我所看到的每个例子都表明行objCurrent = System.Web.HttpContext.Current
应该有效,但事实并非如此。 也许是因为我们没有使用ASP.NET?如果没有,那么为什么它不起作用?
答案 0 :(得分:2)
是的,这是因为你没有使用ASP.NET。
尽管名称听起来相似,并且在某种程度上类似于设计选择,但ASP.NET和“经典”ASP之间没有任何关系。它们是完全独立的环境。
要直接访问ASP上下文对象(不是应用程序中甚至不存在的类似命名的ASP.NET上下文对象),您的对象必须是已注册的COM +对象,因此:
System.EnterpriseServices.ServicedComponent
* 然后,您可以从COM + ObjectContext检索ASP对象(应用程序,服务器,请求,响应,会话)。 您的代码看起来像这样:
objCurrent = System.EnterpriseServices.ContextUtil.GetNamedProperty("Application")
还有一些属性可以添加到类中以简化代码的部署,但这有点超出了这个问题的范围。
供您参考:
* 如果这是一个硬性要求,我不记得100%。它实际上可能取决于对象实际使用COM +做了什么。