代码之家  ›  专栏  ›  技术社区  ›  Erx_VB.NExT.Coder

Web服务中的视图状态?这有可能吗?

  •  4
  • Erx_VB.NExT.Coder  · 技术社区  · 15 年前

    根据我的研究,这是不可能的…除非我写一个大黑客(erk)来绕过它…我想知道这是否可能,因为你们中的一些人可能有更多的信息。我理解这与页面模式背道而驰,但是它确实应该是可访问的…有什么想法吗?

    讨厌使用cookie,因为信息会被更新,并反映出在一次完整的往返旅行后集合中的真实值(所以总是1次往返延迟)。我只是在存储一个数组…会话可以在WebServices中使用,但确实不希望将服务器加载得太多,尽管它可能只有半KB…也许我太偏执了?

    如果不使用会话状态(我目前正在使用cookie)值得麻烦的话,我们会感谢您的任何建议,感谢您使用viewstate。

    5 回复  |  直到 15 年前
        1
  •  3
  •   dcp    15 年前

    为什么不使用应用程序缓存?为了这个目的它工作得很好。

    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);
            }
        }
    
        2
  •  2
  •   RickNZ    15 年前

    不,不能将ViewState与Web服务一起使用。视图状态要求隐藏 <input> 字段和HTTP回发。Web服务不支持输入字段。

    由于viewstate需要对数据进行编码并将其再次发送到客户机,因此它的效率并不比cookie高,cookie是由Web服务支持的,因为它们是在协议级别实现的,而不是作为类似HTML的viewstate的一部分实现的。

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

        3
  •  1
  •   Erx_VB.NExT.Coder    15 年前

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

        4
  •  0
  •   Cheeso    15 年前

    不,viewstate与将浏览器用作HTTP客户机紧密耦合。

    对于WebServices,您有两个选择:让客户机跟踪会话的状态,或者让服务器跟踪它。

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

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


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

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

    另一方面,服务器管理状态意味着在服务器上为每个“会话”或“会话”保留状态信息。如果服务器正在做,客户机不一定需要跟踪信息。客户机只是向服务器提供一个令牌(或者cookie,如果您愿意的话),服务器使用它作为状态表中的查找键。服务器主要负责验证代表客户机保留的所有状态。

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

        5
  •  0
  •   terR0Q    15 年前

    您不能在Web服务中使用viewstate(或者可能是在大量不必要的努力工作之后),但是作为替代方法,您可以使用会话状态。使用EnableSession值为每个WebMethod启用会话状态:

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

    更多信息 here 在MSDN上。