解决HttpContext.Current问题

时间:2013-06-13 21:59:58

标签: .net vb.net httpcontext

是的,有很多关于这个问题的帖子,我已经尝试了很多这些建议,但没有一个有效。请不要告诉我这已经被问过了。

我被要求更新与数据库交互的内部网站。它最初是在VS 2003中创建的,我们无法访问它,因此需要将项目升级到VS 2012.我还有最后一个问题需要解决。该站点的原始设计者使用以下代码块来设置环境,以便可以将正确的数据库连接到:

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。这意味着此站点现在在开发环境中爆炸,因为IIS 7及更高版本不再支持HttpContext.Current。

许多建议的修复都谈到将功能移到Application_BeginRequest方法。我不是真的有兴趣每次发出请求都会因为没必要而被解雇,而且它似乎也会导致应用程序出现问题。

我的部分问题是我无法尝试一些建议,因为它们是用C#编写的(我非常熟悉)并且应用程序是用VB编写的(我不太熟悉)。

有人能指出我如何在不使用HttpContext.Current方法的情况下检索DB_Environment变量中保存的域吗?

4 个答案:

答案 0 :(得分:1)

if (System.Environment.MachineName == "xxx")

虽然,这样做的首选方法是拥有一个基本web.config文件,并为您的不同环境创建XLST转换,根据您发布项目的方式更改值。例如,我们有web.config,web.release.config,web.debug.config和web.staging.config。我们为每个环境提供了缓存,输出缓存,调试属性,连接字符串,电子邮件服务器设置等不同的值,并且它们在发布时都被换出。

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    ' Fires when the application is started
    Select Case LCase(System.Environment.MachineName)
        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

您需要找到各种计算机的名称而不是请求的网址才能生效,但这可能是升级旧代码的最快捷方式。

答案 1 :(得分:0)

将代码移动到抽象中。让代码查询HttpContext.Current.Application["DbEncironment"],如果它不存在则存储并返回。这样,它将在首次访问时设置,并在所有其他时间读取。

Public Class DbEnvironment

    Public Function Shared GetEnvironment() As String

        Dim e = HttpContext.Current.Application["DbEnvironment"]

        If (e = Nothing) Then
            Select Case LCase(HttpContext.Current.Request.ServerVariables("SERVER_NAME"))

                Case "localhost", "development_domain"
                    e = "DEVELOPMENT"

                Case "staging_ip", "staging_domain"
                    e = "STAGING"

                Case "external_prod_domain", "external_prod_ip", "internal_prod_domain"
                    e = "PRODUCTION"
           End Select

           HttpContext.Current.Application["DbEnvironment"] = e
        End If

        Return e

    End Function

End Class

现在您需要访问环境调用

DbEnvironment.GetEnvironment()

它将始终有效。你可以把它变成一个属性,如果这更像你的风格。

答案 2 :(得分:0)

如何在应用程序中使用DB_Environment参数?如果它不是太广泛,我建议更改系统以利用web.config transforms。通过执行此操作,您实际上通过调用其“正常”名称(ConnectionSting,MagicPath等)来替换数据库连接字符串/应用程序设置变量,然后您可以通过web.debug.config,web维护这些值。 .release.config等文件。

这样做的好处是你可以将你的应用程序视为一个应用程序,而不是一个“环境X应用程序”,一个错误的配置(或服务器的命名)可能会搞砸,实际上很难维护。

如果你真的需要“解决这个问题”你可以在你的web.config中添加一个叫做“环境”的AppSettings键,利用转换,然后简单地从上面读取上面列出的方法(在1行或2)。这样,您仍然可以维护您的环境设置而无需花哨的编码。

答案 3 :(得分:0)

首先澄清一点:{7}在IIS 7中仍然可用,但它在HttpContext.Current中不可用,因为不一定有来自外部用户的传入请求导致事件触发。

现在,问题是:

您没有说明如何定义Application_Start,但我怀疑它只是一个标准属性,即

DB_Environment

如果是这种情况,您可以通过将DB_Environment更改为具有后备成员变量的只读属性,然后在未设置后备存储属性的情况下执行初始配置,从而轻松无缝地解决问题。在此设计中,它仅在需要时进行初始化,并且仅在外部用户发出请求时才需要,从而确保HttpContext。

这是拟议的设计:

Public Property DB_Environment As String