COM可见.NET类在经典asp中使用时无法获取System.Web.HttpContext.Current

时间:2014-07-16 15:52:17

标签: asp.net asp-classic com migration

我的公司希望更新传统的visual basic 6 / classic asp代码。我们无法访问visual basic 6编译器,因此使用Visual Studio 10并将visual basic 6代码重新编译为VB.NET类似乎是个好主意。通过一些小的修改编译了所有内容,我们将其注册为从经典asp中调用的com对象。

现在我们尝试从asp服务器访问全局变量。在Google上进行广泛搜索后,提到的唯一方法是使用System.Web.HttpContext.CurrentSystem.Web.HttpContext.Current.Application。但是,这似乎不起作用。

以下是导致错误的代码。我们已导入SystemSystem.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?如果没有,那么为什么它不起作用?

1 个答案:

答案 0 :(得分:2)

是的,这是因为你没有使用ASP.NET。

尽管名称听起来相似,并且在某种程度上类似于设计选择,但ASP.NET和“经典”ASP之间没有任何关系。它们是完全独立的环境。

要直接访问ASP上下文对象(不是应用程序中甚至不存在的类似命名的ASP.NET上下文对象),您的对象必须是已注册的COM +对象,因此:

  • 您的班级必须继承自System.EnterpriseServices.ServicedComponent *
  • 在Windows 7/2008及更高版本中,您必须启用组件服务中的“允许IIS内部属性”,就像在VB6中一样(打开\组件服务\我的电脑\ COM + Applications \ YourComPlusApp \ Components;选择所有需要ASP对象的对象;右键单击;单击Properties;转到Advanced选项卡。

然后,您可以从COM + ObjectContext检索ASP对象(应用程序,服务器,请求,响应,会话)。 您的代码看起来像这样:

objCurrent = System.EnterpriseServices.ContextUtil.GetNamedProperty("Application")

还有一些属性可以添加到类中以简化代码的部署,但这有点超出了这个问题的范围。

供您参考:

* 如果这是一个硬性要求,我不记得100%。它实际上可能取决于对象实际使用COM +做了什么。