【问题标题】:ViewState in WebService? Is this possible?WebService 中的视图状态?这可能吗?
【发布时间】:2010-12-29 23:44:18
【问题描述】:

根据我的研究,这是不可能的......除非我写了一个大黑客(erk)来解决它......我想知道这是否可能,因为你们中的一些人可能有更多关于这方面的信息.我知道这会违反页面范式,但它确实应该可以访问......任何想法任何人?

讨厌在信息更新时使用 cookie,并在完整往返后反映集合中的真实值(所以总是有 1 个往返滞后)...我只是真正存储一个数组...会话可以在 web 服务中使用但真的不想让服务器加载太多,虽然它可能只有半个 kb……也许我太偏执了?

任何建议都将不胜感激,如果不使用会话状态的麻烦,我目前正在使用 cookie,更愿意使用视图状态,谢谢。

【问题讨论】:

    标签: c# asp.net vb.net ajax viewstate


    【解决方案1】:

    为什么不使用应用程序缓存呢?它非常适合这个目的。

    public static void AddToCache(string key, Object value, int slidingMinutesToExpire)
    {
            if (slidingMinutesToExpire == 0)
            {
                HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.NotRemovable, null);
            }
            else
            {
                HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(slidingMinutesToExpire), System.Web.Caching.CacheItemPriority.NotRemovable, null);
            }
        }
    

    【讨论】:

    • 谢谢,使用缓存听起来是个好主意,但是由于这是应用程序级别的状态,有没有办法确保特定用户的缓存信息在用户会话到期时自行销毁?所以基本上,让它更像会话状态,但如果需要的话,可以让内存管理系统更早地销毁数据。谢谢
    • AddToCache 方法的第三个参数是slidingMinutesToExpire,它会在x 分钟后自动使应用程序缓存中的项目过期。所以我建议只提供一些值(比如 20 分钟),您的缓存会自动清除,因为任何超过 20 分钟的数据都会自动从缓存中清除。
    • @dcp 太棒了,谢谢你的领导,我想我会拿起我的 asp.net 3.5 书,好好读一读缓存系统,我喜欢 .net :)跨度>
    • 如果此解决方案有帮助,请不要忘记将问题标记为已回答:)。
    • 我今天刚刚登录(到stackoverflow)专门这样做:)
    【解决方案2】:

    不,您不能将 ViewState 与 Web 服务一起使用。 ViewState 需要一个隐藏的 <input> 字段和一个 HTTP 回发。 Web 服务不支持输入字段。

    由于 ViewState 需要对数据进行编码并将其发送给客户端并再次返回,因此它并不比 cookie 更有效,因为它们是在协议级别实现的,因此 Web 服务支持它们,而不是像 ViewState 那样作为 HTML 的一部分.

    或者,您可以使用会话状态,并将信息保存在服务器上。

    【讨论】:

      【解决方案3】:

      只需在会话对象中创建一个缓存对象数组 :) 缓存的 .dispose 也应该从内存中释放会话 :)

      【讨论】:

        【解决方案4】:

        不,Viewstate 与将浏览器用作 HTTP 客户端紧密结合在一起。

        对于网络服务,您有两个选择:让客户端跟踪对话状态,或让服务器跟踪它。

        • 使用服务器会话状态,并传递一个 cookie(HTTP cookie 或 SOAP 信封内的一些类似 cookie 的参数)

        • 要求客户端跟踪、保留并可能将会话状态传输到服务器。


        关于 Viewstate - 它是呈现给用户的页面 的状态,作为一种实现,它与浏览器紧密耦合。当页面显示时,视图状态信息用于填充页面。稍后,当页面上的表单被发布时,相关的表单数据,其中一些可能已经预设了视图状态魔法,然后被传输到服务器。尽管在客户端使用了视图状态,服务器仍需要验证来自客户端的输入。 您可以看到视图状态与一些轻量级的浏览器端填充逻辑相结合是客户端管理用户正在查看的页面状态的一种方式,但服务器不能放弃对会话状态的验证。

        这种方法可以在 Web 服务应用程序中采用,但是由于不依赖于浏览器或特定的演示文稿(或任何演示文稿),因此它是一种动手操作自己的事。客户端应用程序以适合客户端的方式维护和使用任何会话状态。

        另一方面,服务器管理的状态意味着每个“对话”或“会话”都在服务器上保留状态信息。如果服务器正在执行此操作,则客户端不一定需要跟踪信息。客户端只是向服务器提供一个令牌(或 cookie,如果你喜欢的话),服务器将它用作状态表的查找键。服务器主要负责验证代表客户端保留的所有状态。

        由于您使用的是 .NET,因此您可能有兴趣了解 Workflow can be used server-side to track the state of a webservices (WCF) based conversation。这种方法维护 WS 网络协议——它没有规定任何特定的客户端技术或平台。

        【讨论】:

          【解决方案5】:

          您不能在 Web 服务中使用 ViewState(或者经过大量不必要的艰苦工作后可能会:),但作为替代方案,您可以使用会话状态。使用 EnableSession 值为每个 WebMethod 启用会话状态:

          [WebMethod(EnableSession=true)]
          public int SessionHitCounter()
              {
              ...
              }
          

          更多信息 here MSDN。

          【讨论】:

          • 感谢伙伴,但我之前在 web 服务中使用过会话状态 :)... 我认为有一种方法可以进行视图状态,但有很多黑客攻击 :)
          • 我假设它可以从客户端访问,并且只是序列化/反序列化并从客户端返回到具有特定指令的 Web 服务......或其他几种可能性
          • 好吧,您可以尝试我在这里看到的另一个选项:将 ViewState 保存在服务器而不是客户端上 :) 这是一个示例:blogs.msdn.com/alikl/archive/2008/01/02/…
          猜你喜欢
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-23
          • 2011-12-24
          相关资源
          最近更新 更多