1

標準的な方法で機能するために VB6 DLL (COM) オブジェクトを使用する従来の ASP Web サイトが多数あります。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) に基づいて、あちこちでいくつかの微調整を行った後、コードはコンパイル可能になります。 ASPTypeLibrary (Interop) を介して上記のコードを使用して現在のように Cookie を更新/保存しようとした場合、Response.Cookies コレクションは読み取り専用です (現在 Cookie を書き込む明確な方法はありません)。

問題のあるコード行をコメントアウトすると、コードがコンパイルされ、この新しい .Net DLL (および相互運用 DLL) を GAC に登録し、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、などIStringListの他のインターフェイスを確認することもできます。IRequestDictionary

次の点に注意してください。

直接の呼び出し元に対する完全な信頼。このメンバーは、部分的に信頼されたコードでは使用できません。

別のオプションがあります: ContextUtil.GetNamedProperty メソッド

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