如何从 WebMethod 访问全局变量?

发布于 2024-12-09 18:54:27 字数 410 浏览 0 评论 0原文

我有以下全局变量:

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

我可以在网络表单的每个过程中使用它。

但是,我需要在同一个 WebForm 中的 WebMethod 中使用它,但它似乎无法识别任何全局变量。那么:

如何从 WebMethod 访问全局变量?

I have the following global variable:

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

I can work with it in every single procedure of the webform.

However, I need to use it in a WebMethod that I have in the same WebForm, but it seems not to identify any of the global variables. So:

How can I access a global variable from a WebMethod?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

怼怹恏 2024-12-16 18:54:27

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

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

You are storing the value in the Viewstate, which will not be available to the WebMethod, try using a 'Session' variable instead.

 private ArrayList listSelectedUnavailables
    {
        get
        {
            return (ArrayList)Session["listSelectedUnavailables"];
        }
        set
        {
            Session["listSelectedUnavailables"] = value;
        }
    }
沉默的熊 2024-12-16 18:54:27

ViewState 属性取决于页面 (.aspx) 回发视图状态,这就是存储“变量”的位置。 WebMethod 不包括整个页面回发(如果有回发的话),因此没有可供读取的视图状态。相反,您可能想要使用会话变量,例如:

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

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

A ViewState property depends on having a page (.aspx) post back a view state, that's where your "variable" is stored. A WebMethod does not include the full page postback (if any post back at all) and so there is no view state for it to read from. Instead you may want to use a session variable like:

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

The session stores the variable in the web server's memory (but related to a specific browser session). This has it's own draw-backs, such as being volatile to a worker process reset, load balancing cosiderations, etc.

や莫失莫忘 2024-12-16 18:54:27

您无法在 Web 方法中访问非静态属性。如果您的业务规则允许您应该使用静态属性

you cannot access a non static property within a web method. if your business rule allows that you should use a static property

烟─花易冷 2024-12-16 18:54:27

是的,你可以。
' VB .net 示例
_
Public Shared Function 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(描述 = "Proiecto", CacheDuration = 0)]
公共静态字符串LoadController(字符串序列)
{

// 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...";
}
// •————————————————————————————————————————————————————•

}

Yes you can.
' VB .net sample
_
Public Shared Function 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# sample:
[WebMethod(Description = "Proiecto", CacheDuration = 0)]
public static string 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...";
}
// •————————————————————————————————————————————————————•

}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文