经典的ASP,Cookies和VB.NET COM +对象

时间:2011-02-08 21:34:28

标签: vb.net com cookies asp-classic vb6-migration

这很纠结。

我已经获得了一个用经典ASP编写的网站,其中很多幕后工作都是通过Server.ObjectCreate()实例从ASP页面调用的VB6 COM +对象中完成的。对于这个版本,VB6例程已经转换为VB.NET,只需在其上运行Visual Studio 2003转换器工具,然后将该解决方案文件升级到VS 2008.因此,有一千零一个可能的错误来源。

其中一个给我带来麻烦的VB6模块按以下格式清除了一堆Response Cookie:

ASPResponse.Cookies("SysUserCode") = ""

ASPResponse定义为:

Private ASPResponse As ASPTypeLibrary.Response

并通过以下方式设置了对象激活:

Set ASPResponse = objContext("Response")

在这个模块的VB.NET转换中,这些行变为

ASPResponse = ContextUtil.GetNamedProperty("Response")

ASPResponse.Cookies("SysUserCode")() = ""

(注意额外的一对括号。不是很多VB人,我不确定该语法是什么意思。)

好的,这是一个问题:当这个代码在我的机器上执行时,该行给出了VB错误13,其中Error.Description为“指定的强制转换无效”。咦?什么演员?

顺便说一下,这个模块在同事机器上运行良好,他看不出我的机器配置和他的相关组件有什么不同。

我在这里完全不知所措。谷歌搜索它给了我一些关于VB.NET cookie或VB.NET的COM组件的东西,但没有任何与经典ASP cookie相关的东西。

2 个答案:

答案 0 :(得分:1)

时...

Private ASPResponse As ASPTypeLibrary.Response
Set ASPResponse = objContext("Response") 

... 发布 VB.NET转换?如果是这样,您需要将objContext("Response")显式转换为ASPTypeLibrary.Response对象。如果启用了Option Strict,这尤其适用。 e.g。

ASPResponse = CType(objContext("Response"), ASPTypeLibary.Response)

此外,VB.NET不支持 Set Let 语句。

答案 1 :(得分:0)

这可能与COM组件的主机激活方式有关。我读了另一篇文章([Klaus H. Probst])1,表明为了访问Response元素,COM组件必须作为库(而不是Server)激活,以便它运行在ASP进程空间。所以我尝试将Component的托管应用程序的Activation类型更改为库,重置和重建几次,现在我能够访问Response的Cookies元素。但是,我的同事仍在将主机应用程序作为服务器运行,并且没有问题。