1

我们有许多经典的 ASP 网站,它们以标准方式使用 VB6 DLL (COM) 对象来实现其功能。DLL 是 regsvr32 的,页面使用 Server.CreateObject 在 DLL 中创建必要对象的实例,这反过来触发正在创建的对象的 OnStartPage 函数,传入 ScriptingContext,然后我们使用它来获取 Request (查询字符串、表单)信息、读取/更新会话信息和读取/写入 cookie 信息(等)。为澄清起见,您使用 ScriptingContext 更新/存储 cookie 值的方式是

objSC.Response.Cookies(Key) = Value

在准备对代码库进行完整的 .Net 大修时(作为第一步),我们通过 .Net 2008 VB 升级工具运行代码,该工具进行了一些小的代码更改,设置了对互操作库的引用(对于ADODB、ASPTypeLibrary、CDO 等)并添加必要的属性以允许 .Net 对象向 COM 公开,并且在升级工具留下的注释 (todos) 的指导下到处进行一些调整后,代码是可编译的,除了对于任何尝试使用上述代码更新/存储 cookie 的东西,现在通过 ASPTypeLibrary(互操作),Response.Cookies 集合是只读的(现在没有明显的方法来编写 cookie)。

如果我注释掉有问题的代码行,代码编译,我需要做的就是在 GAC 中注册这个新的 .Net DLL(它是互操作 DLL),使用 regasm 通过 COM 注册它,经典的 ASP 站点继续就像什么都没发生一样工作(除了写 cookie),使用 Server.CreateObject 创建它认为是 COM 对象,触发对 OnStartPage 的调用,传入 ScriptingContext。

因此,尽管代码库已“升级”到 .Net,但它使用了许多互操作库来继续像以前一样工作,包括使用 ASPTypeLibrary.ScriptingContext 对象,因为这是经典的 ASP 管道所公开的内容。

有谁知道如何在这种情况下编写/存储 cookie?

4

1 回答 1

3

需要将 cookie 项转换为IWriteCookie界面。然后它将是可写的。

Imports ASPTypeLibrary
Public Class Test
    Private oContext As ASPTypeLibrary.ScriptingContext
    Private oResponse As ASPTypeLibrary.Response
    Public Sub OnStartPage(e As ScriptingContext)
        oContext = e
        oResponse = oContext.Response
        With CType(oResponse.Cookies("fromdotnet"), IWriteCookie)
            .Item = String.Format("hello from .Net : {0}", Date.UtcNow())
            '.Domain = ""
            '.Path = "/"
            '.Secure = False
        End With
    End Sub
End Class

您可能想查看其他接口,例如IReadCookie,IStringListIRequestDictionary

请注意:

完全信任直接调用方。该成员不能由部分信任的代码使用。

还有另一种选择:ContextUtil.GetNamedProperty 方法

System.EnterpriseServices.ContextUtil.GetNamedProperty("Response").Cookies("fromdotnet") = "hello"
于 2012-04-27T13:26:05.007 回答