如何从WebMethod中访问全局变量

本文关键字:访问 全局变量 WebMethod | 更新日期: 2023-09-27 18:10:52

我有以下全局变量:

private ArrayList listSelectedUnavailables
    {
        get
        {
            return (ArrayList)ViewState["listSelectedUnavailables"];
        }
        set
        {
            ViewState["listSelectedUnavailables"] = value;
        }
    }

我可以在webform的每一个过程中使用它。

然而,我需要在一个WebMethod中使用它,我在同一个WebForm中,但它似乎没有识别任何全局变量。所以:

如何从WebMethod访问全局变量?

如何从WebMethod中访问全局变量

您将值存储在Viewstate中,该值对WebMethod不可用,请尝试使用'Session'变量代替。

 private ArrayList listSelectedUnavailables
    {
        get
        {
            return (ArrayList)Session["listSelectedUnavailables"];
        }
        set
        {
            Session["listSelectedUnavailables"] = value;
        }
    }

一个ViewState属性依赖于有一个页面(.aspx)发回一个视图状态,这就是你的"变量"存储的地方。WebMethod不包含完整的页面回发(如果有回发的话),因此没有视图状态供它读取。相反,您可能希望使用会话变量,如:

    private ArrayList listSelectedUnavailables
    {
        get
        {
            return (ArrayList)Session["listSelectedUnavailables"];
        }
        set
        {
            Session["listSelectedUnavailables"] = value;
        }
    }

会话将变量存储在web服务器的内存中(但与特定的浏览器会话相关)。这有它自己的缺点,比如对工作进程重置不稳定,负载平衡的考虑,等等。

你不能在web方法中访问非静态属性。如果您的业务规则允许,您应该使用静态属性

可以。VB .net示例_公共共享函数LoadController(ByVal serial As String) As String

    ' sample 1: server object
    ' •————————————————————————————————————————————————————•
    ' Crear un objeto server, porque desde un webmethod no se puede acceder directamente....
    ' •————————————————————————————————————————————————————•
    Dim objServer As System.Web.HttpServerUtility
    objServer = HttpContext.Current.Server
    Dim lAplicacion As New Aplicacion(objServer.MapPath("~"))
    Return objServer.MapPath("~") ' ---> P:'Projects'WebApplicationServer'WebApplication'
    ' •————————————————————————————————————————————————————•

    ' sample 2: local variable
    ' •————————————————————————————————————————————————————•
    ' Acceder a variables de sesion 
    ' •————————————————————————————————————————————————————•
    ' Crear un objeto Session (visible solo al uaurio actual), porque desde un webmethod no se puede acceder directamente....
    ' Crear la variable = Session("objSession") = "Esto es una variable de sesion"
    Dim objSesion As System.Web.SessionState.HttpSessionState
    objSesion = HttpContext.Current.Session
    If objSesion.Item("objSession") Is Nothing Then
        Return "No existe la variable local"
    Else
        Return objSesion("objSession").ToString
    End If
    ' •————————————————————————————————————————————————————•

    ' sample 3: global variable
    ' •————————————————————————————————————————————————————•
    ' Acceder a variables de aplicacion 
    ' •————————————————————————————————————————————————————•
    ' Crear un objeto Aplicacion (visible a todos los visitantes) , porque desde un webmethod no se puede acceder directamente....
    ' Crear la variable = Application("objAplicacion") = "Esto es una variable global..."
    Dim objAplicacion As System.Web.HttpApplicationState
    objAplicacion = HttpContext.Current.Application

    If (Not objAplicacion("objAplicacion") Is Nothing) Then
        Return objAplicacion("objAplicacion").ToString
    Else
        Return " No existe la variable global..."
    End If
    ' •————————————————————————————————————————————————————•
End Function

//c#示例:[WebMethod(Description = "Proiecto", CacheDuration = 0)]LoadController(string serial){

// sample 1: server object
// •————————————————————————————————————————————————————•
// Crear un objeto server, porque desde un webmethod no se puede acceder directamente....
// •————————————————————————————————————————————————————•
System.Web.HttpServerUtility objServer = default(System.Web.HttpServerUtility);
objServer = HttpContext.Current.Server;
Aplicacion lAplicacion = new Aplicacion(objServer.MapPath("~"));
return objServer.MapPath("~");
// ---> P:'Projects'WebApplicationServer'WebApplication'
// •————————————————————————————————————————————————————•

// sample 2: local variable
// •————————————————————————————————————————————————————•
// Acceder a variables de sesion 
// •————————————————————————————————————————————————————•
// Crear un objeto Session (visible solo al uaurio actual), porque desde un webmethod no se puede acceder directamente....
// Crear la variable = Session["objSession"] = "Esto es una variable de sesion"
System.Web.SessionState.HttpSessionState objSesion = default(System.Web.SessionState.HttpSessionState);
objSesion = HttpContext.Current.Session;
if (objSesion.Item("objSession") == null) {
    return "No existe la variable local";
} else {
    return objSesion("objSession").ToString;
}
// •————————————————————————————————————————————————————•

// sample 3: global variable
// •————————————————————————————————————————————————————•
// Acceder a variables de aplicacion 
// •————————————————————————————————————————————————————•
// Crear un objeto Aplicacion (visible a todos los visitantes) , porque desde un webmethod no se puede acceder directamente....
// Crear la variable = Application["objAplicacion"] = "Esto es una variable global..."
System.Web.HttpApplicationState objAplicacion = default(System.Web.HttpApplicationState);
objAplicacion = HttpContext.Current.Application;

if (((objAplicacion("objAplicacion") != null))) {
    return objAplicacion("objAplicacion").ToString;
} else {
    return " No existe la variable global...";
}
// •————————————————————————————————————————————————————•

}