1

はい、この問題に関する多くの投稿があり、それらの多くで提案を試みましたが、どれも機能しませんでした. これがすでに尋ねられているとは言わないでください。

データベースとやり取りする内部 Web サイトの更新を依頼されました。これはもともと VS 2003 で作成されたもので、もうアクセスできないため、プロジェクトを VS 2012 にアップグレードする必要がありました。最後に修正すべき問題が 1 つあります。サイトの最初の設計者は、次のコード ブロックを使用して環境を設定し、正しいデータベースに接続できるようにしました。

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    ' Fires when the application is started
    Select Case LCase(HttpContext.Current.Request.ServerVariables("SERVER_NAME"))
        Case "localhost", "development_domain"
            DB_Environment = "DEVELOPMENT"

        Case "staging_ip", "staging_domain"
            DB_Environment = "STAGING"

        Case "external_prod_domain", "external_prod_ip", "internal_prod_domain"
            DB_Environment = "PRODUCTION"
    End Select
End Sub

さまざまな環境が IIS 7.5 にアップグレードされています。これは、HttpContext.Current が IIS 7 以降でサポートされなくなったため、このサイトが開発環境で爆発したことを意味します。

提案された修正の多くは、機能を Application_BeginRequest メソッドに移動することについて述べています。リクエストが行われるたびにこれを起動するのは不要なので、あまり興味がありません。また、アプリケーションで問題が発生するようです。

私の問題の一部は、C# (私はよく知っています) でコーディングされており、アプリケーションは VB (私はあまり慣れていません) でコーディングされているため、いくつかの提案を試すことができないことです。

HttpContext.Current メソッドを使用せずにドメインを取得して DB_Environment 変数に保持する方法について、誰かが正しい方向に向けることができますか?

4

4 に答える 4

0

最初に 1 つのポイントを明確HttpContext.Currentにします。IIS 7 では引き続き使用できますApplication_Startが、イベントを発生させる外部ユーザーからの着信要求が必ずしも存在するとは限らないため、IIS 7 では使用できません。

さて、問題に:

がどのように定義されているかは示されていませんDB_Environmentが、それは単なる標準のプロパティであると思われます。

Public Property DB_Environment As String

この場合、バッキング メンバー変数を使用して DB_Environment を読み取り専用プロパティに変更し、バッキング ストア プロパティが設定されていない場合は初期構成を実行することで、簡単かつシームレスに問題に対処できます。この設計では、必要な場合にのみ初期化され、外部ユーザーが要求を行う場合にのみ必要になるため、HttpContext が保証されます。

提案されたデザインは次のとおりです。

Private m_DB_Environment As String = Nothing
Public ReadOnly Property DB_Environment As String
   Get
       ' If we haven't retrieved the setting yet and there is a current context, 
       ' retrieve the appropriate setting
       If m_DB_Environment Is Nothing AndAlso HttpContext.Current IsNot Nothing Then
          Select Case LCase(HttpContext.Current.Request.ServerVariables("SERVER_NAME"))
              Case "localhost", "development_domain"
                  m_DB_Environment = "DEVELOPMENT"

              Case "staging_ip", "staging_domain"
                  m_DB_Environment = "STAGING"

              Case "external_prod_domain", "external_prod_ip", "internal_prod_domain"
                  m_DB_Environment = "PRODUCTION"
          End Select
       End If

       Return m_DB_Environment
   End Get
End Property
于 2013-06-13T22:51:08.297 に答える